1. 程式人生 > 其它 >Node.js躬行記(17)——UmiJS版本升級

Node.js躬行記(17)——UmiJS版本升級

  在2020年我剛到公司的時候,公司使用的版本還是1.0,之後為了引入微前端,迫不得已被動升級。

一、從 1.0 到 2.0

  在官方文件中,有專門一頁講如何升級的,這個使用者體驗非常好。

  一個清單列的非常清楚,內容不多,讓我信心大增。並且自己之前也曽依託 umi 2.0開源過一套系統

  所以在實際操作中,升級遇到的阻力沒有我想象中的那麼大,但期間還是遇到了些難纏的問題,諸如頁面空白,檔案不存在等。

  具體的改造其實就那麼幾步,升級和替換依賴庫,更正路由配置,去除過時檔案等。

  改造好後,自己粗略的刷刷頁面,沒啥問題,然後就開心地釋出到預發環境。但是在生成source map檔案時,報記憶體棧溢位。

  source map檔案主要用於監控系統中的程式碼還原,在實際使用中用的比較少,那就先暫時關閉了。

  不過在生產釋出的時候,又會報沒有source map檔案,因為生產有個將檔案搬移到指定位置的指令碼,得把這個指令碼也關閉。

二、從 2.0 到 3.0

  為了能更好的引入TypeScript,提升專案程式碼質量的主動升級,根據官方給出的升級文件進行了改造。

1)router改造

  原先 component 中的路徑可以包含斜槓,現在不行,因為 Recommend 目錄中沒有預設的 index.js 檔案。

{
  path: '/video/recommend',
  exact: true
, component: 'video/Recommend/', } 改成 { path: '/video/recommend', exact: true, component: 'video/Recommend', }

2)model.js驗證

  預設會做 model 檔案的驗證,但是我有個檔案中包含 jsx 程式碼,導致無法驗證通過,會報解析錯誤。

Dva model src/models/playViewer.js parse failed, SyntaxError: Unexpected token, expected "," (71:20)

  後面就在 .umirc.js 配置檔案中取消了驗證,skipModelValidate 設定為 true。

export default {
  antd: {},
  dva: {  // 啟用引入dva
    skipModelValidate: true   //跳過 model 驗證
  },
}

3)namespace不唯一

  專案構建的時候,報model的namespace重名的錯誤,因為 pages 子目錄中的檔名都叫model.js。

pages
    foo/model.js
    bar/model.js

  下面是具體的報錯資訊,查了框架的issue,發現還蠻多人有這問題的,但是我都升級到最新版本還是有問題。

./src/.umi/plugin-dva/dva.ts
[app.model] namespace should be unique
app.model({ namespace: 'model', ...ModelModel29 });
app.model({ namespace: 'model', ...ModelModel30 });
app.model({ namespace: 'model', ...ModelModel31 });
app.model({ namespace: 'model', ...ModelModel32 });

  後面發現將檔案改個名字,然後放到models目錄中,就不會唯一了。但是有300多張頁面,都得手動處理。

pages
    foo/
        models/login.js
    bar/model.js

  沒有找到更有效更直接的方法,只能用這種笨辦法了,弄了好幾個小時。

  中途也發現,很多頁面已經廢棄了,馬上決定移除。

4)Link元件

  之前Link元件都是從react-router-dom匯入的,但現在會報錯:Error: Invariant failed: You should not use <Link> outside a <Router>。

  這個好弄,只要換個庫就行。 

- import { Link } from 'react-router-dom';
+ import { Link } from 'umi';

5)警告

  有個比較奇怪的警告,會一直提示,網上很多重複的帖子就是去本地 dva 庫替換某條語句,還有就是升級到 2.6 版本。

Warning: Please use `require("history").createHashHistory` instead of `require("history/createHashHistory")`. Support for the latter will be removed in the next major release.

  我升級到最新後,還是會有這個提示,就看原始碼,發現註釋掉 dva/router.js 的第一句就行了,不過發到線上後,就不會有這個警告了。

require('./warnAboutDeprecatedCJSRequire.js')('router');
module.exports = require('react-router-dom');
module.exports.routerRedux = require('connected-react-router');