create-react-app react-scripts 升

2023-06-16  本文已影响0人  mudssky

项目中react-scripts初始版本是3.4.1,好多年了一直没有人升级。

现在react官方的create-react-app版本已经到了5.x,而且官方都不怎么维护,开始在官方推荐nextjs之类的其他脚手架。

因为版本过低,eslint,和typescript之类的配套都用得不是很舒服。。。而且编译之类的也很慢。。。

迁移到vite,rspack之类的代价太大了,我准备先升级cra到最新版本看看。

升级的版本就是按照官方的changelog文件,跟着他的版本升级。

https://github.com/facebook/create-react-app/blob/main/CHANGELOG-3.x.md

之前也尝试过直接安装5.0,但是报错太多,直接放弃了。

跟着版本升级相对比较容易。。。

下面主要记录发生报错,需要其他调整的版本

4.0.0

这个版本升级了eslint相关,然后cacro报错了。

需要我们把cacro版本升级

 yarn add  --exact @craco/craco@6.0.0 -D

另外还有一个启动时的报错

noFallthroughCasesInSwitch

这个我们搜索changelog发现,在4.0.1就修复了,所以我们直接升级4.0.1

4.0.1

yarn add --exact react-scripts@4.0.1

升级到4.0.1我们发现,官方启动的时候,直接改了你的tsconfig配置 noFallthroughCasesInSwitch配置为true

还有图片地址变成 [object Module]

似乎是webpack的file loader 默认行为变了,需要配置

因为4.x版本,我发现总共只有3个版本,干脆直接升到4.0,3

4.0.3

控制台报错提示你安装一个插件,所以执行一下安装就行了

yarn add @babel/plugin-proposal-private-property-in-object -D

我们查看cacro更新文档可以发现,7.0版本开始都没有什么破坏性改动,所以直接升到6.4.3

 yarn add  --exact @craco/craco@6.4.3 -D

typescript 干脆直接升级到4.x的最新版,虽然这个版本的cra似乎只支持到4.5左右,但是但是问题不大。

 yarn add  --exact typescript@4.9.5 -D

这里出现一个问题,ts原来的版本是3.9,升到4.x后,出现一个报错,就是scss 和png图片文件开始找不到了module了

这个问题之前也碰到过,就是在d.ts声明文件里声明一下就好了。(其实不用配置,因为react-scripts的声明文件里面帮你配好了)

结果发现还是报错。

最后我发现是tsconfig配置的问题,有一个inculde选项,一般只要配你需要ts检查的目录就行了,一般只放一个src

但是我发现,我的"src/**/*.ts",也就是说只检查ts文件,难怪报找不到module的错误。。。

可能3.x的版本是不检查scss ,png这些资源的。。。

接下来把图片路径导入改一下,建议都改成import导入

或者在require的后面加一个.default

可以用vscode对require(搜索,基本上能找到图片require引入的地方了

升到4.0.3,我们就可以先提交代码,可以先停一停,观察一段时间。。。

5.0.1

直接升级到最新的5.0.1,因为我发现,除了最初的breaking change,后面基本是修修补补。。。

yarn add --exact react-scripts@5.0.1 -D

craco 也升级到最新的7.1.0

yarn add   @craco/craco@7.1.0 -D

craco start开局就报错了

我猜测是craco的一些插件不兼容了,所以我把webpack配置,插件都注释掉,可以成功启动。

之后出现webpack5的 78个error

先把eslint和ts check关了,不然错误太多,影响我们查看webpack的报错

craco弃用插件移除

比如HardSourceWebpackPlugin,

这个插件可以移除了,因为不支持webpack5,而且webpack5已经自带cache功能了

然后我们把以前的webpack配置注释掉,然后再慢慢加。。。。

babel/runtime

首先第一个问题是有很多 babel/runtime相关的报错,而且报错的地方不在我们的项目里,而是在node_modules里面。

比如antd的目录里面就有好几个报错。

似乎是因为,webpack5,不在内置babel的一些polyfill,所以我们需要自己安装

执行下面的代码安装最新版本的即可,现在是7.22.5版本

yarn add -D @babel/runtime

这个安装完以后瞬间错误就少了很多。

node ployfill

webpack5也移除了node 模块的ployfill,以后我们用到的需要自己安装了,

基本上node ployfill项目中也很少用到,我这边看到的报错,大部分还是node_modules里看到的。

这个现象可以说webpack越来越极端了,和vite就是两个方向的产品,webpack的配置是越来越麻烦。。。

安装下面几个node模块,就是报错里面提到的模块。

    "path": "^0.12.7",
    "process": "^0.11.10",
    "stream": "^0.0.2",
    "util": "^0.12.5"
    "buffer": "^6.0.3"

这些都安装了,之后就剩两三个报错了。

全路径问题 fully specific

webpack5 对路径的要求也更严格,需要是全路径。。。 比如 import lll/index,要改成ll/index.js

这个我们可以在cacro里面关掉

 configure: {
      // webpack 5 引入js 必须完全声明路径,这个配置是排除这个报错
      module: {
        rules: [
          {
            test: /\.m?js/,
            resolve: { fullySpecified: false },
          },
        ],
      },
    },
  },

svg namespace

这个报错是antd的Avatar上,加入svg图标报错。

似乎是webpack5 对svg格式要求更严格导致的。

网上搜到的解决方案是让你手动把svg里面的命名改成驼峰命名

或者用一个svg转jsx的网站。

手动改svg太麻烦,放弃。svg转jsx,试了发现转不了,也许是svg里面有中文的原因?

最后我用一个命令行工具解决了

npm i -g svgo

执行命令转化一下,会把svg进行压缩,去掉没用的部分

 svgo -i input.svg -o out.svg

process is not defined

process是node的模块里唯一用到的,因为用了环境变量,来区分生产环境,测试环境。。。。

之前那些

很多其他模块,都是node_modules里面的包报错,所以我们安装那些模块只是为了让webpack知道怎么找那些包。

process因为用到了,所以我们要让webpack知道。。。

const webpack = require('webpack')



webpack: {
    plugins: {
      add: [
        new webpack.ProvidePlugin({
          process: 'process/browser.js',
        }),
        new webpack.ProvidePlugin({
          //...
          Buffer: ['buffer', 'Buffer'],
        }),
      ],
    },

图片 require

记得4.x版本,require图片编程object module, 但是没想到5.0.1版本又改回来了。。

所以我们重新改回去,有问题的地方。

也就是说,不需要加.default了。

解决完上面的问题,项目已经可以正常运行了

ts报错

我们把ts检查打开,找到报错的地方解决就好了。

注意点

5.x版本已经移除了12以下版本的支持,所以现在要用更新版本的node了。

webpack5 官方也有迁移指南,https://webpack.docschina.org/migrate/5/,如果还有别的问题,可以看看这个官方文档。

上一篇下一篇

猜你喜欢

热点阅读