eslint.js(二选一)

  • npm install eslint eslint-loader -D (检验代码规范)
  • npx eslint —init (初始化 eslint 配置文件 )
  1. rules:[
  2. {
  3. test: /\.js$/,
  4. use:'eslint-loader',
  5. enforce: 'pre'
  6. },
  7. ]

sourceMap (代码排查,调试错误)

  • 开发环境使用: cheap-module-eval-source-map
  • 生产环境使用: cheap-module-source-map

Tree-shaking & scopeHosting (生产环境)

  • 在 package 文件中设置 “sideEffects”: “false”, 把副作用的数据删除掉
  • “sideEffects”: [“*/.css”], 去除 css 文件

[ scopeHosting ] (自带)减少作用域

热更新

  1. devServer: {
  2. port: 8081,
  3. open: true,
  4. compress: true,
  5. hot: true, // 热更新 仅更新更改的代码 局部刷新 减少数据请求数量
  6. },
  7. // webpack css 强制热更新插件
  8. new webpack.HotModuleReplacementPlugin(),
  9. let op = document.createElement('p');
  10. op.innerHTML = plus(10,5);
  11. document.body.appendChild(op)
  12. // js 代码的热更新
  13. if(module.hot) {
  14. module.hot.accept('./test',()=>{
  15. let plus = require('./test').default;
  16. op.innerHTML = plus(20,5);
  17. })
  18. }

注:当把 css 文件分离出后 热更新只执行一次 后续失效

懒加载(动态加载模块)

  • webpackPrefetch 利用浏览器空闲时间,把动态模块加载完成并引入 前提:主要模块加载完成后
  • webpackPreload 预加载 和主模块加载同时进行加载,不会引入
  • webpackChunkName 文件名字
  1. output: {
  2. filename: '[name].js',
  3. path: path.resolve(__dirname, 'dist'),
  4. // 动态模块名字 name 代表 01234
  5. chunkFilename:'[name].min.js'
  6. },
  7. import(/*webpackPrefetch:true*/'./test').then(({default:m})=>{
  8. op.innerHTML = m(20,50)
  9. });

打包文件分析工具 (生产环境)

  • npm install webpack-bundle-analyzer

optimization.splitChunks

  1. optimization: {
  2. minimizer: [
  3. new OptimizeCssAssetsPlugin()
  4. ],
  5. splitChunks: {
  6. chunks: 'all', // 同异步 all 所有
  7. minSize: 30000, // 至少 30 kb 才去抽离
  8. maxSize: 0,
  9. minChunks: 1, // 至少抽离第三方模块 1 个
  10. maxAsyncRequests: 6, // 引入模块异步请求次数
  11. maxInitialRequests: 4, // 首屏加载的请求次数
  12. automaticNameDelimiter: '~', // 文件之间的连接符
  13. automaticNameMaxLength: 30,
  14. cacheGroups: { // 缓存组, 可以设置一些规则
  15. vendors: {
  16. test: /[\\/]node_modules[\\/]/,
  17. priority: -10 // 优先级
  18. },
  19. default: {
  20. minChunks: 2,
  21. priority: -20, // 优先级
  22. reuseExistingChunk: true
  23. }
  24. }
  25. }
  26. },

resolve 解析

  • extensions 添加扩展名进行匹配
  • alias 设置别名
  1. resolve: {
  2. extensions: ['.js', '.jsx', '.json', '.css', '.ts', '.tsx', '.vue'],
  3. alias:{
  4. '@':path.resolve(__dirname,'src'),
  5. 'test': path.resolve(__dirname,'src/test')
  6. }
  7. }

happypack

  • npm install happypack -D (多线程打包,把不同的逻辑交给不同的线程处理)

根据 mode 分离配置环境

  • webpack.base.js 公共配置
  • webpack.dev.js 开发环境配置
  • webpack.prod.js 生产环境配置
  • package.json 文件的 scripts 属性中配置执行命令
    • 开发环境打包: “dev”: “webpack —env.development —config./webpack.base.js”,
    • 生产环境打包:”build”: “webpack —env.production —config./webpack.base.js”,
    • 服务器: “dev-s”: “webpack-dev-server —env.development —config./webpack.base.js”
  • npm install webpack-merge

图片压缩

  • npm install image-webpack-loader -D
  1. {
  2. test: /\.(gif|png|jpe?g|svg)$/i,
  3. use: [
  4. 'file-loader',
  5. {
  6. loader: 'image-webpack-loader',
  7. options: {
  8. mozjpeg: {
  9. progressive: true,
  10. quality: 65 // 图片品质
  11. },
  12. // optipng.enabled: false will disable optipng
  13. optipng: {
  14. enabled: false,
  15. },
  16. pngquant: {
  17. quality: [0.65, 0.90],
  18. speed: 4
  19. },
  20. gifsicle: {
  21. interlaced: false,
  22. },
  23. // the webp option will enable WEBP
  24. webp: {
  25. quality: 75
  26. }
  27. }
  28. },
  29. ],
  30. }