Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【webpack进阶系列】写个 plugin #91

Open
amandakelake opened this issue Dec 30, 2019 · 1 comment
Open

【webpack进阶系列】写个 plugin #91

amandakelake opened this issue Dec 30, 2019 · 1 comment

Comments

@amandakelake
Copy link
Owner

amandakelake commented Dec 30, 2019

一、创建一个plugin

一个插件由以下构成

  • 一个类
  • 定义 apply 方法
  • 指定一个触及到 webpack 本身的 事件钩子
  • 操作 webpack 内部的实例特定数据。
  • 在实现功能后调用 webpack 提供的 callback。
// 一个类
class LgcWebpackPlugin {
    constructor(options) {
        this.options = options;
    }
    // 定义 apply 方法
    apply(compiler) {
        // 指定一个触及到 webpack 本身的  [事件钩子](https://webpack.docschina.org/api/compiler-hooks/) 。
        compiler.hooks.emit.tapAsync('LgcWebpackPlugin', (compilation, callback) => {
            // 操作 webpack 内部的实例特定数据,在这里做任何你想做的事情
            console.log('compilation', compilation);
            // 在实现功能后调用 webpack 提供的 callback
            callback();
        });
    }
}

module.exports = LgcWebpackPlugin;

二、使用插件

// webpack.prod.js
const LgcWebpackPlugin = require('../plugins/lgc-webpack-plugin');

module.exports = {
	// ... other config
	plugins: [
		new LgcWebpackPlugin()
	]
}

其实到这里就已经完事了 ,本想写多一点,但觉得我并不会比文档写的更好 编写一个插件

三、调试plugin

在读文档的过程中,我们会发现两个非常重要的概念:compiler 钩子 compilation 钩子 想要做点什么基本是围绕着两个api展开
但它两涉及的概念有点多,一次次的console.log肯定不会是我们的最佳选择,让我们看看如何利用chrome调试工具快速debug

先在package.json加一条script

"debug": "node --inspect --inspect-brk node_modules/webpack/bin/webpack.js --config ./build/webpack.prod.js"

具体意思如下

  • node --inspect 用node启动inspect模式
  • --inspect-brk 在第一行打一个断点
  • node_modules/webpack/bin/webpack.js webpack执行入口的绝对路径
  • --config ./build/webpack.prod.js 如果你有多个配置文件,指定你想要调试的配置

yarn debug跑起来,调试模式已经开启
7FFBDB9B-D057-40C5-B714-27ACA6B5ED34

然后打开chrome浏览器随便一个页面 -> 打开控制台 -> 找到图中的小按钮
B3BEDD1F-A616-488A-9DD9-AF58431B1033

点击就能进入debug模式了
05DF3E44-0548-4D7E-9AEB-F97F63926BD9

如果希望调试某个属性,比如上面说的两个特别重要的钩子compiler 钩子 compilation 钩子

在代码中加入debugger,然后重跑上面的debug流程
C4489750-B750-4CB0-9DB2-F670A1CC7832

进入debug界面后,点击一下右边的蓝色小三角就可以直接进入打断点的地方,再watch任何你想要观察的属性,就可以愉快的进行调试了
7A50F65A-F157-471A-97E6-7256DA8BC07A

到这里为止,剩下的就是多看看别人的插件是怎么玩的,自己多看文档多实践,然后再加点想法,说不定哪天你也能造出一个牛逼的插件

@wlsyne
Copy link

wlsyne commented Jun 23, 2021

image
老哥 你知道调试的时候为啥会报这种错嘛

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants