webpack的核心定义
一个模块打包器(能识别ES Moudule和CommonJS规范和其他如css等格式的文件)
提高构建和打包效率
- 让node和webpack版本最新
package.json文件
1 | { |
npm script
1 | $ npm init -y # 用默认配置初始项目 |
entry config
1 | entry: './src/index.js' |
output config
1 | // https://webpack.js.org/guides/output-management |
mode config
1 | mode: 'development' // 代码不会被压缩, 默认为 production, 代码会被压缩 |
loader 非js模块的打包
1 | module: { |
plugins 可以在webpack运行到某个时刻, 做一些事情
1 | plugins: [ |
postcss
1 | // postcss.config.js |
sourcemap 源码映射
1 | // https://webpack.js.org/configuration/devtool#devtool |
webpack devServer
1 | // https://webpack.js.org/configuration/dev-server |
HMR 页面无刷新更新视图
1 | // https://webpack.js.org/guides/hot-module-replacement |
babel
1 | // https://babeljs.io/setup#installation |
tree shaking 根据引入的按需打包, 摇晃掉模块里无用的部分, 根树没有关联的模块
1 | // Tree Shaking只支持 ES Module(静态引入), 不支持Common JS(动态引入) |
mode
1 | // package.json |
code splitting 代码分割
- 分割业务代码和库代码, 不然打包文件会很大, 首次访问加载时间会很长
- 而且如果不分割, 修改业务代码后, 重新访问, 又全部得重新加载库代码
- 两种分割方式: 配置 + 同步引入 与 异步引入(无需做任何配置)
1 | function getComponent () { |
magic comment
1 | // webpack官方提供的动态引入插件 |
splitPlugin 配置
1 | optimization: { |
lazy loading
1 | // 点击页面才会加载lodash代码 |
chunk
- 每一个文件都是一个chunk
打包分析
- www.github.com/webpack/analyse
- https://webpack.js.org/guides/code-splitting#bundle-analysis
- https://github.com/webpack-contrib/webpack-bundle-analyzer
1 | # 生成stats.json文件 |
prefeching/preloading
实现第一次加载的时候就是最快的, webpack推荐交互的代码放到异步加载的模块里去写
prefeching/preloading可实现网页空闲时预先加载异步模块
1 | // console > Sources > command + shift + P > Show Coverage > 录屏 |
css代码分割
- https://webpack.js.org/plugins/mini-css-extract-plugin
- webpack默认会把css打包到js文件里
1 | output: { |
1 | $ npm install --save-dev mini-css-extract-plugin |
1 | // prodConfig |
webpack与浏览器缓存
利用contenthash
1 | // webpackConfig |
shimming
垫片, 兼容, 实现webpack原始实现不了的功能
1 | plugins: [ |
Library的打包
1 | // 希望满足如下引入方式 |
打包PWA
1 | // npm i -D workbox-webpack-plugin |
TypeScript项目配置
TS提高项目可维护性
1 | // npm i -D ts-loader typescript |
proxy
1 | axios.get('/react/api/header.json') |