解答: 构建流程:
- 确定入口:通过配置文件中webpack.config.js的entry找到打包的入口文件
- 分析依赖:根据代码中的引入分析文件的依赖资源,并进行解析
- 确定依赖:分析完成,获取到所有模块的依赖关系树
- 开始编译:对依赖树开始递归,找到每个节点以来的资源文件。
- 编译模块:通过配置文件中webpack.config.js的rules找到对应的加载器,来加载模块,进行编译。
- 输出结果:将加载结果放置到打包结果中。
- 写入资源:通过配置文件中webpack.config.js的output将文件输出到配置的路径和文件名。
打包结果分析:
- 最后输出的代码是一个IIFE,接收一个modules参数
- 参数是一个由全部模块集合成的数组,数组中每一项的都是一个参数列表相同的函数,模块运行在该私有域中。
- 输出的文件中定义了缓存对象、require函数等。
- 在require上挂载数据和工具函数,从0开始加载模块。
- 加载模块时先判定该模块是否有缓存,有缓存时从缓存对象中读取,无缓存时用require加载该模块。
- 加载后调用模块对应的函数并进行传参。
- 导出对象并打上标记。
- 多个模块时从require开始重复步骤,直到全部模块加载结束。
解答: Loader用于处理除JS外的其他类型的资源文件,对其进行编译转换,例如scss、html、img、font等
plugin用于解决其他自动化问题,例如目录清除、代码压缩等。
Loader开发:将需要处理的资源作为参数传入,进行处理,完成后需要返回的字符串是可执行的js代码,代码需符合CommonJS规范或是ESM,也可以返回结果,将其交给一下个loader来处理。
plugin开发: 本质是利用webpack的生命周期,将插件挂载到生命周期中的钩子函数上,插件必须为一个函数或包含apply方法的对象。挂载后在函数体内执行要进行的操作,最后在webpack.config的plugin中使用。