react-demo项目:webpack打包拆分优化(不使用create-react-app脚手架)

webpack.config.js未优化前

module: {
  rules: [{
    test: /\.(js|jsx)$/,
    exclude: /node_modules/,
    use: {
      loader: 'babel-loader',
    }
  }]
}

优化打包执行时间


module: {
  rules: [{
      test: /\.(js|jsx)$/,
      exclude: /node_modules/, // 不去查找的文件夹路径,node_modules下的代码是编译过得,没必要再去处理一遍
      include: [path.resolve('src')],// 只在src文件夹下查找
      use: {
        loader: 'babel-loader',
      },
    }]
}

optimizationp配置


const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: path.resolve(__dirname, './src/main.js'), // 入口文件
  mode: 'development',
  output: {
    filename: '[name]-bundle.js', // 出口文件
    path: path.resolve(__dirname, 'dist'), // 打包输出目录
  },
  devServer: {
    port: 9000, // 指定端口
  },
  module: {
    rules: [{
        test: /\.(js|jsx)$/,
        exclude: /node_modules/, // 不去查找的文件夹路径,node_modules下的代码是编译过得,没必要再去处理一遍
        include: [path.resolve('src')],// 只在src文件夹下查找
        use: {
          loader: 'babel-loader',
        },
      },
      {
        test: /\.html$/,
        use: [{
          loader: 'html-loader',
        }, ],
      },
      {
        test: /\.css$/,
        use: [{
            loader: 'style-loader',
          },
          {
            loader: 'css-loader',
            options: {
              modules: true
            }
          }
        ],
      },
      {
        test: /\.node$/,
        loader: 'node-loader',
      },
      {
        test: /\.s[ac]ss$/i,
        use: [
          // 将 JS 字符串生成为 style 节点
          'style-loader',
          // 将 CSS 转化成 CommonJS 模块
          'css-loader',
          // 将 Sass 编译成 CSS
          'sass-loader',
        ],
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './index.html',
      filename: './index.html',
    }),
  ],
};

未配置时打包信息如下

PS E:\目录\code\react-node-demo> npm run build

> react-node-demo@1.0.0 build E:\目录\code\react-node-demo
> webpack --config webpack.config.js

asset main-bundle.js 1.37 MiB [emitted] (name: main)
asset ./index.html 342 bytes [emitted]
runtime modules 1.07 KiB 6 modules
modules by path ./node_modules/ 1.27 MiB
  modules by path ./node_modules/style-loader/dist/runtime/*.js 5.75 KiB 6 modules
  modules by path ./node_modules/react-dom/ 1000 KiB 3 modules
  modules by path ./node_modules/react/ 85.7 KiB 2 modules
  modules by path ./node_modules/scheduler/ 17.3 KiB 2 modules
  modules by path ./node_modules/css-loader/dist/runtime/*.js 2.31 KiB 2 modules
  + 3 modules
modules by path ./src/ 9.12 KiB
  modules by path ./src/pages/ 4.23 KiB 6 modules
  modules by path ./src/*.js 953 bytes 2 modules
  modules by path ./src/*.css 2.55 KiB 2 modules
  ./src/App.jsx 1.41 KiB [built] [code generated]
webpack 5.75.0 compiled successfully in 1533 ms

打包优化配置


module.exports = {
  optimization: {
    splitChunks: {
      chunks: 'async',//这表明将选择哪些 chunk 进行优化。当提供一个字符串,有效值为 all,async 和 initial。
      minSize: 20000,//生成 chunk 的最小体积(以 bytes 为单位)。
      minRemainingSize: 0,//通过确保拆分后剩余的最小 chunk 体积超过限制来避免大小为零的模块
      minChunks: 1,//拆分前必须共享模块的最小 chunks 数。
      maxAsyncRequests: 30,//按需加载时的最大并行请求数。
      maxInitialRequests: 30,//入口点的最大并行请求数。
      enforceSizeThreshold: 50000,//强制执行拆分的体积阈值和其他限制(minRemainingSize,maxAsyncRequests,maxInitialRequests)将被忽略。
      cacheGroups: {//缓存组可以继承和/或覆盖来自 splitChunks.* 的任何选项。但是 test、priority 和 reuseExistingChunk 只能在缓存组级别上进行配置。将它们设置为 false以禁用任何默认缓存组。
        vendors: {
          name: 'vendors',
          chunks: 'all',
          test: /[\\/]node_modules[\\/](react|react-dom|react-router-dom)[\\/]/,
          priority: 100,
        },
      },
    },
  },  
};

配置后打包信息如下

PS E:\目录\code\react-node-demo> npm run build

> react-node-demo@1.0.0 build E:\目录\code\react-node-demo
> webpack --config webpack.config.js

asset vendors-bundle.js 1.14 MiB [emitted] (name: vendors) (id hint: vendors)
asset main-bundle.js 244 KiB [emitted] (name: main)
asset ./index.html 389 bytes [emitted]
Entrypoint main 1.38 MiB = vendors-bundle.js 1.14 MiB main-bundle.js 244 KiB 
runtime modules 3.47 KiB 8 modules
cacheable modules 1.28 MiB
  modules by path ./node_modules/ 1.27 MiB 18 modules
  modules by path ./src/ 9.12 KiB
    modules by path ./src/pages/ 4.23 KiB 6 modules
    modules by path ./src/*.js 953 bytes 2 modules
    modules by path ./src/*.css 2.55 KiB 2 modules
    ./src/App.jsx 1.41 KiB [built] [code generated]
webpack 5.75.0 compiled successfully in 1533 ms

修改打包优化配置,引入antd组件库

  optimization: {
    splitChunks: {
      chunks: 'async',//这表明将选择哪些 chunk 进行优化。当提供一个字符串,有效值为 all,async 和 initial。
      minSize: 20000,//生成 chunk 的最小体积(以 bytes 为单位)。
      minRemainingSize: 0,//通过确保拆分后剩余的最小 chunk 体积超过限制来避免大小为零的模块
      minChunks: 1,//拆分前必须共享模块的最小 chunks 数。
      maxAsyncRequests: 30,//按需加载时的最大并行请求数。
      maxInitialRequests: 30,//入口点的最大并行请求数。
      enforceSizeThreshold: 50000,//强制执行拆分的体积阈值和其他限制(minRemainingSize,maxAsyncRequests,maxInitialRequests)将被忽略。
      cacheGroups: {//缓存组可以继承和/或覆盖来自 splitChunks.* 的任何选项。但是 test、priority 和 reuseExistingChunk 只能在缓存组级别上进行配置。将它们设置为 false以禁用任何默认缓存组。
        vendors: {
          name: 'vendors',
          chunks: 'all',
          test: /[\\/]node_modules[\\/](react|react-dom|react-router-dom)[\\/]/,
          priority: 100,
        },
        autd: {
          name: 'antd',
          chunks: 'all',
          test: /[\\/]node_modules[\\/](antd)[\\/]/,
          priority: 100,
        },
      },
    },
  },  

PS E:\目录\code\react-node-demo> npm run build

> react-node-demo@1.0.0 build E:\目录\code\react-node-demo
> webpack --config webpack.config.js

asset vendors-bundle.js 1.14 MiB [compared for emit] (name: vendors) (id hint: vendors)
asset main-bundle.js 532 KiB [emitted] (name: main)
asset antd-bundle.js 156 KiB [emitted] (name: antd) (id hint: autd)
asset ./index.html 433 bytes [emitted]
Entrypoint main 1.81 MiB = antd-bundle.js 156 KiB vendors-bundle.js 1.14 MiB main-bundle.js 532 KiB
orphan modules 3.15 MiB [orphan] 1037 modules
runtime modules 3.81 KiB 9 modules
cacheable modules 1.52 MiB
  modules by path ./node_modules/ 1.51 MiB 143 modules
  modules by path ./src/ 9.64 KiB
    modules by path ./src/pages/ 4.68 KiB 7 modules
    modules by path ./src/*.js 987 bytes
      ./src/main.js 340 bytes [built] [code generated]
      ./src/router.js 647 bytes [built] [code generated]
    modules by path ./src/*.css 2.55 KiB
      ./src/App.css 1.16 KiB [built] [code generated]
      ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[2].use[1]!./src/App.css 1.38 KiB [built] [code generated]
    ./src/App.jsx 1.45 KiB [built] [code generated]
webpack 5.75.0 compiled successfully in 3907 ms
PS E:\目录\code\react-node-demo> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值