webpack - 指南
模块热替换
启用 HMR
- 更新
webpack-dev-server
配置,使用webpack内置的HMR插件
1 | module.exports = { |
通过 Node.js API
- 当使用 webpack dev server 和 Node.js API 时,不要将dev server选项放在webpack配置对象中,而是在创建选项时作为第二个参数传递
1 | const webpackDevServer = require('webpack-dev-server'); |
tree shaking
- 用于描述移除 js 上下文中的未引用代码,它依赖es5中的静态结构特性(如:import、export)
- 通过
package.json
的sideEffects
属性作为标记,表明项目中哪些文件时纯的es5模块,可以安全删除文件中未使用的部分
1 | { |
- 压缩输出
1 | mode: "production" |
生产环境构建
- 避免在生产环境中使用
inline-***
和eval-***
它们可以增加包大小影响性能
指定环境
- 当使用
process.env.NODE_ENV === 'production'
针对具体用户环境删除或添加重要代码,可以使用webpck
内置 的DefinePlugin
为所有的依赖定义这个变量
1 | new webpack.DefinePlugin({ |
- 添加此插件后,任何位于
/src
的本地代码都可以关联到process.env.NODE_ENV
环境变量
代码分离
防止重复
CommonsChunkPlugin
可以将公共的依赖模块提取到已有的入口chunk或者提取到一个新生成的chunk中
1 | new webpack.optimize.CommonsChunkPlugin({ |
- 代码分离的插件和loaders
ExtractTextPlugin
:用于将css从主应用程序中分离bundle-loader
:用于分离代码和延迟加载生成的bundlepromise-loader
:类似bundle-loader
动态导入
import()
会返回一个promise
可以和async函数
一起用,需要使用像Babel这样的预处理器
1 | async function getComponent() { |
require.ensure
缓存
- 通过使用
output.filename
进行文件名替换,【hash】替换用于在文件名中包含一个构建相关的hash,更好的方式是用[chunkhash]
1 | module.exports = { |
提取模版
CommonChunkPlugin
能在每次修改后的构建结果中,将webpack的样板和manifest 提取出来
1 | new webpack.optimize.CommonsChunkPlugin({ |
模块标识符
- 对于依赖第三方构建保持后缀不变
1 | plugins:[ |
shimming
全局变量
1 | plugins: [ |
细粒度 shimming
1 | // 一般模块依赖 `this`指向`window`在CommonJS中可以这样 |
全局 export
1 | // globals.js |