craco + webpack 4 升 5


我的项目使用 craco + react 开发
我的 package.json

{
   
  // ......
  "dependencies": {
   
    "@ant-design/icons": "^4.7.0",
    "antd": "^4.17.2",
    "react": "^17.0.2",
    "react-dom": "^17.0.2"
  },
  "devDependencies": {
   
    "@craco/craco": "^6.1.1",
    "react-scripts": "^4.0.3"
  }
}

想要升级到 webpack 5,此篇blog记录升级过程。

更新包版本

  • 直接 npm install webpack@latest

尝试build

  • 执行 npm run build
    报错出现:
    在这里插入图片描述
  • 按报错信息尝试使用 export SKIP_PREFLIGHT_CHECK=true && npm run build
    还是报错:在这里插入图片描述

升级其他依赖库

  • 那就老老实实的升级一下 npm install react-scripts@latest
    有一些warn, 但是不要紧
    在这里插入图片描述

  • 再次执行build,npm run build
    执行了很长时间,然后报错,内存直接超了
    在这里插入图片描述

  • 尝试把内存开到 8G , npm run build --max-old-space-size=8000 ,还是一样报错

    我的虚拟机只有8G内存,极限了。而且不应该呀,编译怎么需要这么多内存

使用process插件打印进度信息

webpack 自带了ProgressPlugin, 加到 craco.config.js

const webpack = require('webpack');

function configureWebpack(webpackConfig, {
    env, paths}) {
   
    const processPlugin = new webpack.ProgressPlugin({
   
        activeModules: false,
        entries: true,
        handler(percentage, message, ...args) {
   
            console.info(percentage, message, ...args);
        },
        modules: true,
    });
    webpackConfig.plugins.push(processPlugin);
    return webpackConfig;
}

module.exports = {
   
    webpack: {
   
        configure: configureWebpack,
    },
};
  • 再执行 npm run build, 就可以看到进度信息:
    在这里插入图片描述
    发现:

    1. TerserPlugin:执行了非常久。 这是一个代码压缩插件,webpack v5 开箱即带,应该没有问题。
    2. 在SourceMapDevToolPlugin 阶段报错。SourceMap 就是一个信息文件,里面储存着代码的位置信息。 这种文件主要用于开发调试,现在代码都会经过压缩混淆,这样报错提示会很难定位代码。 通过SourceMap 能快速定位到源代码,并进行调试。 通常情况SourceMap 在开发环境开启,线上环境关闭。
  • 修改craco.config.js,不执行source map,将 devtool 改为undefined,重试。 果然成功。

function configureWebpack(webpackConfig, {
    env, paths}) {
   
    //   ......   省略
	webpackConfig.devtool = undefined;
	return webpackConfig;
}

到底需要多少内存

虽然上线已经成功了,但是这样不是办法,source_map在开发阶段是必须的。我们还是要彻底解决这个问题。
首先,我们来验证一下 是内存真的不够大还是有内存溢出的BUG,我找了一个大内存的机器试了一下,还真能跑通,npm内存使用最高时达到 12G
网上查了各种资料没有说webpack5会使用这么大的内存。都是说webpack5打包更小更快。
结果我的又慢又占内存,build结果更大。

分析构建产出

使用webpack-bundle-analyzer插件,分析build结果,
配置方法参考: https://www.jianshu.com/p/77c0b68c9f13

  • 老环境效果:
    在这里插入图片描述

  • 新环境效果
    在这里插入图片描述

发现 新的构建产出中, 每个入口文件(这个项目是多页应用)都用很多modules, 而老的构建中则没有。
点击左上角箭头,展开concatenated :
在这里插入图片描述
效果:
在这里插入图片描述

发现这些都是基础antd组件。

结论:新构建没有将公共依赖库分离。

添加 splitChunk

代码分离 splitChunk 是非常常用的优化方式,webpack4开始就已经可以直接使用:https://webpack.docschina.org/plugins/split-chunks-plugin/

不清楚为什么升级之后就没有这个参数了,打印craco最终的webpack_conf看一下,

function configureWebpack(webpackConfig, {
    env, paths}) {
   
    //   ......   省略
	console.log(webpackConfig);
	return webpackConfig;
}

果然少了splitChunk插件。

老环境输出 新环境输出
在这里插入图片描述 在这里插入图片描述

那就自己加上吧:

function configureWebpack(webpackConfig, {
    env, paths}) {
   
    //   ......   省略
	webpackConfig.optimization.splitChunks = {
   
        chunks: 'all',
        name: false
    };
    console.log(webpackConfig);
	return webpackConfig;
}

重试 npm run build,之前的问题全部解决:
速度 3min -> 2min, 大小 70 -> 2, 内存 12g -> 1.2g

总结

  • react-scripts 的这一版升级,有点坑呀,这么重要的插件都没有装。
  • 不过这个splitChunk插件尽然能有如此大的提升,确实出乎意料。
  • 分析一下 应该是生成source_map的过程会很慢,很占内存。开启chunk后,单个chunk变小,也少了很多重复编译,所以快了。
  • webpack4 升 5本身的成本较低,几乎不用修改。

记录一些好文章:

  • 前端工程化学习笔记:https://static.kancloud.cn/cyyspring/webpack/1857794
  • webpack性能优化方案: https://yejiwei.com/post/98
  • webpack性能优化(2):splitChunks用法详解: https://zhuanlan.zhihu.com/p/615064733

相关推荐

  1. 本-现代通信技术5G

    2023-12-08 17:10:03       18 阅读
  2. 《Webpack5 升级》- Vue2.x 组件库 Webpack3 5

    2023-12-08 17:10:03       41 阅读
  3. <span style='color:red;'>5</span>.<span style='color:red;'>4</span>作业

    5.4作业

    2023-12-08 17:10:03      9 阅读
  4. Cweek<span style='color:red;'>4</span>+<span style='color:red;'>5</span>

    Cweek4+5

    2023-12-08 17:10:03      12 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 17:10:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 17:10:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 17:10:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 17:10:03       20 阅读

热门阅读

  1. [python高级编程]:01-数据结构

    2023-12-08 17:10:03       42 阅读
  2. 机器学习算法汇总--GBDT、XGBoost等

    2023-12-08 17:10:03       40 阅读
  3. c++的排序算法

    2023-12-08 17:10:03       29 阅读
  4. [linux] git lfs install 安装lfs

    2023-12-08 17:10:03       38 阅读
  5. redis的工具类详细

    2023-12-08 17:10:03       30 阅读
  6. 98765

    2023-12-08 17:10:03       34 阅读
  7. C++初学教程三

    2023-12-08 17:10:03       40 阅读