爲什麼不能在服務器上 npm install ?

## 背景

Node.js 很簡單,容易上手。但也因此缺乏不少規範,使用者水平參差不齊。

最近經常看到的一個問題是:很多新手,在部署的時候,是直接在服務器上 npm install ,這是非常不推薦的。

## 存在的問題

1. 無法確定唯一性

因爲安裝是有較大的網絡耗時的,所以你甚至無法保證集羣情況下,兩臺服務器上npm install 下來的包是一模一樣的。

如果某個庫剛好更新了,並且它有 BUG,然後你就是百思不得其解:一定概率出某個問題。排查起來簡直想死。

當然,很多人爲了解決這個問題,就選擇「鎖版本」這個方案。

評論區的同學,不要急,看完下面第 2 點,即使鎖版本也是在 CI 上 install 而不是服務器上。

鑑於 「鎖版本」屬於  「屎色自行車問題」 ,這裏不想討論。
我們的觀點參見: 「知乎專欄 - 死馬:爲什麼我不使用 shrinkwrap(lock)」

2. 上線耗時久,無法快速回滾

上線後,發現線上故障,要快速回滾止血的時候,就懵逼了:

  1. 要等待依賴安裝,萬一網絡有個抖動啥的,妥妥的 P4 故障變爲 P0 故障,年終獎沒了。
  2. 萬一問題是底層依賴導致的,回滾也沒用。
  3. npm cache 解決不了問題,如機器擴容的時候。

## 推薦方案

知乎圖片查看體驗差,請點擊大圖,清晰點

其中,關鍵點是:在構建期就把依賴打包進去。

優點:

  • 解壓即可立刻啓動,無需等待網絡耗時。
  • 能保證肯定是可以運行的,因爲此時依賴都是確定好的,且經過 CI 單測保障的。
  • 可以快速回滾,止血。
  • 打包方式可以是 tar 或 docker。(推薦後者)

缺點:

  • 包體積大(但其實存儲不值錢。。。)

知乎圖片查看體驗差,請點擊大圖,清晰點

上圖是用  PlantUML 在語雀繪製的,想享受類 Markdown 的體驗來畫流程圖,就用 PlantUML

## 如何實施?

那有同學就要問了:我是小公司,不像你們有這些基建可以服務,怎麼辦?

其實成本真的很低:

  • 代碼倉庫 GitLab 自帶 CI 了,你只需要寫個配置文件,觸發自動構建即可。(或 Jenkins)
  • 然後把構建後的文件,找個地方存儲,如 OSS 。
  • 服務器部署的話,有運維發佈系統最好,沒有的話,自己寫個 shell 把 OSS 文件下載解壓。
  • 當然,很多雲服務都支持 Docker 鏡像了,那就更簡單了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章