NPM 3.0 要來了
by @goddyzhao
本文先帶大家回顧一點小歷史,請看下面一張圖:
這張圖對于Node開發者來說應該是再熟悉不過了,是當年Node之父Ryan Dahl“退位讓賢”給 Isaac Schlueter 時的一張漫畫圖,那年是 2012年1月
。就在兩年后,也就是 2014年1月
,Issac又“讓賢”給了當時Joyent的一個名叫 TJ Fontaine (此TJ非彼TJ,請務必淡定)的工程師,自己轉而專門為NPM成立了一家公司—— npm, Inc ,大家現在用的NPM公共倉庫就是該公司一項免費服務,除此之外,它還為企業提供了私有NPM倉庫等增值付費服務。
現在時間到了2015年,如今的NPM已經不再單單是為Node提供包管理的服務了,正如它官網所提到的,它的目標是成為更General的包管理器。截止到本文撰寫時,NPM已有 131430
個模塊了,可謂體量巨大。同時就在前幾天,NPM官方宣布 NPM 3.0就要來了 。
那么下面,我們就來看看NPM 3.0到底有哪些亮點:
-
CLI將拆分成多個小模塊并以API的形式對外提供服務
-
npm cache要重寫,將支持離線模式
-
npm install的具體內部實現邏輯將要改寫
以上三點是筆者認為最大的亮點,除此之外,NPM 3.0還有很多改善,諸如: 更好的報錯機制
、 更好的搜索模塊體驗
、 windows下路徑的支持改善
等等,這里就不一一贅述了。下面就重點講講上面的三點吧。
CLI將拆分成多個小模塊并以API的形式對外提供服務
首先官方指出這么做的原因主要是:社區很多人不斷給NPM提出新的需求,一會兒要求NPM要支持 自定義腳本的hook
、一會兒又要 NPM CLI提供可定制化
等等。盡管這些需求確確實實是非常有價值的,但是官方不想給NPM無限制的加功能,讓它變得很臃腫,背離了Issac心中小而美的初衷。于是呢,就將 NPM中不同的功能模塊拆分出來,獨立成一個個子項目,從而實現給NPM“瘦身”,然后不同的模塊通過對外提供統一的API接口來實現互相的協作。
大家是不是想到了Unix哲學?沒錯,每個模塊完成特定的任務,互相之間解耦。這種做法也屬于非常常見的“瘦身”做法,connect 3.0就是最好的例子。這樣做的好處也是顯而易見的:
-
NPM核心模塊會變得非常輕量級
-
子模塊變得更好維護
-
子模塊測試起來更容易
-
模塊之間可插拔,功能通過“搭積木式”的方式來組合
這種改變對于開發者來說,個人認為應當是透明的。NPM應該會將滿足常規需求的子模塊在你安裝NPM的時候就自動安裝好,如果需要額外擴展模塊就單獨安裝。所以,基本不影響開發者。
npm cache要重寫,將支持離線模式
npm cache目前的cache機制簡單來說就是將下載下來的模塊的tar包,默認放在 ~/.npm/{module}/{version}
目錄中(其中 ~/.npm
是可以通過 npm config
來配置的),通過寫入一個 .cache.json
文件來記錄一些 meta
信息,如: etag
值等。這樣就可以當你下次再安裝這個模塊的時候,檢查是否緩存版本有效,有效則直接本地讀取否則就再通過網絡去請求。但是這種緩存機制不支持通過 git
和 http url
方式安裝的模塊。內部緩存模塊實現機制有很多缺點(關于這部分,筆者以后會專門寫文章介紹)。
那么對于NPM 3.0中這部分具體如何重寫官方沒有透露太多細節,只知道重寫后:
-
讓緩存的內容可訪問,這樣類似shrinkwrap這樣的工具就不需要經常去訪問網絡
-
將緩存部分功能單獨成獨立的API
-
支持離線
以上幾點的改進其實有點類似一個名為 npmd
的模塊,它就是為了解決現有 npm cache
問題而生的,看來NPM 3.0借鑒了很多來自于它的idea。
對于開發者而言,特別是國內開發者而言,緩存機制的完善和離線模式的支持,多多少少對我們這種訪問npm源如龜速的朋友是收益多多的。(當然,要單純提高速度可以使用淘寶提供的鏡像——CNPM)。
npm install的具體內部實現邏輯將要改寫
目前大家通過 npm install
某個模塊時,就會出現一個 loading
狀態的指針,然后就長時間在那里轉啊轉,完全不知道干了什么。如果實在長時間不動呢,還可以通過 npm install --verbose
來看看日志。而且現階段的 npm install
是將依賴分析和安裝,這兩個過程混在一起的。因此,NPM 3.0重寫這部分實現后,將:
-
將這兩部分分離,并且整體實現更加簡化
-
同時會提供更好的依賴關系輸出
其實這部分改寫聽起來還是和 npmd resolve
以及 npmd install
有點相似。不過這不重要,重要的是對于開發者而言安裝將會更加友好。
總結下來,對于開發者(NPM使用者)來說,NPM 3.0 絕大部分的改進都是透明的,最終會帶來更好的體驗。但是對于NPM自身來說,意味是深遠。這次改進正是為了更好地成為更通用的包管理器而邁出的一大步!
我們所有的文章均在https://github.com/jieio/du開源,歡迎提問和投稿