webpack打包相关

115 阅读3分钟

Loader 加载器

让 webpack 拥有加载和解析「非 js 文件」的能力

  • css-loader: 加载 CSS,支持模块化、压缩、文件导入等特性
  • style-loader: 使用 <style> 把 css-loader 生成的内容挂在到 html 页面中
  • babel-loader: 转换 ES6、7 等 js 新特性语法为 ES5
  • awesome-typescript-loader:将 TypeScript 转换成 JavaScript,性能优于 ts-loader
  • file-loader: 把文件输出到一个文件夹中,在代码中通过相对 URL 去引用输出的文件
  • url-loader: 和 file-loader 类似,小于设置阈(yu)值情况下以 base64 的方式把文件内容注入到代码中 (例如小图)
  • source-map-loader:加载额外的 Source Map 文件,以方便断点调试
  • image-loader:加载并且压缩图片文件
  • eslint-loader:通过 ESLint 检查 JavaScript 代码

Plugin 插件

插件扩展 webpack 的功能,在生命周期中广播事件,Plugin 监听事件,在合适的时机 通过 API 改变输出结果。

  • HtmlWebpackPlugin:打包结束后自动生成一个 html 文件,并把打包生成的 js 模块引入到该 html 中。
  • clean-webpack-plugin:打包的时候 清理输出目录文件
  • define-plugin:定义环境变量(webpack4 之后指定 mode 会自动配置)
  • uglifyjs-webpack-plugin 不支持 ES6 压缩 (Webpack4 以前),如果需要 ES6 代码压缩,请使用 terser-webpack-plugin
  • 主要是删除未引用代码(dead code)的能力,生产环境下默认使用 TerserPlugin(opens new window)
  • webpack-parallel-uglify-plugin: 多核压缩,提高压缩速度
  • webpack-bundle-analyzer: 可视化 webpack 输出文件的体积
  • css-minimizer-webpack-plugin (opens new window)压缩 css 代码

###用法

  • Loader 在 module.rules 中配置,也就是说他作为模块的解析规则而存在。 类型为数组,每一项都是一个 Object,里面描述了对于什么类型的文件(test),使用什么加载(loader)和使用的参数(options
  • Plugin在 plugins中单独配置, 类型为数组,每一项是一个plugin的实例,参数都通过构造函数传入。

Webpack 构建流程

简单说

  1. 初始化:启动构建,读取与合并配置参数,加载 Plugin,实例化 Compiler
  2. 编译:从 Entry 出发,针对每个模块 Module 调用对应的 Loader 去翻译/解析文件的内容,再找到该 Module 依赖的 Module,递归地进行编译处理,得到最终内容以及它们之间的依赖关系。
  3. 输出:将编译后的 Module 组合成 Chunk,将 Chunk 转换成文件,根据配置确定输出路径和文件名,把文件内容写入到文件系统。

如何提高 webpack 的构建速度?

  1. 利用DllPluginDllReferencePlugin预编译资源模块 通过DllPlugin来对那些我们引用但是绝对不会修改的 npm 包来进行预编译,再通过DllReferencePlugin将预编译的模块加载进来。
  2. 使用Happypack 实现多线程加速编译
  3. 使用webpack-uglify-parallel来提升uglifyPlugin的压缩速度。 原理上webpack-uglify-parallel采用了多核并行压缩来提升压缩速度
  4. 使用Tree-shaking来剔除多余代码