沒搞懂的package.json
事情是這樣的,今天上午,後端同學 clone 了我們的一個小程式專案,希望到自己的電腦上跑起來。
然而,令人尷尬的是,他在 npm install 之後,專案並沒有如願執行,並丟擲一個大大的錯誤。
後來, 另一個前端同學靈機一動,將自己的 node_modules 拷給了他,小程式終於如願在他電腦上跑了起來。此後我們群裡有了下面的對話:

本人自認為臉皮還算不薄,但是說我們的 node_modules 是祖傳的,確實令人難以招架。。痛定思痛,為了防止被後端同學,乃至以後新來的前端同學 diss,我決定好好研究一下 package.json 這個檔案。

在講解 package.json 之前,首先推薦阮老師的一篇文章, package.json 檔案 , 裡面對需要了解的常用欄位都有解釋,比如 dependencies, devDependencies,scripts,main,version欄位等,這裡就不講了。僅談談依賴的版本管理。
依賴的版本管理
如果一個專案做了不相容的更改,併發布了一個大版本,你的專案依賴了他的庫,安裝完成之後,十有八九是要報錯的。所以我們要在package.json中告訴npm只能裝哪個版本,或者哪幾個版本的庫。規則如下(摘自上面的文章):
- 指定版本:比如1.2.2,遵循“大版本.次要版本.小版本”的格式規定,安裝時只安裝指定版本。
- 波浪號(tilde ~)+指定版本:比如~1.2.2,表示安裝1.2.x的最新版本(不低於1.2.2),但是不安裝1.3.x,也就是說安裝時不改變大版本號和次要版本號。
- 插入號(caret ^)+指定版本:比如ˆ1.2.2,表示安裝1.x.x的最新版本(不低於1.2.2),但是不安裝2.x.x,也就是說安裝時不改變大版本號。需要注意的是,如果大版本號為0,則插入號的行為與波浪號相同,這是因為此時處於開發階段,即使是次要版本號變動,也可能帶來程式的不相容。
- latest:安裝最新版本。
- Patch releases: 1.0 or 1.0.x or ~1.0.4
- Minor releases: 1 or 1.x or ^1.0.4
- Major releases: * or x
以上的表示在pakage.json中都是合法的描述。除此之外,npm官方還提供了一個好用的工具,來告訴我們某個"表示式"會覆蓋到哪些版本: https://semver.npmjs.com/
改動了依賴裡的程式碼怎麼辦
這是上面說的那個祖傳node_modules的真正原因了,由於當時mpvue一個包實現的問題,以及我們在原生語法寫的專案中使用mpvue,我改動了包裡的一行程式碼,這是我們的可以work,而到後端那裡就會報錯的根源所在。解決辦法有這麼幾個:
1.提交給官方一個PR,等待merge
這個看官方的情況了,有可能很快merge,也可能快一年了還沒個結果。可行性指數::star2::star2::star2:
2. 將自己修改過的發一個包
這種方法需要有npm賬戶,然後熟悉publish package的流程。可行性指數::star2::star2::star2:
3.fork一份到自己的github下,修改之後,直接讓npm從github安裝這個包
此時package.json中的對應的欄位應該是這樣:
"xxx": "git+https://github.com/xxx/koatest.git"
可行性指數::star2::star2::star2::star2:
在操作的時候注意一點,修改過的程式碼merge到master分支上,不然裝完了還不能work(完)。