npm 最佳实践
npm最佳实践
在Node.js大规模应用系列中,我们写了一系列的文章,着重关注大规模应用Node的公司以及已经了解基本Node的开发者的需求。
第一章是你将学习到的是npm的最佳实践以及一些技巧,这些技巧可以帮助你在日常开发中节省很大一部分时间。
npm install是最常用的命令。但是npm提供了更多的命令。这篇文章你会了解到npm在你整个应用开发周期中是怎么帮助你的,从新建一个项目到开发再到部署。
0 了解你的npm
在深入了解主题之前,让我们了解一些你正在使用的npm的版本信息和可用的命令。
npm 版本
运行npm --version获取npm版本。运行npm verion可以得到更多的信息,包括当前包的版本,node.js的版本和openssl和v8的版本
$ 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' }
npm help
像多数命令行工具一样,npm内建了一个help功能。经常能得到细节描述和摘要信息。这些基本上是man-pages的信息。
$ 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.
用npm init 初始化新项目
当初始化新项目时,npm init可以帮助你交互式地创建package.json,它会提问一些例如项目名称或描述的问题。但是,通过npm init --yes可以更快地创建。
如果你使用了它,命令行不会提示任何信息,仅仅是创建了一个package.json,填充一些默认的信息。你可以使用以下命令设置默认信息:
npm config set init.author.name YOUR_NAME
npm config set init.author.email YOUR_EMAIL
2 寻找npm包
找到合适的npm包是具有挑战性的。成百上千的包供你挑选。举例来说,让我们选一个包来帮助我们发送http请求。 npms.io是个很好的网站。它展示了诸如质量,流行度和维护性等指标。这些是通过模块是否有过期的依赖,是否有linter配置,是否有测试或最近提交的时间等指标衡量的。
3 调查npm包
一旦我们选择了模块(这个例子是request),我们需要看看文档,打开的issues等来了解我们究竟要在项目中引入什么。不要忘了你用越多的包,你就会越有漏洞或恶意代码的风险。如果你想要读更多的关于 npm安全相关的风险,可以阅读我们相关的指南。 如果你想打开模块的主页,你可以输入
$ npm home request
输入开启的issues或公开的路线图,你可以输入$ npm bugs request,或者你可以打开它的git仓库地址npm repo request
4 保存依赖
一旦你找到需要的包,你需要安装并保存。常用命令是npm install request,如果你想自动保存到package.json,你可以npm install request --save,npm会默认用^保存依赖。这意味着下一次运行npm install时,主版本相同的最新包会被安装。
要改变默认行为,你可以输入npm config set save-prefix='~',如果你需要确定的版本,你可以输入$ npm config set save-exact true
5 锁定依赖
即使你用特定版本安装你的依赖,你需要注意多数npm模块的作者不会这样做。这是很正常的,他们这样做是为了自动得到补丁和新的功能。
但这样的情况会在生产部署的时候产生问题:可能会使生产环境的版本和本地的不一致。如果间接依赖的包有更新,且新版本的依赖有了bug,就会产生问题,影响到生产系统。
为了解决这个问题,你可以用npm shrinkwrap。它会产生npm-shrinkwrap.json,它不仅包含直接依赖的确切版本,也包含间接依赖的确切版本。一旦你有了这个文件,npm install就会用它来生成依赖树。
6 检查过期的依赖
可以用内建的npm outdated检测过期的依赖。在你项目的文件夹运行此命令
Package Current Wanted Latest Location
ava 0.16.0 0.16.0 0.17.0 duimenger
gulp-imagemin 2.4.0 2.4.0 3.1.1 duimenger
gulp-jsdoc3 0.3.0 0.3.0 1.0.1 duimenger
gulp-uglify 1.5.4 1.5.4 2.0.0 duimenger
helmet 2.3.0 2.3.0 3.1.0 duimenger
lodash 4.17.1 4.17.2 4.17.2 duimenger
log4js 0.6.38 0.6.38 1.0.1 duimenger
request 2.78.0 2.79.0 2.79.0 duimenger
serve-favicon 2.3.0 2.3.2 2.3.2 duimenger
一旦你管理更多的项目,保持你项目的所有依赖都是最新的是个巨大的工作。可以使用Greenkeeper,一旦依赖过期它会自动地发送pr到你的仓库。
7 生产环境不要有devDepenendencies
被称为开发依赖(devDepenendencies )是有原因的。你不需要在生产环境引用它们。它会使部署占的空间更小更安全,因为生产环境模块越少产生安全问题的模块就越少。用npm install --production或 NODE_ENV=production npm install只安装生产依赖
8 保证你项目和口令的安全
如果你登录了npm,你的npm token会存在.npmrc文件中。随着多数开发者在github上存.开头的文件,这些token会被公开。在github上可以搜到很多这样的文件,其中很多都包含token。如果仓库中包含.npmrc,请检查是否包含口令!
另一类可能的安全问题是不经意地发布一些文件到npm.一般情况下npm遵循.gitignore文件的规则,满足这些规则的不会发布。但是如果你添加了.npmignore文件,它会复写.gitignore的内容,它们两者不会合并。
9 开发包
当在本地开发时,你经常会试着在你的项目中引用你开发的包,这些开发的包还没有发布到npm,这时 npm link可以起作用。
这个命令创建了一个执行这个命令的文件夹到全局文件夹的符号链接。
你从另一个地方可以执行npm link package-name,创建一个从全局安装的package-name包到当前目录下的node_modules文件夹的链接。
# 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