详解vue-cli3开发Chrome插件实践


Posted in Javascript onMay 29, 2019

之前找了不少如何开发谷歌插件的文章,结果发现都是些很基础的内容,并没有写到如何快速编译打包插件。我就在想为什么不能通过webpack来打包插件呢?如果通过webpack编译的话,就能使开发过程变得更舒服,使文件结构趋向模块化,并且打包的时候直接编译压缩代码。后来发现了 vue-cli-plugin-chrome-ext 插件,通过这个插件能很方便地用 vue-cli3 来开发谷歌插件,并能直接引用各种UI框架跟npm插件。

tip:如果你没接触过谷歌插件开发的话建议先看看基础文档:

  • Chrome插件开发全攻略

搭建环境

  • 创建一个vue-cli3项目: vue create vue-extension,对话流程选择默认就行。
  • 进入项目cd vue-extension
  • 安装vue-cli-plugin-chrome-ext插件:vue add chrome-ext,根据安装对话选项设置好。
  • 删除vue-cli3无用文件跟文件夹:src/main.js,public、src/components

运行项目

npm run build-watch 运行开发环境,对修改文件进行实时编译并自动在根目录下生成 dist 文件夹,然后在浏览器上加载 dist 文件夹完成插件安装。(注意:修改 background 文件跟 manifest.json 文件并不能实时刷新代码,需要重新加载插件才行)

详解vue-cli3开发Chrome插件实践

npm run build 运行生产环境编译打包,将所有文件进行整合打包。

引入element UI

目前的插件加载到浏览器后弹出页面是这种界面:

详解vue-cli3开发Chrome插件实践

平时我们肯定要引入好看的UI框架的,在这里我们可以引入 element-ui,首先安装:

npm install element-ui

考虑到插件打包后的文件大小,最后通过按需加载的方式来引入组件,按照 element-ui 官方的按需加载方法,要先安装 babel-plugin-component 插件:

npm install babel-plugin-component -D

然后,将 babel.config.js 修改为:

module.exports = {
 presets: [
 '@vue/app'
 ],
 "plugins": [
 [
 "component",
 {
 "libraryName": "element-ui",
 "styleLibraryName": "theme-chalk"
 }
 ]
 ]
}

接下来修改 popup 相关文件引入所需组件, src/popup/index.js 内容:

import Vue from "vue";
import AppComponent from "./App/App.vue";

Vue.component("app-component", AppComponent);

import {
 Card
} from 'element-ui';

Vue.use(Card);

new Vue({
 el: "#app",
 render: createElement => {
 return createElement(AppComponent);
 }
});

src/popup/App/App.vue 内容:

<template>
 <el-card class="box-card">
 <div
 slot="header"
 class="clearfix"
 >
 <span>卡片名称</span>
 <el-button
 style="float: right; padding: 3px 0"
 type="text"
 >操作按钮</el-button>
 </div>
 <div
 v-for="o in 4"
 :key="o"
 class="text item"
 >
 {{'列表内容 ' + o }}
 </div>
 </el-card>
</template>

<script>
export default {
 name: 'app',
}
</script>

<style>
.box-card {
 width: 300px;
}
</style>

渲染效果:

详解vue-cli3开发Chrome插件实践

当然,不仅仅是插件内部的页面,还可以将 element-ui 组件插入到 content 页面。

content.js 使用 element-ui 组件

content.js 主要作用于浏览网页,对打开的网页进行插入、修改 DOM ,对其进行操作交互。别觉得 element-ui 只能配合 vue 使用,其实就是一个前端框架,只要我们引入了就能使用, webpack 会自动帮我们抽离出来编译打包。

首先我们创建 src/content/index 文件,内容:

import {
 Message,
 MessageBox
} from 'element-ui';

// 发现element的字体文件无法通过打包加载,所以另外通过cdn来加载样式
let element_css = document.createElement('link');
element_css.href = 'https://unpkg.com/element-ui@2.8.2/lib/theme-chalk/index.css'
element_css.rel = "stylesheet"
document.head.append(element_css)

MessageBox.alert('这是一段内容', '标题名称', {
 confirmButtonText: '确定',
 callback: action => {
 Message({
  type: 'info',
  message: `action: ${ action }`
 });
 }
})

vue.config.js 增加 content.js 文件的打包配置,因为 content.jsbackground.js 同样可以只生成js文件)只有js文件,不用像app模式那样打包生成相应的 html 文件,完整内容如下:

const CopyWebpackPlugin = require("copy-webpack-plugin");
const path = require("path");

// Generate pages object
const pagesObj = {};

const chromeName = ["popup", "options"];

chromeName.forEach(name => {
 pagesObj[name] = {
 entry: `src/${name}/index.js`,
 template: "public/index.html",
 filename: `${name}.html`
 };
});

const plugins =
 process.env.NODE_ENV === "production" ? [{
 from: path.resolve("src/manifest.production.json"),
 to: `${path.resolve("dist")}/manifest.json`
 }] : [{
 from: path.resolve("src/manifest.development.json"),
 to: `${path.resolve("dist")}/manifest.json`
 }];

module.exports = {
 pages: pagesObj,
 // // 生产环境是否生成 sourceMap 文件
 productionSourceMap: false,

 configureWebpack: {
 entry: {
 'content': './src/content/index.js'
 },
 output: {
 filename: 'js/[name].js'
 },
 plugins: [CopyWebpackPlugin(plugins)]
 },
 css: {
 extract: {
 filename: 'css/[name].css'
 // chunkFilename: 'css/[name].css'
 }
 }
};

最后在 manifest.development.json 加载 content.js 文件:

{
 "manifest_version": 2,
 "name": "vue-extension",
 "description": "a chrome extension with vue-cli3",
 "version": "0.0.1",
 "options_page": "options.html",
 "browser_action": {
 "default_popup": "popup.html"
 },
 "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
 "content_scripts": [{
 "matches": [
  "*://*.baidu.com/*"
 ],
 "js": [
  "js/content.js"
 ],
 "run_at": "document_end"
 }]
}

然后浏览器重新加载插件后打开 https://www.baidu.com/ 网址后可看到:

详解vue-cli3开发Chrome插件实践

添加打包文件大小预览配置

既然用了 vue-cli3 了,怎能不继续折腾呢,我们平时用 webpack 开发肯定离不开打包组件预览功能,才能分析哪些组件占用文件大,该有的功能一个都不能少:sunglasses:。这么实用的功能,实现起来也无非就是添加几行代码的事:

// vue.config.js

module.export = {
 /* ... */

 chainWebpack: config => {
 // 查看打包组件大小情况
 if (process.env.npm_config_report) {
 // 在运行命令中添加 --report参数运行, 如:npm run build --report
 config
 .plugin('webpack-bundle-analyzer')
 .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
 }
 }
}

就辣么简单,然后运行 npm run build --report 看看效果:

详解vue-cli3开发Chrome插件实践

搞定收工!

结语

事实证明,vue-cli3很强大,vue相关的插件并不是不能应用于开发浏览器插件,element-ui也不仅限于vue的运用。只有你想不到,没有做不到的事?。

tip:如果你懒得从头开始搭建模板的话也可以从GitHub拉取vue-extension-template。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
for 循环性能比较 提高for循环的效率
Mar 19 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
Oct 13 Javascript
script标签属性type与language使用选择
Dec 02 Javascript
学习JavaScript设计模式(继承)
Nov 26 Javascript
angularJS之$http:与服务器交互示例
Mar 17 Javascript
Vue打包后出现一些map文件的解决方法
Feb 13 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
Mar 01 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
Aug 25 Javascript
学习jQuery中的noConflict()用法
Sep 28 jQuery
小程序实现新用户判断并跳转激活的方法
May 20 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
Aug 23 Javascript
Vue实现指令式动态追加小球动画组件的步骤
Dec 18 Vue.js
vue里的data要用return返回的原因浅析
May 28 #Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
May 28 #Javascript
Javascript三种字符串连接方式及性能比较
May 28 #Javascript
vue+element实现表格新增、编辑、删除功能
May 28 #Javascript
Vue实现表格批量审核功能实例代码
May 28 #Javascript
vue+Element实现搜索关键字高亮功能
May 28 #Javascript
vue input输入框关键字筛选检索列表数据展示
Oct 26 #Javascript
You might like
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
PHP 命名空间实例说明
2011/01/27 PHP
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
php防注入及开发安全详细解析
2013/08/09 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
PHP自定义函数获取汉字首字母的方法
2016/12/01 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
ext form 表单提交数据的方法小结
2008/08/08 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
jquery定时滑出可最小化的底部提示层特效代码
2013/10/02 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
JavaScript制作windows经典扫雷小游戏
2015/03/31 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
es6学习之解构时应该注意的点
2017/08/29 Javascript
vue的滚动条插件实现代码
2019/09/07 Javascript
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
CentOS6.5设置Django开发环境
2016/10/13 Python
用python实现的线程池实例代码
2018/01/06 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
python实现简单日期工具类
2019/04/24 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
如何在django中实现分页功能
2020/04/22 Python
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
幼教简历自我评价
2014/01/28 职场文书
协议书范本
2014/04/23 职场文书
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL