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

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

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

搭建环境

  • 创建一个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 文件并不能实时刷新代码,需要重新加载插件才行)

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

引入element UI

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

平时我们肯定要引入好看的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>

渲染效果:

当然,不仅仅是插件内部的页面,还可以将 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 了,怎能不继续折腾呢,我们平时用 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很强大,vue相关的插件并不是不能应用于开发浏览器插件,element-ui也不仅限于vue的运用。只有你想不到,没有做不到的事😁。

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

(0)

相关推荐

  • vue.js 初体验之Chrome 插件开发实录

    背景 对于经常和动画开发打交道的开发者对于Animate.css这个动画库不会陌生,它把一些常见的动画效果都封装起来了,非常实用.但是有时候在开发中,仅仅只是需要某一两个动画效果,把整个CSS文件都引入,这样不是太好. 需求就出现了,能不能有一个工具可以直接预览Animate.css对应的动画效果,并且生成对应的动画代码呢? 作为一个UI开发,平时跟Chrome浏览器打交道最多,于是就整了一个Chrome插件可以及时预览对应Animate.css中的动画效果并生成对应的动画代码,这样在实际开发中

  • 用VueJS写一个Chrome浏览器插件的实现方法

    浏览器基本已经天下大统了,放眼望去都是Chromium的天下.那么,能写一个浏览器插件也算是一种回报率不错的技能. 基本知识 浏览器插件官方的说法叫扩展程序,允许你为浏览器增加各种功能,但不需要深入研究浏览器本身的代码.你可以用HTML,CSS和JavaScript创建新的扩展程序,如果你曾经写过网页,那么写一个插件是非常轻松的事情. 常见的插件一般就是地址栏后面的一个图标,点击后给你当前网页提供各种功能,或者在你点击网页右键时弹出额外的菜单. 程序目录结构 最简单的扩展程序只需要3个文件,或者

  • 详解Vue CLI3 多页应用实践和源码设计

    对于一个网站来说,即需要h5页面也同时需要web页面,而h5和web页面共用很多代码,不做响应式,只能拆分两个页面来写,一个h5,一个web.用vue cli3怎么配置h5与web的应用呢? 解决思路: 首先,需要产生多页面应用,用webpack配置成多页面应用,一个h5一个web,这个网上已经有很多教程了,下面会再整理一次,接着把所有公共的代码提到多页面目录外面. 我们看一下官网给的 multi-page 的配置:需要在 vue.config.js 配置 pages,示例如下: pages:

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

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

  • 详解vue.js 开发环境搭建最简单攻略

    做为一名学习路上的小白,起初就对 vue.js 有着莫名的好感,知道 vue.js 也能实现 angular.js 的双向绑定等一些功能后,妥妥的先把 angular.js 和 node.js 丢到后面再去学, 看了看 vue 文档,首先要搭建一个开发环境,因为自己太小白,看了一些搭建开发环境的博客,表示专业术语太多依然还是一脸懵逼. 具体流程大概如下: 很难理解?没关系,我也没理解,跟着操作就行了,我是window系统. 1.安装node.js 起初是很不理解的,我学 vue.js 还要掌握

  • 详解vue组件开发脚手架

    generator-vue-component可以快速生成自己的组件开发的脚手架,类似于vue-cli生成vue项目,这脚手架是目录结构是方便组件开发和调试 由于脚手架是由yeoman搭建,所以必须全局安装yeoman npm install yo 然后全局安装generator-vue-component npm install generator-vue-component -g 到项目目录,获取对应的开发模板 yo vue-component-developer 运行上面命令会弹出下面,依

  • 详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计

    执行 npm run build 之后的 dist 目录的静态资源的文件名多会追加上 hash 值,比如: page1.f151b4d3.js 那如果不要 hash 呢,你只需要配置 vue.config.js 文件中的 filenameHashing 官方文档也提到了因为 html 也是我们通过插件生成的,静态资源直接就 inject 进去的,所以,当 html 不是自动生成或者其他情况时候,就不能加 hash 了,可以配置 false. filenameHashing: false 我们看看

  • 详解Vue CLI3配置解析之css.extract

    大家还记得我们在老版本中,对于线上环境配置中会把所有的 css 多打成一个文件: 核心是使用了插件 extract-text-webpack-plugin,方式如下: 第一步都是加载插件 const ExtractTextPlugin = require('extract-text-webpack-plugin') 这个插件的描述如下: Extract text from a bundle, or bundles, into a separate file. 然后配置如下:(省去了 rules

  • 详解vue表单——小白速看

    一.基本用法 你可以用 v-model 指令在表单 <input> 及 <textarea> 元素上创建双向数据绑定. 但 v-model 本质上不过是语法糖.它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理. v-model 会忽略所有表单元素的 value.checked.selected 特性的初始值而总是将 Vue 实例的数据作为数据来源.你应该通过 JavaScript 在组件的 data 选项中声明初始值. 一组代码,看完text.textarea.

  • 详解Vue Cli浏览器兼容性实践

    浏览器市场占有率 在处理浏览器兼容性问题之前,我们先来看一下现在的浏览器市场份额是怎样的,

  • vue开发chrome插件,实现获取界面数据和保存到数据库功能

    前言 最近在评估项目时,要开启评估平台,查看平台和保存平台,感觉非常繁琐,开发了一款可以获取评估平台数据,查看项目排期和直接保存数据到数据库的chrome插件,由于我需要使用之前vue封装的一个日历插件,这里就用vue来开发这个插件. 开发前准备 要开发一个chrome插件,我们首先需要了解chrome插件的基本结构和对应的功能. 每个扩展的文件类型和目录数量有所不同,但都必须有 manifest. 一些基本但有用的扩展程序可能仅由 manifest 及其工具栏图标组成. manifest.js

  • 详解Vue开发网站seo优化方法

    因为用了vue等js的数据绑定机制来展示页面数据,爬虫获取到的html是模型页面而不是最终数据的渲染页面,搜索引擎是不回去执行请求到的js.vue的项目都是ajax请求数据,引擎爬虫进入页面获取不到文字内容,现在大多数解决方案是不采用ajax渲染数据,而是采用server端渲染,也就是所谓的SSR. 目前基于vue的方案是Nuxt.js,同类型的也有React版的Nuxt.js所以服务端渲染就是尽量在服务器发送到浏览器前,页面上是有数据可让爬虫进行爬取 方法一.利用prerender-spa-p

随机推荐