webpack.js文件有一句代码特别拗口
compiler.apply.apply(compiler, options.plugins);
compiler = new Compiler(); compiler.context = options.context; compiler.options = options; new NodeEnvironmentPlugin().apply(compiler); if(options.plugins && Array.isArray(options.plugins)) { compiler.apply.apply(compiler, options.plugins); } compiler.applyPlugins("environment"); compiler.applyPlugins("after-environment"); compiler.options = new WebpackOptionsApply().process(options, compiler);
实际上是compiler有一个方法叫apply,通过Tapable继承而来,
此句代码是拿apply方法通过apply调用来更改上下文context(函数内部的this)
compiler.apply等于以下代码
Tapable.prototype.apply = function apply() { for(var i = 0; i < arguments.length; i++) { arguments[i].apply(this); } };
故而compiler.apply.apply(compiler, options.plugins)等于以下代码
for(var i = 0; i < options.plugins.length; i++) { options.plugins[i].apply.call(compiler); }