webpack详解

webpack作用

代码转换
文件优化
代码分割
模块合并
自动刷新
代码校验
自动发布

打包原理

(1)初始化参数:从配置文件和 Shell 语句中读取与合并参数,得出最终的参数;
(2)开始编译:用上一步得到的参数初始化 Compiler 对象,加载所有配置的插件,通过执行对象的 run 方法开始执行编译;
(3)确定入口:根据配置中的 entry 找出所有入口文件;
(4)编译模块:从入口文件出发,调用所有配置的 Loader 对模块进行翻译,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理;
(5)完成模块编译:在经过第 4 步使用 Loader 翻译完所有模块后,得到了每个模块被翻译后的最终内容及它们之间的依赖关系;
(6)输出资源:根据入口和模块之间的依赖关系,组装成一个个包含多个模块的 Chunk,再将每个 Chunk 转换成一个单独的文件加入输出列表中,这是可以修改输出内容的最后机会;
(7)输出完成:在确定好输出内容后,根据配置确定输出的路径和文件名,将文件的内容写入文件系统中;

loader与plugin的区别

loader,它是一个转换器,文件内容进行翻译,,比如将es6转换为es5,单纯的文件转换过程
plugin是一个扩展器,它丰富了webpack本身,针对是loader结束后。webpack打包的整个过程,它并不直接操作文件,而是基于事件机制工作,会监听webpack打包过程中的某些节点,并且执行相对应的任务

如何优化webpack配置

缩小文件查找范围

优化loader
优化resolve.modules
优化resolve.mainFields
优化resolve.alias
优化resolve.extensions
优化module.noPaese

使用DllPlugin

基础模块抽离,打包到动态链接库
需要使用模块,直接去动态链接库查找

使用HappyPack

单线程变多进程

HappyPack的原理

webpack中最耗时的就是loader的转换过程,转换的流程很长。happypack的原理就是把这部分的任务拆解成多个子进程去并行处理,减少构建时间。
通过new HappyPack()实例化,然后把任务交由实例统一调度分配。核心调度器会将一个个任务分配给空闲的子进程。处理完毕后发送给核心调度器。

使用ParallelUglifyPlugin

开启多进程压缩代码,并行执行

使用CDN加速

静态资源放到CDN服务器上面

Tree Shaking

剔除无用的代码

提取公共代码

防止相同资源重复加载
减少网络流量及服务器成本

使用prepack

编译代码时提前计算结果放到编译后的结果中,而不是在代码运行才求值