craco + webpack 4 升 5

2023-12-11 22:15
文章标签 webpack craco

本文主要是介绍craco + webpack 4 升 5,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

craco + webpack 4 升 5

  • 更新包版本
  • 尝试build
  • 升级其他依赖库
  • 使用process插件打印进度信息
  • 到底需要多少内存
  • 分析构建产出
  • 添加 splitChunk
  • 总结
      • 记录一些好文章:

我的项目使用 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

这篇关于craco + webpack 4 升 5的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/482287

相关文章

vue-cli webpack在node环境下安装使用

第一步,需要下载并安装node.js以及他的npm组件;   第二步,用node -v;npm -v来测试node.js以及npm是否安装成功(建议用GIT命令行工具,因为GIT是linux系统),如果显示出它的版本,说明已经安装成功,如下图;   第三步,下载vue-cli,在命令行中输入npm install -g vue-cli,自动下载vue-cli(会生成一大堆的依

webpack-AST剖析

webpack-AST 目录 文章目录 前言推荐阅读拆解函数`AST`工具 - `recast`制作模具 - `recast.types.builders`如何改装 实战 - 命令行修改`js`文件`recast.visit` - `AST`节点遍历`TNT` - 判断`AST`对象类型`AST`修改源码,导出全部方法`Builder`实现一个箭头函数 `exportific`前端工具使用

webpack-模块热替换剖析

webpack-模块热替换剖析 目录 文章目录 前言推荐阅读前提`HMR`应用开启`HMR`开启`webpack-dev-server`的`HMR`手动添加代码 `HMR`原理步骤 前言 主要讲解热更新的原理 推荐阅读 《webpack实战 入门、进阶与调优》 前提 早期调试代码基本都是 改代码 - 刷新网页 - 查看 - 修改代码第一次提升效率:工具检测到代码改动

webpack处理css

在神奇的babel中我们提到了babel-loder的使用,那么webpack声称可以处理任何类型的文件,css该怎么处理呢,好,我们来走一遍 首先介绍下style-loader和css-loader,因为处理css文件之前必须要安装这两个模块,至于这俩是从哪冒出来的,请看点击打开链接,这里详细介绍了各种loader的使用场景。 npm install css-loader style-l

webpack的文件监听实现(热更新)

注意:安装之前,先保证webpack项目能正常运行! 目录 前言1 第一种方式, --watch1.1 配置package.json1.2 到控制台输入 npm run watch1.3 修改文件,保存后,会自动打包,到浏览器刷新,才能看到变化。1.4 文件监听的原理理分析 2 第二种方式,在配置 webpack.config.js 中设置 watch: true(热更新:webpack-

webpack解析字体,file-loader

注意:安装之前,先保证webpack项目能正常运行! 因为字体和图片都不是代码文件,所以,都可以使用file-loader 1.安装 file-loader 依赖 cnpm i file-loader -D 2.在src目录下创建font文件夹,并引入字体 (这里引入AdobeGothicStd-Bold.otf.otf ) 3.配置,在 webpack.config.js 下新增配置:

webpack解析css, less,scss

注意:安装之前,先保证webpack项目能正常运行!   1.安装依赖 npm install style-loader css-loader -D npm install less less-loader -D   2.配置,在 webpack.json.js 下,新增规则: module.exports = {// ...module:{rules:[// ...// 新增cs

webpack解析React JSX

1.安装 cnpm i react react-dom @babel/preset-react -D 2.在 .babelrc 文件下,增加配置: {"presets": ["@babel/preset-env","@babel/preset-react" // 新增 react 配置]}

webpack解析ES6

注意:安装之前,先保证webpack项目能正常运行! 1.安装 npm i @babel/core @babel/preset-env babel-loader -D   2.在src目录下,创建 .bebalrc 文件,并配置: {"presets": ["@babel/preset-env"]} 3.修改 webpack.config.js 配置: module.exports

webpack对样式的处理

webpack对样式的处理   原文地址:https://github.com/zhengweikeng/blog/issues/9 我们可以在js中引入样式文件 require('myStyle.css') 这时我们便需要引入相应的webpack loader来帮助我们解析这段代码。 一般来说需要引入css-loader和style-loader,其中css-load