webpack 源码分析(三)

从上文开始,我们分析到了NodeEnvironmentPlugins,知道了webpack是怎么优化文件读取的。

我们接着看剩下没看的代码

compiler.inputFileSystem = new CachedInputFileSystem(fs, 60000);
const inputFileSystem = compiler.inputFileSystem;
compiler.outputFileSystem = fs;
compiler.intermediateFileSystem = fs;
compiler.watchFileSystem = new NodeWatchFileSystem(
	compiler.inputFileSystem
);
compiler.hooks.beforeRun.tap("NodeEnvironmentPlugin", compiler => {
	if (compiler.inputFileSystem === inputFileSystem) {
		compiler.fsStartTime = Date.now();
		inputFileSystem.purge();
		}
});

我们发现该分析watchFileSystem函数了,这回我就大概说一下NodeWatchFileSystem做了什么,其实watch,webpack自己也是自己封装的库,因为他们觉得node的api不好用,于是自己用轮询的方式,查询fs.lsstat通过时间来判断是否发生了修改,封装了这个函数,传参用的是compiler.inputFileSystem,这样可以利用之前的缓存优化。感兴趣的可以自己看一下,因为webpack设计的太多了,这里我就不过多介绍了,有了上一章的缓存经验,看这里我觉得难度骤降。

最后执行compiler.hooks.beforeRun.tap,给compiler增加hooks,如果输入流没变,那我执行inputFileSystem.purge();,目的是重置上一章所说的data和levels,其实就是初始化,fsStartTime 给他赋值初始时间

那通过我们所了解到的NodeEnvironmentPlugins,我们是不是可以了解到什么是plugin,我们目前可以得到的webpack plugins的知识点有:

  1. webpack 存在一个叫做compiler的对象,这个对象上有很多tapable hooks方法。
  2. apply(compiler) 方法的第一个参数就是这个compiler对象,我们通过拿到compiler对象,我们可以修改compiler对象的属性和方法,以及可以拿到对应的钩子函数,在其在对应的周期执行。

这些只是plugins的一部分知识点,我们继续往下看

const createCompiler = rawOptions => {
	// options是webpack.config.js的配置
	const options = getNormalizedWebpackOptions(rawOptions);
	// 配置default context 和日志
	applyWebpackOptionsBaseDefaults(options);
	const compiler = new Compiler(options.context, options);
	// 初始化 各种流如inputFileSystem
	new NodeEnvironmentPlugin({
		infrastructureLogging: options.infrastructureLogging
	}).apply(compiler);
	if (Array.isArray(options.plugins)) {
		for (const plugin of options.plugins) {
			if (typeof plugin === "function") {
				plugin.call(compiler, compiler);
			} else {
				plugin.apply(compiler);
			}
		}
	}
	applyWebpackOptionsDefaults(options);
	compiler.hooks.environment.call();
	compiler.hooks.afterEnvironment.call();
	// 判断options上一些特定属性,加载plugins
	new WebpackOptionsApply().process(options, compiler);
	compiler.hooks.initialize.call();
	return compiler;
};

这个plugins,我们分析完了,突然发现,createCompiler以及过半了,是不是看到希望了

我们发现下一行,是处理options.plugins也就是我们webpack.config.js中的plugins

判断plugins是方法还是对象,如果是方法就plugins.call(compiler,compiler),如果是对象就apply(compiler)

从中我们又可以得到信息,plugin,有两种一种是方法,对象第一个参数是compiler,也可以是一个对象,对象中含有apply方法,并给apply方法传递compiler参数。

#前端##web前端#
前端技术专栏分享 文章被收录于专栏

1. 包含常规前端面试题解析,和源码分析 2. 从0-1深入浅出理解前端相关技术栈

全部评论

相关推荐

12-11 11:40
海南大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务