create-react-app react-scripts 升級(jí)具温,從3.x升到5.x踩坑(webpack5升級(jí)踩坑)

項(xiàng)目中react-scripts初始版本是3.4.1蚕涤,好多年了一直沒(méi)有人升級(jí)。

現(xiàn)在react官方的create-react-app版本已經(jīng)到了5.x铣猩,而且官方都不怎么維護(hù)揖铜,開(kāi)始在官方推薦nextjs之類的其他腳手架。

因?yàn)榘姹具^(guò)低达皿,eslint蛮位,和typescript之類的配套都用得不是很舒服较沪。。失仁。而且編譯之類的也很慢尸曼。。萄焦。

遷移到vite,rspack之類的代價(jià)太大了控轿,我準(zhǔn)備先升級(jí)cra到最新版本看看。

升級(jí)的版本就是按照官方的changelog文件拂封,跟著他的版本升級(jí)茬射。

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

之前也嘗試過(guò)直接安裝5.0,但是報(bào)錯(cuò)太多冒签,直接放棄了在抛。

跟著版本升級(jí)相對(duì)比較容易。萧恕。刚梭。

下面主要記錄發(fā)生報(bào)錯(cuò),需要其他調(diào)整的版本

4.0.0

這個(gè)版本升級(jí)了eslint相關(guān)票唆,然后cacro報(bào)錯(cuò)了朴读。

需要我們把cacro版本升級(jí)

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

另外還有一個(gè)啟動(dòng)時(shí)的報(bào)錯(cuò)

noFallthroughCasesInSwitch

這個(gè)我們搜索changelog發(fā)現(xiàn),在4.0.1就修復(fù)了走趋,所以我們直接升級(jí)4.0.1

4.0.1

yarn add --exact react-scripts@4.0.1

升級(jí)到4.0.1我們發(fā)現(xiàn)衅金,官方啟動(dòng)的時(shí)候,直接改了你的tsconfig配置 noFallthroughCasesInSwitch配置為true

還有圖片地址變成 [object Module]

似乎是webpack的file loader 默認(rèn)行為變了簿煌,需要配置

因?yàn)?.x版本氮唯,我發(fā)現(xiàn)總共只有3個(gè)版本,干脆直接升到4.0,3

4.0.3

控制臺(tái)報(bào)錯(cuò)提示你安裝一個(gè)插件,所以執(zhí)行一下安裝就行了

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

我們查看cacro更新文檔可以發(fā)現(xiàn)姨伟,7.0版本開(kāi)始都沒(méi)有什么破壞性改動(dòng)您觉,所以直接升到6.4.3

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

typescript 干脆直接升級(jí)到4.x的最新版,雖然這個(gè)版本的cra似乎只支持到4.5左右授滓,但是但是問(wèn)題不大琳水。

 yarn add  --exact typescript@4.9.5 -D

這里出現(xiàn)一個(gè)問(wèn)題,ts原來(lái)的版本是3.9般堆,升到4.x后在孝,出現(xiàn)一個(gè)報(bào)錯(cuò),就是scss 和png圖片文件開(kāi)始找不到了module了

這個(gè)問(wèn)題之前也碰到過(guò)淮摔,就是在d.ts聲明文件里聲明一下就好了私沮。(其實(shí)不用配置,因?yàn)閞eact-scripts的聲明文件里面幫你配好了)

結(jié)果發(fā)現(xiàn)還是報(bào)錯(cuò)和橙。

最后我發(fā)現(xiàn)是tsconfig配置的問(wèn)題仔燕,有一個(gè)inculde選項(xiàng)造垛,一般只要配你需要ts檢查的目錄就行了,一般只放一個(gè)src

但是我發(fā)現(xiàn)晰搀,我的"src/**/*.ts",也就是說(shuō)只檢查ts文件五辽,難怪報(bào)找不到module的錯(cuò)誤。外恕。杆逗。

可能3.x的版本是不檢查scss ,png這些資源的鳞疲。罪郊。。

接下來(lái)把圖片路徑導(dǎo)入改一下尚洽,建議都改成import導(dǎo)入

或者在require的后面加一個(gè).default

可以用vscode對(duì)require(搜索悔橄,基本上能找到圖片require引入的地方了

升到4.0.3,我們就可以先提交代碼腺毫,可以先停一停癣疟,觀察一段時(shí)間。拴曲。争舞。

5.0.1

直接升級(jí)到最新的5.0.1凛忿,因?yàn)槲野l(fā)現(xiàn)澈灼,除了最初的breaking change,后面基本是修修補(bǔ)補(bǔ)店溢。叁熔。。

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

craco 也升級(jí)到最新的7.1.0

yarn add   @craco/craco@7.1.0 -D

craco start開(kāi)局就報(bào)錯(cuò)了

我猜測(cè)是craco的一些插件不兼容了床牧,所以我把webpack配置荣回,插件都注釋掉,可以成功啟動(dòng)戈咳。

之后出現(xiàn)webpack5的 78個(gè)error

先把eslint和ts check關(guān)了心软,不然錯(cuò)誤太多,影響我們查看webpack的報(bào)錯(cuò)

craco棄用插件移除

比如HardSourceWebpackPlugin,

這個(gè)插件可以移除了著蛙,因?yàn)椴恢С謜ebpack5删铃,而且webpack5已經(jīng)自帶cache功能了

然后我們把以前的webpack配置注釋掉,然后再慢慢加踏堡。猎唁。。顷蟆。

babel/runtime

首先第一個(gè)問(wèn)題是有很多 babel/runtime相關(guān)的報(bào)錯(cuò)诫隅,而且報(bào)錯(cuò)的地方不在我們的項(xiàng)目里腐魂,而是在node_modules里面。

比如antd的目錄里面就有好幾個(gè)報(bào)錯(cuò)逐纬。

似乎是因?yàn)榛滓伲瑆ebpack5,不在內(nèi)置babel的一些polyfill风题,所以我們需要自己安裝

執(zhí)行下面的代碼安裝最新版本的即可判导,現(xiàn)在是7.22.5版本

yarn add -D @babel/runtime

這個(gè)安裝完以后瞬間錯(cuò)誤就少了很多。

node ployfill

webpack5也移除了node 模塊的ployfill沛硅,以后我們用到的需要自己安裝了眼刃,

基本上node ployfill項(xiàng)目中也很少用到,我這邊看到的報(bào)錯(cuò)摇肌,大部分還是node_modules里看到的擂红。

這個(gè)現(xiàn)象可以說(shuō)webpack越來(lái)越極端了,和vite就是兩個(gè)方向的產(chǎn)品围小,webpack的配置是越來(lái)越麻煩昵骤。。肯适。

安裝下面幾個(gè)node模塊,就是報(bào)錯(cuò)里面提到的模塊变秦。

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

這些都安裝了,之后就剩兩三個(gè)報(bào)錯(cuò)了框舔。

全路徑問(wèn)題 fully specific

webpack5 對(duì)路徑的要求也更嚴(yán)格蹦玫,需要是全路徑。刘绣。樱溉。 比如 import lll/index,要改成ll/index.js

這個(gè)我們可以在cacro里面關(guān)掉

 configure: {
      // webpack 5 引入js 必須完全聲明路徑,這個(gè)配置是排除這個(gè)報(bào)錯(cuò)
      module: {
        rules: [
          {
            test: /\.m?js/,
            resolve: { fullySpecified: false },
          },
        ],
      },
    },
  },

svg namespace

這個(gè)報(bào)錯(cuò)是antd的Avatar上纬凤,加入svg圖標(biāo)報(bào)錯(cuò)福贞。

似乎是webpack5 對(duì)svg格式要求更嚴(yán)格導(dǎo)致的。

網(wǎng)上搜到的解決方案是讓你手動(dòng)把svg里面的命名改成駝峰命名

或者用一個(gè)svg轉(zhuǎn)jsx的網(wǎng)站停士。

手動(dòng)改svg太麻煩挖帘,放棄。svg轉(zhuǎn)jsx恋技,試了發(fā)現(xiàn)轉(zhuǎn)不了拇舀,也許是svg里面有中文的原因?

最后我用一個(gè)命令行工具解決了

npm i -g svgo

執(zhí)行命令轉(zhuǎn)化一下猖任,會(huì)把svg進(jìn)行壓縮你稚,去掉沒(méi)用的部分

 svgo -i input.svg -o out.svg

process is not defined

process是node的模塊里唯一用到的,因?yàn)橛昧谁h(huán)境變量,來(lái)區(qū)分生產(chǎn)環(huán)境刁赖,測(cè)試環(huán)境搁痛。。宇弛。鸡典。

之前那些

很多其他模塊,都是node_modules里面的包報(bào)錯(cuò)枪芒,所以我們安裝那些模塊只是為了讓webpack知道怎么找那些包彻况。

process因?yàn)橛玫搅耍晕覀円寃ebpack知道舅踪。纽甘。。

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悍赢, 但是沒(méi)想到5.0.1版本又改回來(lái)了。货徙。

所以我們重新改回去左权,有問(wèn)題的地方。

也就是說(shuō)痴颊,不需要加.default了赏迟。

解決完上面的問(wèn)題,項(xiàng)目已經(jīng)可以正常運(yùn)行了

ts報(bào)錯(cuò)

我們把ts檢查打開(kāi)蠢棱,找到報(bào)錯(cuò)的地方解決就好了锌杀。

注意點(diǎn)

5.x版本已經(jīng)移除了12以下版本的支持,所以現(xiàn)在要用更新版本的node了裳扯。

webpack5 官方也有遷移指南抛丽,https://webpack.docschina.org/migrate/5/谤职,如果還有別的問(wèn)題饰豺,可以看看這個(gè)官方文檔吟宦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牍疏,一起剝皮案震驚了整個(gè)濱河市戏仓,隨后出現(xiàn)的幾起案子径缅,更是在濱河造成了極大的恐慌舰蟆,老刑警劉巖祟峦,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件声滥,死亡現(xiàn)場(chǎng)離奇詭異呜叫,居然都是意外死亡妓蛮,警方通過(guò)查閱死者的電腦和手機(jī)怠李,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人捺癞,你說(shuō)我怎么就攤上這事夷蚊。” “怎么了髓介?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵惕鼓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我唐础,道長(zhǎng)箱歧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任一膨,我火速辦了婚禮呀邢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豹绪。我一直安慰自己驼鹅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布森篷。 她就那樣靜靜地躺著输钩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仲智。 梳的紋絲不亂的頭發(fā)上买乃,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音钓辆,去河邊找鬼剪验。 笑死,一個(gè)胖子當(dāng)著我的面吹牛前联,可吹牛的內(nèi)容都是我干的功戚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼似嗤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼啸臀!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起烁落,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乘粒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后伤塌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體灯萍,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年每聪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旦棉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片齿风。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绑洛,靈堂內(nèi)的尸體忽然破棺而出聂宾,到底是詐尸還是另有隱情,我是刑警寧澤诊笤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布系谐,位于F島的核電站,受9級(jí)特大地震影響讨跟,放射性物質(zhì)發(fā)生泄漏纪他。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一晾匠、第九天 我趴在偏房一處隱蔽的房頂上張望茶袒。 院中可真熱鬧,春花似錦凉馆、人聲如沸薪寓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)向叉。三九已至,卻和暖如春嗦董,著一層夾襖步出監(jiān)牢的瞬間母谎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工京革, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奇唤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓匹摇,卻偏偏與公主長(zhǎng)得像咬扇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子廊勃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容