【譯文】NPM 小技巧&最佳實踐

本文來自國外新手向技術博客RisingStack。有興趣的同窗可點擊原文查看。node


相信npm install是npm-cli最經常使用的功能,但其實它還有不少其餘可挖掘的地方。在本文中,你將會學習如何在應用開發的整個生命週期中——包括重新建,到開發,再到發佈上線,npm如何幫你更好地完成開發。linux

0. npm基礎使用

在進入今天的主題以前,咱們先來回顧下一些npm命令,例如如何肯定你的npm版本、哪些命令可供你使用等。git

0.1 npm版本

要查看現有的npm版本,在命令行工具中運行以下命令:github

$ npm --version

但npm其實能告訴你更多關於版本的信息,如目前各package的版本、Node.js的版本、OpenSSL版本、V8的版本等,以下:docker

$ npm version
{ bleak: '1.0.4',
  npm: '2.15.0',
  ares: '1.10.1-DEV',
  http_parser: '2.5.2',
  icu: '56.1',
  modules: '46',
  node: '4.4.2',
  openssl: '1.0.2g',
  uv: '1.8.0',
  v8: '4.5.103.35',
  zlib: '1.2.8' }

0.2 npm help

和不少cli工具同樣,npm也內置了一個很實用的help功能。讓你能夠隨時查閱各類命令的描述和摘要,它們其實就是linux的man-page而已。例如:npm

$ npm help test
NAME  
       npm-test - Test a package

SYNOPSIS  
           npm test [-- <args>]

           aliases: t, tst

DESCRIPTION  
       This runs a package's "test" script, if one was provided.

       To run tests as a condition of installation, set the npat config to true.

1. 用npm init來建立你的項目

When starting a new project npm init can help you a lot by interactively creating a package.json file. This will prompt questions for example on the project's name or description. However, there is a quicker solution!json

建立項目的時候,npm init的優勢在於能給交互式地替你建立package.json文件,它會彈出問題讓你填寫項目的名稱和描述等等。但其實還有更簡化的方式:安全

$ npm init --yes

若是你使用npm init --yes的話,它不會問你要如何建立,就直接按默認配置建立一個package.json。這個默認配置固然也是可實現設置的:ide

npm config set init.author.name YOUR_NAME  
npm config set init.author.email YOUR_EMAIL

2. 查找npm的package

考慮到npm中有上萬個模塊供你選擇,要找到合適的package是很困難的。咱們團隊的經驗是這樣,最近在Node.js的問卷調查中,不少開發者也告訴咱們要找到合適的package是很鬱悶的一件事情。因此如今咱們試着找一個能發送HTTP請求的模塊吧~工具

npms.io這個網站能很好地幫助到咱們。它將各個package的質量、受歡迎度、可維護性等指標作了量化並展示。具體的說,這些指標包括:是否使用了過期的依賴包、是否有代碼檢查配置、是否通過測試以及最近的版本是什麼時候發佈的,等等。

3. 瞭解你選擇的package

當你選定了你要用的模塊以後(本例中咱們選用了request模塊),咱們應該首先查看它的文檔,看看有什麼現存的issue,以便充分了解咱們要用在應用中的模塊。但願你牢記一點,當使用的npm package越多,你可能遇到的不可靠或危險的package也就越多。想了解更多npm相關的安全風險的話,請閱讀咱們寫的一篇指導文檔。

若是想去到package的主頁,可執行下面的命令:

$ npm home request

要查看現存的issue,或者公開的roadmap,執行如下命令:

$ npm bugs request

另外,如要查看package的倉庫,執行如下命令:

$ npm repo request

4. 保存依賴

當你找到想用在工程裏的package以後,下一步就是安裝和保存它。最經常使用的方式是採用npm install request譯註:其中的request是package名字)。

若是你還想把這個package自動加到package.json裏,你能夠這樣:

$ npm install request --save

npm會把你的依賴保存起來,並加上^前綴。這個前綴的意思是,下次再使用npm install是時候還會自動安裝這個package的在此大版本下的最新版本。若是你想修改這個功能的話,能夠:

$ npm config set save-prefix='~'

若是你就想保存目前的這個版本,能夠:

$ npm config set save-exact true

5. 鎖定依賴

你能夠像前面一節講的那樣,在package.json裏面指定了保存依賴的版本號。但大部分npm模塊的做者不會這樣作,由於他們想自動地獲取補丁和新功能。

但在生產環境下,若是不指定保存依賴的版本號會存在問題。由於若是剛好你開發的過程當中做者發佈了新版本,那麼有可能本地和生產環境使用的依賴的版本就是不同的。這個時候,若是新版本有bug的話,就會影響到生產環境。

要解決這個問題,你可使用npm shrinkwrap。它會生成一個npm-shrinkwrap.json文件,不只記錄了當前環境中使用的模塊精確的版本號,還記錄了這些模塊的其餘依賴的版本,以此類推。一旦工程中有了此文件,npm install就會使用它來複制一個徹底同樣的依賴樹。

6. 查找過期的依賴

npm提供了一個內置的工具方法來查看過期的依賴:npm outdated

$ npm outdated
conventional-changelog    0.5.3   0.5.3   1.1.0  @risingstack/docker-node  
eslint-config-standard    4.4.0   4.4.0   6.0.1  @risingstack/docker-node  
eslint-plugin-standard    1.3.1   1.3.1   2.0.0  @risingstack/docker-node  
rimraf                    2.5.1   2.5.1   2.5.4  @risingstack/docker-node

當你維護的項目不少的時候,要保持每一個項目中的依賴都是最新的是一件很痛苦的事情。要實現這個任務的自動化,能夠選用Greenkeeper,當有依賴更新的時候,它會自動爲你的倉庫發pull請求。

7. 保存生產環境中沒有devDepenendencies

devDepenendencies爲開發環境依賴是有緣由的,你在生產環境是用不着他們的。生產環境不用這些devDepenendencies可讓你線上的代碼包更小更安全,由於多一個依賴就多一個安全風險。

若是須要只安裝生產環境依賴,運行:

$ npm install --production

或者,你能夠設置NODE_ENV變量爲生產環境:

$ NODE_ENV=production npm install

8. 確保你的項目和token的安全

若是你開發的時候登錄了Linux系統的用戶,那你的npm token就會存在.npmrc文件中。有的時候這個文件會不當心被上傳到github。目前,在github上搜索.npmrc文件的話,能找到好幾千個,裏面不少都包含了token。若是你本身的倉庫裏也有.xxx的文件的話,趕快檢查下本身的證書有沒有被上傳!

另外一個潛在的安全隱患在於,有的文件會被不當心上發佈到npm上。通常來講npm是參考.gitignore文件來決定哪些文件會被上傳。但你也能夠加一個.npmignore文件,它會override.gitignore

9. 開發package

在本地開發package的時候,你們通常都會在發佈以前在本身的項目上先實踐一下。這個時候npm link就能派上用場。

npm link的做用在於,它會在全局目錄建立一個symlink(符號連接),指向npm link所運行的那個package。

你也能夠在其餘地方運行npm link package-name,這樣會在全局安裝的package-name和目前項目的/node_modules之間建立一個symlink。

能夠像下面這樣實踐一下!

# create a symlink to the global folder
/projects/request $ npm link

# link request to the current node_modules
/projects/my-server $ npm link request

# after running this project, the require('request') 
# will include the module from projects/request
相關文章
相關標籤/搜索