npm 重點小結


npm作為javascript一個用得比較廣的包管理工具,已經集成在了node里面,基本一安裝node就可以用npm了,十分方便。這里的小結主要沿着官方文檔的思路,挑出一些比較重點的,平時常用的部分進行說明,力求清晰與主次分明。

  1. 全局與本地安裝

    本地安裝指的是只將包下載到當前項目的node_module文件夾,當安裝的包只需要在項目中被require使用時,用本地安裝;全局安裝指將包下載到本機安裝的npm創建的/lib/node_module文件夾,當安裝的包需要在控制台打命令行運行時,就需要全局安裝,比如gulp,express cli等等。

  2. package.json

    package.json文件是用來管理項目本地npm的下載包,用npm init命令創建,有一些需要留意的地方:

    • 項目的命名是有一定要求的,小寫,不能有空格,可以用下划線或者連字符。

    • scripts 字段可以配置自定義的一些命令行語句,作用是簡化命令行,而且統一命令行為npm run ...的格式,自己自己配置一些語義化的命令,舉個例子:

    
    "scripts": { "build": "webpack", "dev": "webpack-dev-server --inline --hot --quiet" },

    這樣配置后在命令行打npm run build和打webpack的效果是一樣的,這個例子看起來打的命令變長了,但是語義化更強了一些,一看就知道是項目構建;第二條命令npm run dev簡化命令行的效果就很明顯了。

    • package.json里面還有兩個比較重要的字段,即dependenciesdevDependenciesnpm install <package> --save會把安裝的包寫到dependencies,表示的是正式環境的包;npm install <package_name> --save-dev會把安裝的包寫到devDependencies,表示的是測試環境的包。很多人知道的就僅限於此了,測試和正式安裝的版本不同會怎么樣?install的時候是裝哪一個?包的版本號是怎么控制的?這些深入了解的人就不多了,下面來仔細說明一下:
  3. npm install的時候會將dependenciesdevDependencies里面的包全部安裝,當兩個里面的包版本不同時,安裝dependencies內的版本,同時會有invalid的提示:

    其實dependenciesdevDependencies里面如果有相同的包這種情況是不應該出現的,原因在於有些人對dependenciesdevDependencies有一些誤解,覺得devDependencies應該包含dependencies里面的內容,然后再在devDependencies中加入一些開發環境需要的包,其實devDependencies的意義在於增加一些開發環境需要的包以及一些未確定是否要用的包,如果某個包是確定要在線上用的,那么就直接寫到dependencies就可以了,不需要在devDependencies中出現,簡單來講就是devDependencies其實已經包括dependencies了。所以當你測試完一個包覺得可以在線上使用時,你就可以把包寫到dependencies里,然后刪掉devDependencies中對應的包,保持包名不要重復出現,也有利於package.json文件的簡潔。

    線上環境可以用npm install --production命令(或者配置了NODE_ENV環境變量為production),就只安裝dependencies里面的包。安裝完后可以用npm ls查看安裝的包的情況。

  4. 所有的包安裝后都會帶版本號,版本號的規則要符合包node-semver的解析規則,下面直接舉例說明:

    npm install sax@0.1.1 npm install sax@">=0.1.0 <0.2.0" npm install vue@^1.0.0 

    第一種是直接指定版本號

    第二種也是也很容易理解,類似的有< <= > >= =,不過寫=1.0.0或者v1.0.01.0.0其實是一樣的,字符串中甚至還可以加上||,比如:1.2.7 || >=1.2.9 <2.0.0,來排除中間1.2.8這個版本,其他一些寫法可以參考github上面[node-semver] (https://github.com/npm/node-semver)的用法說明,這里主要說明幾個常用的

    • 缺省:版本號一般分三段,[major, minor, patch](主版本.此版本.補丁),版本可以缺省,表示沒有限制這一段的版本,比如1.2表示1.2.0 - 1.2.9

    • -:連字符,可以簡單規定版本范圍,比如1.2.3 - 2.3.4相當於>=1.2.3 <=2.3.4,需要留意的是連字符左右要有空格空開;

    • * x X:星號表示任意數字,和缺省類似,1.2 1.2.* 1.2.x 1.2.X是一樣的

    • ~:波浪號允許小版本迭代,規則分情況理解比較容易:如果有缺省值,則表示缺省部分任意迭代;如果沒有缺省值,則表示只允許第三段即補丁的迭代,具體來看node-semver上舉的例子(測試版本號有點不一樣,不過平時用得少就不列舉了):

     1. ~1.2.3 :>=1.2.3 <1.3.0 2. ~1.2 : >=1.2.0 <1.3.0 (相當於1.2.x) 3. ~1 : >=1.0.0 <2.0.0 (相當於1.x) 4. ~0.2.3 : >=0.2.3 <0.3.0 5. ~0.2 : >=0.2.0 <0.3.0 (相當於0.2.x) 6. ~0 : >=0.0.0 <1.0.0 (相當於0.x) 
    • ^:上尖號和~含義相對,允許大版本迭代,規則同樣分情況:如果有缺省值,則允許缺省值的前一位版本+1迭代;如果沒有缺省值,則版本號允許從大到小第一個不為0那一位允許+1迭代,還是直接看例子:
     ^1.2.3: >=1.2.3 <2.0.0 ^0.2.3: >=0.2.3 <0.3.0 ^0.0.3: >=0.0.3 <0.0.4 ^1.2.x:>=1.2.0 <2.0.0 ^0.0.x:>=0.0.0 <0.1.0 ^0.0:>=0.0.0 <0.1.0 ^1.x:>=1.0.0 <2.0.0 ^0.x:>=0.0.0 <1.0.0 

    以上就是常見的版本號控制語法了,當然還有一些更加高級的混用,不過個人感覺容易引起出錯混亂,還是不要折騰了。版本在這里說了那么多,是因為版本是很重要的部分,現在很多包都是開源的,更新迭代很快,npm install <package> --save安裝時寫入package.json一般是^版本號的格式,在不同時間用npm install安裝package.json中的文件時,可能就會出現版本不一致引起的代碼運行結果不同。

    npm install還有一個參數是--save-optional這個會將包加入optionalDependencies中,這個平時用得比較少,從字面上理解是可選包,等有這樣的需求再研究吧。

  5. npm outdated命令可以查看有新版本的包的版本情況,如下圖所示,current是當前安裝的包的版本,wanted是package.json里面寫的版本,latest是最新版本:npm update命令可以更新本地package.json里面列舉的包,當然,更新也會遵循package.json里面包的版本規則;不過更新全局的包不是用的update,而是直接重新npm install -g ,如果是更新所有全局的包,直接用npm update -g,話說這樣變來變去不知道是出於什么考慮...

  6. npm uninstall是卸載包的命令,不過很多人安裝包的時候知道加--save或者--save-dev命令,而卸載的時候就會忘了加,如果這個包是確定不需要使用的,就可以直接加--save或者--save-dev從package.json中刪掉它。卸載全局的包只需要加個-g參數。

  7. npm config是npm中查看配置信息的命令,主要涉及npmrc files 文件

        npm config set <key> <value> [-g|--global] npm config get <key> npm config delete <key> npm config list npm config edit npm get <key> npm set <key> <value> [-g|--global]
  8. npm docs <pkg> 這個命令可以直接打開包的官方文檔網站,一般就是github了,不過打開速度不是很快。

  9. npm explore <pkg> [ -- <cmd>] explore 可以暫時定位到包的目錄,可以查看修改包內的內容,當然修改完要用npm rebuilt <pkg>來重新編譯包;cmd 可以添加一些命令行指令,官網給出的例子是-- git pull origin master,即更新本地git倉庫,一般用在包的子模塊的更新。exit或者ctrl C 可以退出包目錄返回原來的目錄地址。

  10. npm help 輔助命令,比如打npm help explore就會打開npm explore的html文檔,有個類似的指令是npm help-search,當npm help命令無法定位到確定文檔時,就會自動調用npm help-search命令,比如打npm help b會在所有的npm help *命令的文檔里面查找。

  11. npm install <pkg> npm install 后面可以帶帶版本號標簽號的包名,或者壓縮包、壓縮包地址等等,下面是文檔列舉的方式,常用的就是直接指定包名了

    
        npm install [<@scope>/]<name> npm install [<@scope>/]<name>@<tag> npm install [<@scope>/]<name>@<version> npm install [<@scope>/]<name>@<version range> npm install <tarball file> npm install <tarball url> npm install <folder>
  12. npm link是用來鏈接全局包的命令,npm link主要是為模塊開發者使用的一個命令,設想這樣的一個情景:你開發了一個模塊a並發布了(npm public),並在項目中引入這個模塊,在使用過程中發現了a有bug,你改動了a,於是需要重新npm public,發布完你又要回到自己的項目中用npm update命令來更新模塊,如果只是小改動還好,如果是開發初期的頻繁更新,那么就很浪費時間,畢竟自己開發的模塊在本機還要更新,這個步驟明顯很多余。npm link命令就是用來同步模塊更新的,一般應用場景如下:

    自己開發的包名為appy,放在src/appy文件夾——cd to src/appy——npm link,將會把src/appy這個包復制到npm的全局模塊安裝文件夾node_modules內,並創建符號鏈接(symbolic link,應該是一個軟鏈接)——自己的項目放在src/mysite文件夾——cd to src/mysite——npm link appy,那么項目中的appy包就會和src/appy相關聯,每次npm publish后,項目文件夾里面的appy包都會隨之更新。

    有時候這個包並不是你開發的,但是你想contribute這個包時,也可以在自己的項目文件夾中直接用npm link <package>,這個包同樣會被安裝到全局,並和此項目中的包相關聯。

  13. npm ls[ll | la]是和shell命令類似的語法,就是列舉信息,默認以樹形的方式列舉包名,包括其依賴,llla列舉的信息較為多一點。如果你想用json格式來列舉,可以通過設置config文件的json字段來設置,用npm config set json true,則將以json格式來顯示包及其依賴,不過這個字段是npm全局的,很多命令的顯示都會變成json格式。其余還有一些蠻有用的配置項,比如如果列舉的依賴過多,可以設置depth(int)參數來限制顯示的層級,prod / production(Boolean)來只顯示dependencies的依賴,dev(Boolean)來只顯示devDependencies的依賴等等。

  14. npm prune,這個命令要和package.json文件路徑下運行,將會移除package.json中沒有列舉的node_modules的包,如果是生產環境中或者加--production,將會移除devDependencies里面的包,用於清理多余的包資源。

  15. npm repo <package>,這個和上面的npm docs類似,一般也是打開的github網址。

  16. npm root [-g],打印出node_modules文件夾路徑,加個-g可以查看全局包的安裝路徑,有時候忘了全局包安裝路徑這個小命令還是蠻有用的。

  17. npm run <command>用npm run來跑package.json里面script字段內的命令,可以直接打npm run查看有哪些命令

  18. npm shrinkwrap,這個命令用來指定安裝的包版本,主要是為了項目環境的穩定。因為傳統的npm install安裝的包寫入package.json時往往帶的是一個版本號范圍,有時候為了在其他地方安裝能夠保持版本號一致或者在線上部署希望項目穩定,所以希望用npm install安裝依賴時安裝的包和測試通過時是一樣的,或者說保持版本號一致,npm shrinkwrap就是這樣的一個功能。npm shrinkwrap會在目錄下面創建npm-shrinkwrap.json文件,里面是項目中已經安裝的包(包括所有包內嵌套的包)的確定版本號以及包的下載位置,當用npm install是,會直接安裝npm-shrinkwrap.json文件內列舉的包名。如果想要更新npm-shrinkwrap.json文件內的包,可以先用npm update <package>更新包,再用npm shrinkwrap命令來重新創建npm-shrinkwrap.json文件,npm shrinkwrap默認只確定package.jsonde­pen­den­cies內的包,測試環境的包需要加--dev參數。

  19. npm update [-g] [<pkg>...]用來更新包,需要注意的是包更新依然需要符合package.json中的版本號范圍,只會在版本號范圍內更新最新版本的包。有-g--dev--save參數,沒有加具體包名時默認更新所有的包。

  20. npm view可以查看很多信息,下面列舉幾個常用的:

    • npm view connect直接接包名查看包信息

    • npm view npm view ronn@0.3.5 dependencies查看包依賴

    • npm view connect versions查看包歷史版本列表,如果version不加s則表示查看包最新版本。

以上列出的命令涉及到的是日常的使用范圍,還有一些復雜的參數和設置就不列舉了,實際上個人用到的命令不多,很多都是看文檔的時候才知道的,如果有哪些錯漏歡迎指出。除此之外,npm還有其他一些命令是關於發布包的流程與管理的,這部分就蠻復雜(主要是我沒有發布包的經驗),希望以后有機會發布自己的包的時候再來寫了。最后吐槽一下博客園的Markdown編輯器,總覺得顯示出來的效果實在是差點意思......

 

https://github.com/npm/node-semver

npm documentation

RYAN . What is npm shrinkwrap and when is it needed

npm link: [developing your own npm modules without tears](http://justjs.com/posts/npm-link-developing-your-own-npm-modules-without-tears

Oleksii Rudenko . Simple Way to Manage Local Node Modules Using NPM Link.

JeremyWei . 如何發布Node模塊到NPM社區


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM