preface

Json file, manifest.json attributes

  • Content_scripts Specifies the injected js, CSS.

  • Browser_action default_popup specifies the path to the popup HTML file.

  • Background Resident page 【 BACKGROUND 】

The user performs popup page operation, inject DOM analysis, and communicates with background to send data to background summary. This communication is very troublesome.

Vue development Chrome plugin advantages

Avoid complex communications

Native file development plug-in, need to use

Chrome. Runtime. SendMessage ({action: the action START_FETCH, data: XXXX}) to transmit data, just one or two or can be, but often we have to do the plugin is not so simple. Vue can solve this problem without the need for cumbersome communication.

▍ DOM manipulation

Developing plug-ins is not without user interaction. Native DOM manipulation, document.getelementByid (), is cumbersome, and Vue’s bidirectional binding perfectly eliminates this problem.

▎ packaging

Vue and Webpack are easy to pack in real time

Vue initializes the project

The prerequisite is that you have installed the scaffolding environment, which is not demonstrated here

vue create hello-chrome-vue
Copy the code

The vue2.0 syntax is selected by default

Please pick a preset: Default ([Vue 2] babel, Eslint) ✨ Creating project in E:\dev_workspace\ webStorm_workspace \hello-chrome-vue. 🗃 Initializing Git Repository... ⚙️ Installing CLI plugins. This might take a while... > [email protected] install E:\dev_workspace\webstorm_workspace\hello-chrome-vue\node_modules\yorkie > node bin/install.js Setting up Git hooks done > [email protected] postinstall E:\dev_workspace\webstorm_workspace\hello-chrome-vue\node_modules\core-js > node -e "Try {the require ('/postinstall ')} the catch (e) {}" > [email protected] postinstall E:\dev_workspace\webstorm_workspace\hello-chrome-vue\node_modules\ejs > node ./postinstall.js added 1264 packages from 656 ficolin-in 52.131s 84 packages are looking for funding run 'NPM fund' for details 🚀 Invoking generators... 📦 Installing additional dependencies... Added 53 packages from 36 ficolin-3 in 19.491s 89 packages are looking for funding run 'NPM fund' for details ⚓ Running completion hooks... 📄 Generating README. Md... 🎉 Successfully created project hello-chrome-vue. 👉 Get started with the following commands: $ cd hello-chrome-vue $ npm run serve WARN Skipped git commit due to missing username and email in git config, or failed to sign commit. You will need to perform the initial commit yourself.Copy the code

Successfully indicates that the installation is successful

Delete unnecessary files

Since we are not doing a complete Web project, vuE-CLI3 scaffolding generates files that we do not all need, so here we remove unnecessary parts

src/main.js

src/components

SRC/app.vue (optional)

Install chrome-Ext plugin dependencies

We need to modify the project so that it is suitable for developing Chrome extensions. You can only install it using vue add chrome-ext. If you use YARN add chrome-ext, you will find that the project has not changed.

After installation, package.json is configured as follows

Chrome -ext dependency installation corresponds to vue-cli-plugin-chrome-ext, the entire project directory is as follows:

Vue.config. js automatically generates the configuration, and backgroud.js was configured after me

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 background = {
    from: path.resolve("src/background.js"),
    to: `${path.resolve("dist")}/background.js`
}
const plugins =
  process.env.NODE_ENV === "production"
    ? [
          {
              from: path.resolve("src/manifest.production.json"),
              to: `${path.resolve("dist")}/manifest.json`
          },
          {
              ...background
          }
      ]
    : [
        {
          from: path.resolve("src/manifest.development.json"),
          to: `${path.resolve("dist")}/manifest.json`
        },
          {
              ...background
          }
      ];

module.exports = {
  pages: pagesObj,
  configureWebpack: {
    plugins: [CopyWebpackPlugin(plugins)]
  }
};
Copy the code

Package. json configures running scripts

"scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "build:dev": "vue-cli-service build --mode development",
    "lint": "vue-cli-service lint",
    "build-watch": "vue-cli-service build-watch"
  },
Copy the code

The plug-in USES

NPM Run build generates dist, which can be installed directly into Google Browser

The directory structure in PopUp is automatically generated by installing the Chrome-Ext plugin

The content in app.vue is my own arbitrary definition

</button> <input type="text" </button> <input type="text" v-model="value"> </div> </template> <script> import chrome from "vue-cli-plugin-chrome-ext"; export default { name: 'app', data(){ return{ listenerId: null, value:'', } }, mounted() { let that = this; this.$nextTick(()=>{ // When the button is clicked, inject setPageBackgroundColor into current page that.listenerId = that.$refs.changeColor.addEventListener("click", async () => { let [tab] = await chrome.tabs.query({active: true, currentWindow: true}); chrome.scripting.executeScript({ target: {tabId: tab.id}, function: that.setPageBackgroundColor, }); }); }) }, destroyed() { this.listenerId && window.removeEventListener(this.listenerId); }, methods: { handleClick() { this.value = new Date().getMilliseconds(); chrome.storage.sync.get("color", ({color}) => { this.$refs.changeColor.style.backgroundColor = color; }); }, setPageBackgroundColor() { console.log('setPageBackgroundColor---'); chrome.storage.sync.get("color", ({color}) => { document.body.style.backgroundColor = color; }); } } } </script> <style> button { height: 50px; width: 50px; outline: none; margin: 10px; border: none; border-radius: 2px; } button.current { box-shadow: 0 0 0 2px white, 0 0 0 4px black; } </style>Copy the code

This uses the relevant Chrome API to add “@type/chrome” to the Chrome type declaration

npm install --save-d @types/chrome
Copy the code

Remember to turn off ESLint syntax checking for easy development

Copy the code

During debugging, if you want to print the logs in the plugin, you need to right click on the plugin icon and click on the audit element separately. Otherwise, you cannot capture the logs by pressing the F12 browser directly

The last

After the project follows the above process, the future page can be completely developed in the way of Vue, introducing some good UI, it is indeed much faster than directly writing JS and jquery.js

Click the card below/wechat search, follow the public account “Tianyu Creative Music” (ID: GH_CC865e4C536b)

I heard that praise and attention to this number have found a beautiful little sister yo and after the year will enter a million ah!!

Phase to recommend

[

Urgent!!! Log4j epic vulnerability attack, please check yourself!

] (mp.weixin.qq.com/s?__biz=MzI…).

[

TGA 2021: PUBG becomes free on January 12, 2022

] (mp.weixin.qq.com/s?__biz=MzI…).

[

Stunned! Net legend Tencent “League of Heroes” project team year-end bonus each 1.2 million!

] (mp.weixin.qq.com/s?__biz=MzI…).

[

Use StopWatch to gracefully print execution time

] (mp.weixin.qq.com/s?__biz=MzI…).

[

The article that Lei Jun writes when doing programmer, quite have philosophy!

] (mp.weixin.qq.com/s?__biz=MzI…).

[

SpringBoot + Netty4 to implement their own RPC

] (mp.weixin.qq.com/s?__biz=MzI…).

This article uses the article synchronization assistant to synchronize