詳解vue-cli3開發(fā)Chrome插件實踐
之前找了不少如何開發(fā)谷歌插件的文章,結(jié)果發(fā)現(xiàn)都是些很基礎(chǔ)的內(nèi)容,并沒有寫到如何快速編譯打包插件。我就在想為什么不能通過webpack來打包插件呢?如果通過webpack編譯的話,就能使開發(fā)過程變得更舒服,使文件結(jié)構(gòu)趨向模塊化,并且打包的時候直接編譯壓縮代碼。后來發(fā)現(xiàn)了 vue-cli-plugin-chrome-ext
插件,通過這個插件能很方便地用 vue-cli3
來開發(fā)谷歌插件,并能直接引用各種UI框架跟npm插件。
tip:如果你沒接觸過谷歌插件開發(fā)的話建議先看看基礎(chǔ)文檔:
搭建環(huán)境
- 創(chuàng)建一個vue-cli3項目: vue create vue-extension,對話流程選擇默認(rèn)就行。
- 進(jìn)入項目cd vue-extension
- 安裝vue-cli-plugin-chrome-ext插件:vue add chrome-ext,根據(jù)安裝對話選項設(shè)置好。
- 刪除vue-cli3無用文件跟文件夾:src/main.js,public、src/components
運(yùn)行項目
npm run build-watch
運(yùn)行開發(fā)環(huán)境,對修改文件進(jìn)行實時編譯并自動在根目錄下生成 dist
文件夾,然后在瀏覽器上加載 dist
文件夾完成插件安裝。(注意:修改 background
文件跟 manifest.json
文件并不能實時刷新代碼,需要重新加載插件才行)
npm run build
運(yùn)行生產(chǎn)環(huán)境編譯打包,將所有文件進(jìn)行整合打包。
引入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
相關(guān)文件引入所需組件, src/popup/index.js
內(nèi)容:
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
內(nèi)容:
<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" > {{'列表內(nèi)容 ' + o }} </div> </el-card> </template> <script> export default { name: 'app', } </script> <style> .box-card { width: 300px; } </style>
渲染效果:
當(dāng)然,不僅僅是插件內(nèi)部的頁面,還可以將 element-ui
組件插入到 content
頁面。
content.js 使用 element-ui 組件
content.js
主要作用于瀏覽網(wǎng)頁,對打開的網(wǎng)頁進(jìn)行插入、修改 DOM
,對其進(jìn)行操作交互。別覺得 element-ui
只能配合 vue
使用,其實就是一個前端框架,只要我們引入了就能使用, webpack
會自動幫我們抽離出來編譯打包。
首先我們創(chuàng)建 src/content/index
文件,內(nèi)容:
import { Message, MessageBox } from 'element-ui'; // 發(fā)現(xiàn)element的字體文件無法通過打包加載,所以另外通過cdn來加載樣式 let element_css = document.createElement('link'); element_css. element_css.rel = "stylesheet" document.head.append(element_css) MessageBox.alert('這是一段內(nèi)容', '標(biāo)題名稱', { confirmButtonText: '確定', callback: action => { Message({ type: 'info', message: `action: ${ action }` }); } })
vue.config.js
增加 content.js
文件的打包配置,因為 content.js
( background.js
同樣可以只生成js文件)只有js文件,不用像app模式那樣打包生成相應(yīng)的 html
文件,完整內(nèi)容如下:
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, // // 生產(chǎn)環(huán)境是否生成 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/
網(wǎng)址后可看到:
添加打包文件大小預(yù)覽配置
既然用了 vue-cli3
了,怎能不繼續(xù)折騰呢,我們平時用 webpack
開發(fā)肯定離不開打包組件預(yù)覽功能,才能分析哪些組件占用文件大,該有的功能一個都不能少:sunglasses:。這么實用的功能,實現(xiàn)起來也無非就是添加幾行代碼的事:
// vue.config.js module.export = { /* ... */ chainWebpack: config => { // 查看打包組件大小情況 if (process.env.npm_config_report) { // 在運(yùn)行命令中添加 --report參數(shù)運(yùn)行, 如:npm run build --report config .plugin('webpack-bundle-analyzer') .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin) } } }
就辣么簡單,然后運(yùn)行 npm run build --report
看看效果:
搞定收工!
結(jié)語
事實證明,vue-cli3很強(qiáng)大,vue相關(guān)的插件并不是不能應(yīng)用于開發(fā)瀏覽器插件,element-ui也不僅限于vue的運(yùn)用。只有你想不到,沒有做不到的事😁。
tip:如果你懶得從頭開始搭建模板的話也可以從GitHub拉取vue-extension-template。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用vue深度選擇器修改ElementUI組件內(nèi)樣式的示例代碼
在帶有scoped屬性的style中書寫樣式時,無法作用影響到子組件中的樣式,此時我們會使用到deep深度選擇器,來解決此問題,我們在使用less預(yù)處理器,能正常使用,但是在scss預(yù)處理器中會報錯,下面通過本文介紹vue深度選擇器修改ElementUI組件內(nèi)樣式,需要的朋友可以參考下2022-12-12vue 列表頁跳轉(zhuǎn)詳情頁獲取id以及詳情頁通過id獲取數(shù)據(jù)
這篇文章主要介紹了vue 列表頁跳轉(zhuǎn)詳情頁獲取id以及詳情頁通過id獲取數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03vue項目使用js監(jiān)聽瀏覽器關(guān)閉、刷新、后退事件實現(xiàn)方法
用vue做的項目,有個需求就是關(guān)閉瀏覽器的時候,需要往后臺提交有個接口,來看看這個賬號有沒有下線,這篇文章主要給大家介紹了關(guān)于vue項目使用js監(jiān)聽瀏覽器關(guān)閉、刷新、后退事件的實現(xiàn)方法,需要的朋友可以參考下2024-06-06Vue-CLI 3 scp2自動部署項目至服務(wù)器的方法
這篇文章主要介紹了Vue-CLI 3 scp2自動部署項目至服務(wù)器的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07vue如何使用async、await實現(xiàn)同步請求
這篇文章主要介紹了vue如何使用async、await實現(xiàn)同步請求,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12