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
工具栏也会有对应的插件图标:
此时打开一个其余页面点击这个图标就会弹出咱们要的框了,以下图:
如今基本的框架已经搭建好了,以后要作的就是在这个弹出框里绘制输入框等元素了,这个步骤下回再分解了
以上源码放在码云,请自行查看吧