折腾了两天,终于把这个做成了能打包成浏览器加载的插件了
姑且在这里记录一下,也算是前端学习笔记
目录结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| 📦src ┣ 📂assets ┃ ┣ 📂icon ┃ ┃ ┣ 📜128.png ┃ ┃ ┣ 📜16.png ┃ ┃ ┗ 📜48.png ┃ ┗ 📂styles ┃ ┃ ┣ 📜global.scss ┃ ┃ ┣ 📜options.scss ┃ ┃ ┗ 📜popup.scss ┣ 📂background ┃ ┗ 📜background.ts ┣ 📂components ┃ ┣ 📂ui ┃ ┃ ┗ 📜button.vue ┃ ┣ 📜options.vue ┃ ┗ 📜popup.vue ┣ 📂options ┃ ┣ 📜options.html ┃ ┗ 📜options.ts ┣ 📂popup ┃ ┣ 📜popup.html ┃ ┗ 📜popup.ts ┣ 📂scripts ┃ ┣ 📂base ┃ ┃ ┣ 📂enums ┃ ┃ ┃ ┗ 📜url.ts ┃ ┃ ┗ 📜extConfig.ts ┃ ┣ 📜hotKeyMenu.ts ┃ ┣ 📜ui.ts ┃ ┣ 📜util.ts ┃ ┗ 📜viv.ts ┣ 📂typings ┃ ┣ 📜global.d.ts ┃ ┗ 📜hotKeyMenu.d.ts ┣ 📂_locales ┃ ┣ 📂en ┃ ┃ ┗ 📜messages.json ┃ ┣ 📂ja ┃ ┃ ┗ 📜messages.json ┃ ┗ 📂zh_CN ┃ ┃ ┗ 📜messages.json ┣ 📜btools.ts ┣ 📜manifest.json ┗ 📜vue-shims.d.ts
|
作用
不清楚这么分好不好,姑且来说说它们都有什么作用
_locales 存的是多语言文件
assets 是图标和 sass 文件,图标会在打包时直接复制到编译后的目录
components 放的是 vue 组件,目前只有俩,之后随着需要添加
background 插件的 background.js 所需要的,这个不需要页面所以只放了一个 .ts
options 插件的配置页面
popup 插件右上角弹出页面
scripts 插件功能所需要的代码文件,里面那些 ui 啥的我还没想好怎么写,姑且先放着
btools.ts 插件功能的入口文件,这个文件会引入scripts中的所有插件功能相关的文件
manifest.json 插件配置文件
具体写法
这些是怎么打包成一个插件的呢,用popup举个例子
首先是webpack.config.js指定好入口文件
1 2 3 4 5 6
| entry: { btools: './src/btools.ts', background: './src/background/background.ts', popup: './src/popup/popup.ts', options: './src/options/options.ts', },
|
入口文件是popup.ts
1 2 3 4 5 6 7 8 9 10 11 12
| import Vue from 'vue'; import Popup from '@components/popup'; import '@styles/popup';
export default new Vue({ data: { test1: 'World' }, components: { Popup }, render: h => h(Popup) }).$mount('#app');
|
这里面引入了 Vue、popup.vue、popup.sass
然后 popup.vue 是这么写的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <template> <div> <h1>{{ message }}</h1> </div> </template>
<script lang="ts">
import { Vue, Component } from 'vue-property-decorator';
// @Component 修饰符注明了此类为一个 Vue 组件 @Component export default class Popup extends Vue { // 初始数据可以直接声明为实例的 property message = 'Popup'; }
</script>
|
popup.sass没写啥就不用看了
最后页面会输出到popup.html上
1 2 3 4 5 6 7 8 9 10 11
| <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>popup</title> </head> <body> <div id="app"></div> </body> </html>
|
这个HTML文件是个模板,使用插件html-webpack-plugin,最后会打包到编译后的目录,这里指定了chunks是只让这个页面引入options.js
1 2 3 4 5 6 7 8 9
| new HtmlWebpackPlugin({ filename: 'options.html', template: './src/options/options.html', minify: { collapseWhitespace: true, removeComments: true }, chunks: ['options'] })
|
最后配置好manifest.json,就可以直接用浏览器导入插件看效果了

manifest.json可以用一个叫write-json-webpack-plugin,这个插件可以加载.json文件,转成一个对象,就可以修改
使用这个比如这样可以修改版本号和根据浏览器做不同的修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| let manifestJSON = require('./src/manifest.json')
manifestJSON.version = '2.1.0'
manifestJSON.browser_specific_settings = { 'gecko': { 'id': '[email protected]', 'strict_min_version': '57.0' } } manifestJSON.applications = { 'gecko': { 'id': '[email protected]', 'strict_min_version': '57.0' } }
|
最后在使用插件把修改后的对象打包成.json文件
1 2 3 4 5 6
| (manifestJSON && new WriteJsonWebpackPlugin({ pretty: false, object: manifestJSON, path: '/', filename: 'manifest.json' }))
|
这个方法是从bilibili-helper抄来的,大佬的插件,可以说是看B站网页版必装的插件
先总结到这里,今后边学 Vue 边学 TypeScript 边学 Webpack 边开发,大概会更新文章
本插件也放在了 Github 上,有兴趣的话可以看看 Btools-vue