vue
開發chrome
插件的好處本次開發的插件是抓取配置插件,有不少的form
表單以及彈出層,若是純使用js
的話會有不少動態建立dom
的操做。使用vue
和ES6
的import
語法以及webpack
的html
加載器相配合,能夠減小大量動態建立dom
的代碼。css
node.js
(新版自帶npm
包管理工具)cnpm
淘寶鏡像,安裝依賴的時候會更快一些# -g 安裝在全局 registry指定國內下載地址 $ npm install cnpm -g --registry=https://registry.npm.taobao.org
npm
與 cnpm
基本等價,可是不多狀況下cnpm
也許有些bug
,因此請斟酌使用html
安裝vue-cli
這是vue
的腳手架,能夠很方便的爲咱們搭建一個vue
項目vue
$ npm install vue-cli -g
其餘更詳細的vue
使用方法這裏不細講,參見vue
官方文檔node
打開命令行,進入到你的工做空間,咱們使用vue
腳手架來搭建項目jquery
# 建立一個基於 `webpack` 模板的新項目 $ vue init webpack chromespidercfg # 建立過程會要求你的項目起名(**注意如今項目名不支持駝峯式命名**)之類,因爲是簡單的頁面,因此vue-router之類的就不裝了,後面有個人運行截圖 $ cd chromespidercfg $ cnpm install $ npm run dev
訪問頁面 localhost:8080
出來頁面了就算成功了,Ctrl + C
y確認退出
下面是我建立項目的截圖:webpack
若是你想要使用vue
開發單頁面程序,那麼這個頁面已經搭建好了,可是咱們要作的是chrome
插件開發,因此還須要作一些配置
chrome
插件必要文件chrome
開發須要一些必要的文件,好比manifest.json
,咱們要建立一下
在目錄下建立chrome
文件夾,名字隨便起,我在這裏起名叫chrome
是由於個人vue
編譯配置中用的是這個名字,如今的目錄結構以下:git
如今進入剛剛建立的chrome
目錄,建立一個manifest.json
文件和runbackground.min.js
文件,以及一個icons
文件夾,這個icons
文件夾是放圖標的,chrome
文件夾結構以下:github
manifest.json
文件就是插件的主要配置了,具體的配置能夠查看個人另外一篇文章爬蟲可視化點選配置工具之chrome
插件簡介,以下:web
{ "background": { "scripts": ["runbackground.min.js"] }, "browser_action": { "default_icon": "./icons/icon.png", "default_title": "簡單爬,簡簡單單採集你的數據" }, "content_scripts": [{ "js": ["js/connector.js"], "matches": ["http://*/*", "https://*/*"] }], "externally_connectable": { "accepts_tls_channel_id": false, "ids": ["*"] }, "icons": { "128": "./icons/128.png", "16": "./icons/16.png", "48": "./icons/48.png" }, "description": "爬蟲可視化點選配置工具,簡簡單單採集你的數據", "manifest_version": 2, "name": "爬蟲可視化點選配置工具", "permissions": ["cookies", "tabs", "notifications", "background", "contextMenus", "*://*/*"], "version": "1.0.0", "web_accessible_resources": ["*", "*/*"] }
runbackground.min.js
這個裏面寫了一些啓動插件的邏輯,很簡單,以下:vue-router
chrome.runtime.getPackageDirectoryEntry(function(info) { extensionId = info.filesystem.name.split('_')[1]; }); /* 插件啓動,建立爬蟲任務 */ chrome.browserAction.onClicked.addListener(function(tab) { chrome.tabs.sendMessage(tab.id, JSON.stringify({ command: 'beginUI' }), function(msg) { chrome.tabs.executeScript(tab.id, { file: 'js/paApa.js', allFrames: false }) }); }); chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { var msg = JSON.parse(message); console.log(msg); });
webpack
配置寫到這裏,你們必定很奇怪manifest.json
文件裏的js/connector.js
是哪裏來的,明明沒有js目錄啊,這就是webpack
編譯出來
修改build
目錄下的webpack.base.conf.js
文件,去掉全部limit
字段
將entry
字段修改爲如下內容,這就是編譯以後的文件
entry: { paApa: './src/main.js', connector: './src/js/connector.js' }
在module
的rules
添加如下內容,一個是加載css
的,一個是加載html
的:
{ test: /\.css$/, use: [ 'style-loader', 'css-loader' ] }, { test: /\.html$/, use: [{ loader: 'html-loader' }], }
將webpack.prod.conf.js
文件修改爲如下內容,爲何要這麼改請自行查看webpack
的資料吧:
'use strict' const path = require('path') const utils = require('./utils') const webpack = require('webpack') const config = require('../config') const merge = require('webpack-merge') const baseWebpackConfig = require('./webpack.base.conf') const CopyWebpackPlugin = require('copy-webpack-plugin') const UglifyJsPlugin = require('uglifyjs-webpack-plugin') const env = require('../config/prod.env') const webpackConfig = merge(baseWebpackConfig, { devtool: config.build.productionSourceMap ? config.build.devtool : false, output: { path: config.build.assetsRoot, filename: utils.assetsPath('js/[name].js'), chunkFilename: utils.assetsPath('js/[id].js') }, plugins: [ new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery" }), // http://vuejs.github.io/vue-loader/en/workflow/production.html new webpack.DefinePlugin({ 'process.env': env }), new UglifyJsPlugin({ uglifyOptions: { compress: { warnings: false } }, sourceMap: config.build.productionSourceMap, parallel: true }), // keep module.id stable when vendor modules does not change new webpack.HashedModuleIdsPlugin(), // enable scope hoisting new webpack.optimize.ModuleConcatenationPlugin(), // copy custom static assets new CopyWebpackPlugin([{ from: path.resolve(__dirname, '../chrome'), to: config.build.assetsSubDirectory, ignore: ['.*'] }]) ] }) if (config.build.productionGzip) { const CompressionWebpackPlugin = require('compression-webpack-plugin') webpackConfig.plugins.push( new CompressionWebpackPlugin({ asset: '[path].gz[query]', algorithm: 'gzip', test: new RegExp( '\\.(' + config.build.productionGzipExtensions.join('|') + ')$' ), threshold: 10240, minRatio: 0.8 }) ) } if (config.build.bundleAnalyzerReport) { const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin webpackConfig.plugins.push(new BundleAnalyzerPlugin()) } module.exports = webpackConfig
修改config\index.js
文件,刪除build
字段下的index
字段,將assetsSubDirectory
字段值修改成chrome
,這就會將上面建立的chrome
拷貝到編譯後的目錄中
修改完配置,還要安裝幾個插件,分別是html和css加載器,以及jquery:
npm install html-loader style-loader jquery -D
到此爲止,環境基本上搭建完成了,下面就是寫代碼了
因爲插件中主要用到了彈出層,我這裏用的是layer.js,固然是修改過的,支持ES6的導入和導出,layer.css,layer.js,固然也能夠本身寫一個或者使用其餘的彈出層組件
進入src
目錄,修改main.js
爲如下內容,做用就是打開一個彈出層
import Vue from 'vue'; import $ from "jquery"; import './layer/layer.css'; import layer from './layer/layer'; Vue.config.productionTip = false; let _confirmLayer = 0; let windowHeight = $(window).height(); if (windowHeight > window.screen.height) { windowHeight = document.body.clientHeight; } let defOption = { type: 1, shade: false, maxmin: true, closeBtn: 1, zIndex: 2147483599, title: "爬蟲可視化點選配置工具", offset: ["30px", "30px"], content: '<div id="__paApa_container"></div>', area: ["450px", windowHeight * 0.8 + "px"], cancel: function(index) { event.stopPropagation(); if (_confirmLayer > 0) { layer.close(_confirmLayer); } _confirmLayer = layer.confirm( "關閉爬蟲可視化點選配置工具?", { icon: 0, title: "信息", zIndex: 2147483615 }, function(_index) { event.stopPropagation(); layer.closeAll(); _confirmLayer = -1; layer.msg("再見!", { zIndex: 2147483620, time: 3000, icon: 1 }); }, function(_index) { event.stopPropagation(); layer.close(_index); _confirmLayer = -1; } ); return false; } }; let layerId = layer.open(defOption); $("#layuiex-layer" + layerId + " .layuiex-layer-max").bind("click", function() { $(this).hide(); }).hide(); $("#layuiex-layer" + layerId + " .layuiex-layer-min").bind("click", function() { $(this).next().show(); } ); new Vue({ el: "#__paApa_container", components: {}, data() { return {}; }, mounted() {}, methods: {} });
上面還提到了connector.js
這個文件,這個文件的做用其實就是做爲通訊用的,如今能夠在js
目錄下建立一個connector.js
文件,而後隨便輸出個內容就能夠了
完成以上步驟就能夠測試一下了
在根目錄執行如下命令:
npm run build
出現下圖就證實已經執行成功了
此時跟目錄中會多一個dist
目錄,這就是執行的結果,而後打開chrome
瀏覽器安裝插件就能夠了,打開插件管理頁面
,具體操做請查看爬蟲可視化點選配置工具之chrome插件簡介,而後打開開發者模式
,再點擊加載已解壓的擴展程序
,以下圖:
以後再選擇dist
目錄中的chrome
文件夾便可,以下圖:
安裝成功的話會在插件列表看到下圖:
chrome
工具欄也會有對應的插件圖標:
此時打開一個其餘頁面點擊這個圖標就會彈出咱們要的框了,以下圖:
如今基本的框架已經搭建好了,以後要作的就是在這個彈出框裏繪製輸入框等元素了,這個步驟下回再分解了
以上源碼放在碼雲,請自行查看吧