最近,我开始学习如何构建 webpack 插件。我正在尝试构建一个可以更新我的源代码的插件。
规则很简单:
- 如果入口点名称少于 2
a
秒,我必须将所有变量重命名haha
为hehe
所述入口点块中的所有模块中的所有变量。 - 如果入口点名称超过 2
a
秒,我必须将所述入口点haha
块中所有模块的所有变量重命名为。hoho
这是我的代码:
一个.js
const haha = 'hello';
// will be "const hehe = 'hello';" in the bundle of "aa" entry point
// will be "const hoho = 'hello';" in the bundle of "aaaa" entry point
console.log(haha);
// will be "console.log(hehe);" in the bundle of "aa" entry point
// will be "console.log(hoho);" in the bundle of "aaaa" entry point
export default haha;
// will be "export default hehe;" in the bundle of "aa" entry point
// will be "export default hoho;" in the bundle of "aaaa" entry point
几个.js
import haha from 'a'; // will be "import hehe from 'a';" in the bundle
console.log(haha); // will be "console.log(hehe);" in the bundle
很多.js
import haha from 'a'; // will be "import hoho from 'a';" in the bundle
console.log(haha); // will be "console.log(hoho);" in the bundle
webpack.config.js
module.exports = {
mode: 'development',
entry: {
aa: 'few.js',
aaaa: 'lots.js'
},
output: {
filename: '[name].js',
path: path.resolve(__dirname, 'dist')
}
};
我不知道这样做的正确方法是什么。
一开始我以为我的插件要注册到解析器的特定钩子上,检查当前入口点的名字,替换掉AST节点的名字。问题是该模块a.js
只被解析一次。
我尝试的第二种方法是通过简单的正则表达式注册到并重命名变量的render
钩子。mainTemplate
我不喜欢这种方法,因为通过正则表达式替换代码非常困难(IMO)。
你怎么看?正确的方法是什么?