可视化爬虫配置chrome插件开发之搭建vue开发环境

使用vue开发chrome插件的好处

本次开发的插件是抓取配置插件,有不少的form表单以及弹出层,若是纯使用js的话会有不少动态建立dom的操做。使用vueES6import语法以及webpackhtml加载器相配合,能够减小大量动态建立dom的代码。css

vue环境搭建

工做准备

  • 请安装node.js(新版自带npm包管理工具)
  • 建议安装cnpm淘宝镜像,安装依赖的时候会更快一些
# -g 安装在全局 registry指定国内下载地址
$ npm install cnpm -g --registry=https://registry.npm.taobao.org

npmcnpm 基本等价,可是不多状况下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

clipboard.png

配置

若是你想要使用 vue开发单页面程序,那么这个页面已经搭建好了,可是咱们要作的是 chrome插件开发,因此还须要作一些配置

chrome插件必要文件

chrome开发须要一些必要的文件,好比 manifest.json,咱们要建立一下

在目录下建立chrome文件夹,名字随便起,我在这里起名叫chrome是由于个人vue编译配置中用的是这个名字,如今的目录结构以下:git

clipboard.png

如今进入刚刚建立的chrome目录,建立一个manifest.json文件和runbackground.min.js文件,以及一个icons文件夹,这个icons文件夹是放图标的,chrome文件夹结构以下:github

clipboard.png

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'
}

modulerules添加如下内容,一个是加载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.csslayer.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

出现下图就证实已经执行成功了

clipboard.png

此时跟目录中会多一个dist目录,这就是执行的结果,而后打开chrome浏览器安装插件就能够了,打开插件管理页面,具体操做请查看爬虫可视化点选配置工具之chrome插件简介,而后打开开发者模式,再点击加载已解压的扩展程序,以下图:

clipboard.png

以后再选择dist目录中的chrome文件夹便可,以下图:

clipboard.png

安装成功的话会在插件列表看到下图:

clipboard.png

chrome工具栏也会有对应的插件图标:

clipboard.png

此时打开一个其余页面点击这个图标就会弹出咱们要的框了,以下图:

clipboard.png

如今基本的框架已经搭建好了,以后要作的就是在这个弹出框里绘制输入框等元素了,这个步骤下回再分解了

以上源码放在码云,请自行查看吧

相关文章
相关标签/搜索