npm 重點小結

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

javascript

  1. 全局與本地安裝html

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

  2. package.jsonjava

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

    • 項目的命名是有必定要求的,小寫,不能有空格,能夠用下劃線或者連字符。webpack

    • scripts 字段能夠配置自定義的一些命令行語句,做用是簡化命令行,並且統一命令行爲npm run ...的格式,本身本身配置一些語義化的命令,舉個例子:git

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

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

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

    其實dependenciesdevDependencies裏面若是有相同的包這種狀況是不該該出現的,緣由在於有些人對dependenciesdevDependencies有一些誤解,以爲devDependencies應該包含dependencies裏面的內容,而後再在devDependencies中加入一些開發環境須要的包,其實devDependencies的意義在於增長一些開發環境須要的包以及一些未肯定是否要用的包,若是某個包是肯定要在線上用的,那麼就直接寫到dependencies就能夠了,不須要在devDependencies中出現,簡單來說就是devDependencies其實已經包括dependencies了。因此當你測試完一個包以爲能夠在線上使用時,你就能夠把包寫到dependencies裏,而後刪掉devDependencies中對應的包,保持包名不要重複出現,也有利於package.json文件的簡潔。shell

    線上環境能夠用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編輯器,總以爲顯示出來的效果實在是差點意思......

本文來源:JuFoFu

本文地址:http://www.cnblogs.com/JuFoFu/p/5140302.html


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社區



水平有限,錯誤歡迎指正。原創博文,轉載請註明出處。

相關文章
相關標籤/搜索