webpack 安装

  • webpack
  • webpack-cli
  • webpack-dev-server
  1. yarn add webpack webpack-cli -D
  2. yarn add webpack-dev-server -D

打包编译

  1. npx webpack

webpack-dev-server

配置本地启动服务,该服务内部使用express框架。
官方配置文档

  • port: 端口
  • compress: 压缩
  • client.progress: 显示进度
  • open: 打开页面

hot和liveload的区别

  • 模块热替换(HMR - hot module replacement)功能会在应用程序运行过程中,替换、添加或删除 模块,而无需重新加载整个页面。
  • liveload 监听到文件变化时 dev-server 将会重新加载或刷新页面

devtool设置sourcemap

  • cheap:只显示行,不显示列。
  • module:添加后可以显示第三方模块中的报错。
  • eval:代码显示在eval函数中。
  • inline:sourcemap文件不单独现在一个文件。

一般测试环境配置:cheap-module-eval-source-map。
生产环境直接关闭,或者cheap-module-source-map

output设置library

  1. module.exports = {
  2. output:{
  3. library:"defineLibrary",
  4. libraryTarget: "umd", //umd:usually mode即通用模式,支持amd、cmd、es6、静态引入。
  5. }
  6. }

loader

解析js时设置babel-loader的配置文件.babelrc。内部解析时,从下往上,从右向左。

  1. {
  2. presets:[
  3. [
  4. '@babel/preset-env',{
  5. targets: {
  6. chrome: '67'
  7. },
  8. useBuiltIns: 'usage'
  9. }
  10. ],
  11. '@babel/preset-react'
  12. ]
  13. }
  1. 配置useBuiltIns: ‘usage’,可以减小打包提交,进行polyfill只编译项目中使用的语法。
  2. 先解析preset-react然后再解析preset-env。

plugins

  • clean-webpack-plugin: 清理dist目录文件
  • html-webpack-plugin: 根据设置的html模版,生成启动文件的index.html文件入口
  • minicssExtractPlugin:抽离css文件
  • workbox-webpack-plugin: PWA 离线缓存应用,创建service worker

优化

tree-shaking

5版本后, 默认会开启,自动过滤掉未使用的代码。
4版本,在package.json中,如果希望所有模块代码都进行tree-shaking过滤,可设置”sideEffects”: false。如果不希望一些模块执行tree-shaking可以设置”sideEffects”: [“@babel/polly-file”]进行排除。

注意⚠️:该功能只在ES Module语法下生效,即es6的 import。

Code Spliting&splitChunks

将代码进行代码分割,分成不同类型的js包。

  1. module.exports = {
  2. optimization:{
  3. splitChunks:{
  4. chunks: 'all', //all:对所有代码生效。async:对异步代码生效。initial:对同步代码分割
  5. minSize: 30000, //超过30kb,才进行代码分割
  6. maxSize: 3000000, //超过了3M,代码会进行二次代码分割。最大限制【某些库超过也无法分割】
  7. minChunks: 2, //拆分前必须共享模块的最小 chunks 数。超过该数值则抽离为单独chunk
  8. maxAsyncRequests: 30, //按需加载时的最大并行请求数,超过了就不进行代码分割
  9. maxInitialRequests: 30, //入口点的最大并行请求数
  10. automaticNameDelimiter: "~", //名称间的分割符
  11. name: true, // cacheGroups中设置的filename生效
  12. cacheGroups:{
  13. // 组名称
  14. common: {
  15. // 抽离公用代码
  16. },
  17. styles:{// 抽离样式代码
  18. },
  19. vendors:{// 抽离第三方模块公用代码
  20. },
  21. default:false
  22. }
  23. }
  24. }
  25. }

webpackPrefetch和webpackPreload

  1. document.addEventListener("click", ()=>{
  2. import(/* webpackPrefetch:true */ "./click.js").then(()=>{
  3. console.log("webpackPrefetch")
  4. })
  5. })
  6. document.addEventListener("click", ()=>{
  7. import(/* webpackPreLoad:true */ "./click.js").then(()=>{
  8. console.log("webpackPreLoad")
  9. })
  10. })

webpackPrefetch等页面核心代码加载完毕,会加载异步代码。webpackPreLoad会和主要代码一起进行加载。更多使用webpackPrefetch

performance

不显示警告

  1. module.exports = {
  2. performance: false
  3. }

DllPlugins

动态链接库 项目中使用了react和react-dom库,打包之后文件会非常大。DllPlugin可以先把react和react-dom单独抽离出来。

  1. 新建一个专门打包链接库的配置文件,webpack.config.dll.js
  1. let webpack = require('webpack');
  2. let path = require('path');
  3. module.exports = {
  4. mode: 'development',
  5. entry: {
  6. react: ['react', 'react-dom'],
  7. },
  8. output: {
  9. filename: '_dll_[name].js',
  10. path: path.resolve(__dirname, 'dist'),
  11. library: '_dll_[name]',
  12. // libraryTarget: 'var'
  13. },
  14. plugins: [
  15. new webpack.DllPlugin({
  16. name: '_dll_[name]',
  17. path: path.resolve(__dirname, 'dist', 'manifest.json'),
  18. }),
  19. ],
  20. };
  1. 执行npx webpack —config webpack.config.dll.js。打包出来_dll_react.js和manifest.json
  2. 在html模版中引入_dll_react.js静态文件,可以使用插件add-asset-html-webpack-plugin给html模板添加静态文件
  3. 给标准webpack配置文件添加插件
  1. plugins: [
  2. new webpack.DllReferencePlugin({
  3. manifest: path.resolve(__dirname, 'dist', 'manifest.json'),
  4. })
  5. ]

多进程打包

webpack4使用多线程打包的loader,webpack5可以使用thread-loader。以及parallel-webpack多页面插件打包
给less的loader在plugins中用happypack重新定义id为styles,重新设置less类型的loader解析

  1. module:[
  2. rules:[
  3. {
  4. test: /\.less$/,
  5. use: 'happypack/loader?id=styles',
  6. }
  7. ]
  8. ],
  9. // ...
  10. plugins:[
  11. new HappyPack({
  12. id: 'styles',
  13. threads: 2,
  14. loaders: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader'],
  15. })
  16. ]