公司之前所有的 Node 項目,其環境都是 8.9.4 版本,發布于 2018 年的一個比較古老的版本。
  老版本有兩個比較明顯的問題:
1. Node 高版本的特性和方法都無法使用。
2. 有些第三方新版本的包無法安裝和升級,該包可能依賴比較高的 Node 版本。
  之前在開發項目時就遇到第三方包自身的問題,必須升級或換個包才能解決,但因為 Node 版本的原因,無法替換,只能用其他方式來修補漏洞。
  為了提升維護性和開發體驗,還是決定升級 Node 版本,2021年升級過一次,升級到 14 版本。
  但是因為一些奇怪的問題加上業務繁重,沒有時間細究,就又回滾了,一直拖到今年的 7 月份,才繼續推進升級的事情,本次會升級到 16.15 版本。
  目前總共有 4 個 Node 環境需要升級,測試資源緊張,在升級后,是沒有人力來驗證是否有問題發生,所以只能靠自己想辦法安全升級。
**1)分項目階梯升級**
  在 4 個待升級的項目中,有 3 個是對外的項目,有 1 個是對內的項目。
  那么先升級對內項目的 Node 版本,這樣有兩個好處:
1. 即使出問題了,影響范圍也能最小。
2. 響應也能最及時,因為有問題的話,在公司內部能馬上反饋到我們組。
**2)分環境階梯升級**
  我們每個項目都會有 3 套運行環境:測試、預發和生產。
  首先將測試環境升級,測試環境都是開發人員使用,影響最小,反饋最快。
  觀察一段時間后,再升級預發,預發環境與生產環境最為接近,數據庫采用的也是一套。
  最后才是生產,給真實用戶使用,再獲取反饋。
**3)邀請內部人員體驗**
  首先升級的是那個內部項目,所以在飛書上建了個群,將各個組的負責人拉進來。
  邀請他們在預發環境體驗各自的業務,再給出反饋。
  在驗收時發現了時區的問題,糾正后,再讓他們驗收。
**4)部署自動錯誤告警**
  讓人來驗收,難免會有遺漏,所以讓運維給加了個自動錯誤告警。
  每分鐘有 5 個 500 以上的錯誤,就自動在飛書上發告警信息。
  這類規則比較適合接口,而定時任務的規則比較特殊。
  因為任務可能是 5 分鐘運行一次,那么報錯的頻率不會那么高。
  因此改成 5 分鐘內有一個錯誤就告警,免得告警太多,也比較煩人。
**5)增加單元測試流程**
  在將對內的項目升級完成后,公司員工在訪問一個服務時報錯。
  讓運維查看后,發現是因為連接地址配置錯了。
  為了避免這種問題的發生,就需要有地方可以測試服務連接是否異常。
  手動測試比較繁瑣,最好的辦法是在發布代碼的流程中,加一環服務連接。
  若成功,那么就繼續后面的流程,否則就中斷。
  公司使用的是阿里云提供的發布系統,里面可以加一步單元測試。
  服務連接是測試的一個場景,未來可以再加其他各類測試,保證項目質量。
  從開始升級到全部項目升級完成,前前后后操作了 20 多天,因為在一個環境或項目升級后,就要觀察幾天,然后再升級另一個環境或項目。在升級完成后,還部署了阿里云提供的一款 Node 監控系統。
*****
> 原文出處:
[博客園-Node.js躬行記](https://www.cnblogs.com/strick/category/1688575.html)
[知乎專欄-Node.js躬行記](https://zhuanlan.zhihu.com/pwnode)
已建立一個微信前端交流群,如要進群,請先加微信號freedom20180706或掃描下面的二維碼,請求中需注明“看云加群”,在通過請求后就會把你拉進來。還搜集整理了一套[面試資料](https://github.com/pwstrick/daily),歡迎閱讀。

推薦一款前端監控腳本:[shin-monitor](https://github.com/pwstrick/shin-monitor),不僅能監控前端的錯誤、通信、打印等行為,還能計算各類性能參數,包括 FMP、LCP、FP 等。
- ES6
- 1、let和const
- 2、擴展運算符和剩余參數
- 3、解構
- 4、模板字面量
- 5、對象字面量的擴展
- 6、Symbol
- 7、代碼模塊化
- 8、數字
- 9、字符串
- 10、正則表達式
- 11、對象
- 12、數組
- 13、類型化數組
- 14、函數
- 15、箭頭函數和尾調用優化
- 16、Set
- 17、Map
- 18、迭代器
- 19、生成器
- 20、類
- 21、類的繼承
- 22、Promise
- 23、Promise的靜態方法和應用
- 24、代理和反射
- HTML
- 1、SVG
- 2、WebRTC基礎實踐
- 3、WebRTC視頻通話
- 4、Web音視頻基礎
- CSS進階
- 1、CSS基礎拾遺
- 2、偽類和偽元素
- 3、CSS屬性拾遺
- 4、浮動形狀
- 5、漸變
- 6、濾鏡
- 7、合成
- 8、裁剪和遮罩
- 9、網格布局
- 10、CSS方法論
- 11、管理后臺響應式改造
- React
- 1、函數式編程
- 2、JSX
- 3、組件
- 4、生命周期
- 5、React和DOM
- 6、事件
- 7、表單
- 8、樣式
- 9、組件通信
- 10、高階組件
- 11、Redux基礎
- 12、Redux中間件
- 13、React Router
- 14、測試框架
- 15、React Hooks
- 16、React源碼分析
- 利器
- 1、npm
- 2、Babel
- 3、webpack基礎
- 4、webpack進階
- 5、Git
- 6、Fiddler
- 7、自制腳手架
- 8、VSCode插件研發
- 9、WebView中的頁面調試方法
- Vue.js
- 1、數據綁定
- 2、指令
- 3、樣式和表單
- 4、組件
- 5、組件通信
- 6、內容分發
- 7、渲染函數和JSX
- 8、Vue Router
- 9、Vuex
- TypeScript
- 1、數據類型
- 2、接口
- 3、類
- 4、泛型
- 5、類型兼容性
- 6、高級類型
- 7、命名空間
- 8、裝飾器
- Node.js
- 1、Buffer、流和EventEmitter
- 2、文件系統和網絡
- 3、命令行工具
- 4、自建前端監控系統
- 5、定時任務的調試
- 6、自制短鏈系統
- 7、定時任務的進化史
- 8、通用接口
- 9、微前端實踐
- 10、接口日志查詢
- 11、E2E測試
- 12、BFF
- 13、MySQL歸檔
- 14、壓力測試
- 15、活動規則引擎
- 16、活動配置化
- 17、UmiJS版本升級
- 18、半吊子的可視化搭建系統
- 19、KOA源碼分析(上)
- 20、KOA源碼分析(下)
- 21、花10分鐘入門Node.js
- 22、Node環境升級日志
- 23、Worker threads
- 24、低代碼
- 25、Web自動化測試
- 26、接口攔截和頁面回放實驗
- 27、接口管理
- 28、Cypress自動化測試實踐
- 29、基于Electron的開播助手
- Node.js精進
- 1、模塊化
- 2、異步編程
- 3、流
- 4、事件觸發器
- 5、HTTP
- 6、文件
- 7、日志
- 8、錯誤處理
- 9、性能監控(上)
- 10、性能監控(下)
- 11、Socket.IO
- 12、ElasticSearch
- 監控系統
- 1、SDK
- 2、存儲和分析
- 3、性能監控
- 4、內存泄漏
- 5、小程序
- 6、較長的白屏時間
- 7、頁面奔潰
- 8、shin-monitor源碼分析
- 前端性能精進
- 1、優化方法論之測量
- 2、優化方法論之分析
- 3、瀏覽器之圖像
- 4、瀏覽器之呈現
- 5、瀏覽器之JavaScript
- 6、網絡
- 7、構建
- 前端體驗優化
- 1、概述
- 2、基建
- 3、后端
- 4、數據
- 5、后臺
- Web優化
- 1、CSS優化
- 2、JavaScript優化
- 3、圖像和網絡
- 4、用戶體驗和工具
- 5、網站優化
- 6、優化閉環實踐
- 數據結構與算法
- 1、鏈表
- 2、棧、隊列、散列表和位運算
- 3、二叉樹
- 4、二分查找
- 5、回溯算法
- 6、貪心算法
- 7、分治算法
- 8、動態規劃
- 程序員之路
- 大學
- 2011年
- 2012年
- 2013年
- 2014年
- 項目反思
- 前端基礎學習分享
- 2015年
- 再一次項目反思
- 然并卵
- PC網站CSS分享
- 2016年
- 制造自己的榫卯
- PrimusUI
- 2017年
- 工匠精神
- 2018年
- 2019年
- 前端學習之路分享
- 2020年
- 2021年
- 2022年
- 2023年
- 2024年
- 日志
- 2020