【译文】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