同花順內網NPM二三事

前言

關於npm相信做爲前端開發工程師必定不陌生,不過大部分人基本上只會使用3個命令,npm install,npm run dev,npm run build,不過本文並不介紹npm常見的命令,本文主要介紹了我司內網npm的搭建方式,和前端開發在使用過程當中經常會遇到的問題,但願你們在使用過程當中可以對其瞭解更深入,本文閱讀時間約須要5分鐘。前端

我司內網NPM發展歷程

我司的內網npm倉庫是在2017年中旬開始搭建並使用的,在此以前你們都是採用複製粘貼的方式來搬運nodemodules,17年中旬開始在內網搭建了一套cnpm內網倉庫,主要採用淘寶開源的cnpm倉庫,當時尚未打通內網訪問淘寶鏡像的地址,所以倉庫更新包仍是要每隔一段時間纔會去更新一下,致使內網一些包的版本老是不是最新的;java

19年開始公司開始採用nexus從新部署了一套私有倉庫,用該方案搭建主要是能夠一套倉庫同時兼顧各種開發語言,同時直接打通了鏡像源地址,讓內網無需再爲包沒法下載或者版本更新不及時的事情發愁。node

企業內網npm

企業內網搭建npm的常見兩種方式

  • 淘寶開源CNPM

官方部署github地址: https://github.com/cnpm/cnpmj...python

  • Nexus Repository

官方部署github地址:https://github.com/sonatype/d...nginx

目前我司上述兩種倉庫都依然在內網並存,對於上述兩種倉庫有以下建議:git

  1. 若是你須要搭建的這個倉庫須要兼容多種語言,如:js,java,python,那麼建議你用nexus做爲倉庫
  2. 若是你僅須要支持前端npm包,那麼用淘寶cnpm,該倉庫是基於node編寫的,對前端人員更加友好

企業內網npm可能會遇到的問題

1. 使用npm install下載遇到404問題
  • 檢查項目下的package-lock.json文件中該包的倉庫地址是否和內網的不同
  • 使用npm config get registry查看當前倉庫地址是否指向內網的倉庫
  • 該包是否含腳本,腳本自動從github上面下文件,若是包含,那麼執行npm install --ignore-scripts該命令能夠跳過該腳本的下載(大部分遇到的都是node-sass這種包會有腳本,後文會講解如何在內網安裝這種包)
2. 內網node-sass安裝失敗怎麼辦

若是公司有內網開發的話,不少同窗應該會遇到這個問題,每每你們的作法可能都是從外網拷貝傳到內網指定目錄下,但這種方式過於繁瑣,可維護性比較差,那麼目前業界是怎麼作的呢?github

目前作的比較好的是淘寶,他們的作法是定時同步github上面的node-sass到本身的服務器上,而後開發人員在本地命令行中修改node-sass下載腳本的地址便可docker

npm config set SASS_BINARY_SITE=http://npm.taobao.org/mirrors/node-sassnpm

那麼對應到各位的公司裏面應該如何作呢?
主要有以下兩個方案:json

  1. 搭建代理通道,內網經過一臺中轉服務器,反向代理到淘寶倉庫存儲腳本的地址,或者直接代理到對應github的地址,而後開發人員在本地設置以下命令,便可修改node-sass的腳本地址
1. 公司內網服務器nginx配置轉發路由,並讓機房開通下面代理淘寶地址的權限,nginx配置以下:

...
location ^~ /mirrors/ {
    proxy_pass http://cdn.npm.taobao.org/dist/
}
...

2. 前端開發在本地命令行中修改binary_site的地址(xxx是內部服務器本身的ip):
npm config set SASS_BINARY_SITE=http://xxx.xxx.xxx/mirrors/node-sass

3. 執行下載命令,便可正常下載node-sass
npm install node-sass
  1. 公司若是有本身的gitlab的話,能夠按照淘寶的同步邏輯將github上面對應的node-sass文件拷貝到內網的gitlab倉庫,那麼開發人員在設置的時候能夠直接將本地node-sass的下載地址指向gitlab
npm config set SASS_BINARY_SITE=http://gitlab.xxx.xxx/node-sass
淘寶鏡像地址: https://npm.taobao.org/mirrors

另外,上述方案不只僅適用於node-sass,一樣適用於全部相似node-sass須要下載腳本的包,好比electron,puppeteer...等等,算是一個通用的解決方案,建議使用第一種代理通道的方案,向公司申請下權限便可

3.我司目前內網npm倉庫存在的問題

目前我司在使用nexus做爲倉庫的過程當中遇到以下另個問題:

  1. 開發人員在本地安裝包的時候常常404

遇到這種狀況,只須要稍等片刻,而後再從新多執行幾回npm install便可

ps:雖然該種狀況一會能好,和網絡關聯性較大,但筆者強烈懷疑是nexus內部機制的一些bug,一些超時時間和重試機制設置作的並很差
  1. 內網裝node-sass或者puppetter等包沒法安裝

接下去會按照上述搭建代理通道的方式來解決該問題

4. package-lock.json該不應提交

package-lock.json是在學習了yarn.lock以後在npm5版本上面新增的功能,該文件的主要做用是用來鎖住package.json中的版本號,使得每一次下載的npm包的版本都是同樣的,而且下載的來源也都是同一個。

不過我的有不同的見解,目前從開發實踐中來看建議你們不要將package-lock.json提交到git上做爲版本管理;主要是因爲目前的包遵循semver語義化版本的原則來進行更新包的,基本上不太會出現小版本升級致使api變動,靠譜的包升級都是修復bug或者是相關優化,若是把package-lock.json加入版本管理以後,後面該包修復bug業務方更新起來是一個比較麻煩的事情,若是該包使用的業務方過多,那麼要推進你們一塊兒改也是比較費時費力的,而不鎖版本的好處就在於開發人員能夠無感知的就能夠在業務開發時修復一些隱藏的bug,而不用每次特意去修改某個包的版本號,所以推薦你們無需將package-lock.json歸入版本管理。

總結

不少公司或多或少都會有內網,搭建npm私服也是必經之路,開發人員若是對於npm沒有基本的認識,通常遇到問題很難明白其中發生了什麼,但願本文給你們介紹的npm知識可以幫助你們之後更好的工做,若有不對之處,歡迎指正~

相關文章
相關標籤/搜索