JavaScript 诞生近 20 年以来,大部分时间里,它都缺少一些关键之处,而其他编程语言像 Python 和 Ruby,它们所具有的一些关键工具使其魅力大增,比如:命令行接口,REPL,包管理器和一个有组织的开源社区。今天的 JavaScript 环境大大改善了,某种程度上是 Node.js 和 npm 的功劳。网页开发人员拥有了强大的新工具,唯一的限制只剩下自己的想象力。
接下来是一些技巧和窍门,它可以让你和你的 Node app 高兴不已。
1. 使用npm init开始新项目
npm
含有一个 init
命令,它会引导你创建一个 package.json
文件。即使你对 package.json
及其属性非常熟悉,npm init
也是你朝着正确方向开始写新的 Node app 或模块的一个方便的办法。它为你设置了智能的默认,比如从根目录名称推断模块名称,通过~/.npmrc
读取你的作者信息,用你的 Git 设置来确定 repository
。
2. 声明所有依赖关系
每次安装项目本地的模块时使用 --save (or --save-dev)
会是一个好习惯。这些标记添加给定的模块到你的 package.json
dependencies
(或 devDependencies
)列表,并使用一个合理默认的语义版本范围。
要注意 npm 现在使用 caret-style 语义版本范围:
3. 指定一个启动脚本
在 package.json
里为 scripts.start
设定一个值,这样就允许你在命令行用 npm start
开始写app。实现这样一个约定非常不错,因为可以允许任何 Node 开发人员克隆你的 app,并且不用任何猜测就能使其轻松运行。
Bonus(加分项):如果你在 package.json
文件里定义 script.start
,你就不需要 Procfile
文件。通过使用 npm start
作为建站流程(web process),一个 Procfile
文件会被自动创建。
这里有一个示例启动脚本:
4. 指定一个测试脚本
就像你的团队里任何成员应该能够运行你的 app,他们也应该能够测试 app。package.json
的 scripts.test
区域可以用来指定脚本,来运行你的测试套件,如果你是使用像 Mocha 这样的东西运行测试,一定要将其包含在 package.json
的 devDependencies
里, 并指向项目本地的二进制文件,而非你已经全局下载的 Mocha
5. 保持依赖关系不受源代码控制
很多 Node app 使用 npm 模块时用 C 语言依赖项,比如 bson
,ws
和 hiredis
,这些必须进行编译以适应 Heroku64 位 Linux 架构。而这一编译步骤是个耗费时间的过程。为了使构建项目尽可能快速,在依赖项被下载并编译后,Heroku 的 Node buildpack 会将其缓存,以便在后面的部署中再次使用。这个缓存意味着网络流量减少了,编译少了。
忽略 node_modules
目录也是 npm 为模块作者推荐的做法。App 和模块之间少了一个区别。
6. 使用环境变量配置 npm
来自于 npm 配置参考文档:
任何以 npm_config_
开头的环境变量会被解读为一个配置参数。例如,将 npm_config_foo=bar
放到你的环境里,foo
配置参数会被设置为 bar
。任何没有赋值的环境配置将会被赋真值。配置值是不区分大小写,所以 NPM_CONFIG_FOO=bar
同样可行。
最近,app 环境在所有 Heroku 架构中可用。这一改变让 Heroku 上 Node 用户控制他们的 npm 配置,而不用改变应用程序代码。Habit#7 是这一方法的完美体现。
7. 用你自己的npm注册表
公用 npm 注册表在最近几年已经有了很大进步,也带来了偶尔的不稳定性。结果就是很多 Node 用户在寻找公用注册表的替代者,不是为了开发和构建周期的速度和稳定性,就是作为托管私人 Node 模块的方法。
近几个月,一些 npm 注册表的替代者出现了。Nodejitsu 和 Gemfury 提供付费私人注册表,同时也有一些免费的,例如 Mozilla 的 read-only S3/CloudFront mirror 和 Maciej Małecki 的 European mirror.
配置你的 Heroku Node app 来使用自定义注册表会容易些:
8. 保持跟踪过时的依赖关系
如果你已经做编程足够长时间了,你可能已经遇到过“依赖关系地狱”。幸运的是 Node.js 和 npm 为实现合理依赖关系管理开了一个先例,通过使用语义版本实现,即语义版本控制规范。这样,版本号和它们的改变方式传达了底层代码的含义及一个版本到另一个版本发生的变化。
npm 有一个不为人知的命令,叫做 outdated
。结合 npm update
,它可以知道哪个 app 的依赖关系落后了并需要更新,是个很不错的工具。
如果你正在做开源 Node apps 或模块,可以查看 david-dm, NodeICO, 和 shields.io,这 3 个服务很厉害,它们可以提供图形标记,在你项目的 README 或网站里显示实时的依赖关系信息。
9. 用npm脚本运行自定义构建步骤
npm生态系统继续成长,使开发和构建过程自动化的选择也不断发展。在今天的 Node 世界里,Grunt 是到目前为止最流行的构建工具,但像 gulp.js 和 plain old npm scripts 这样的新工具同样是吸引人的选择,并更加轻型化(with lighter footprints)。
当你调配一个 Node app 到 Heroku,npm install –production
命令会开始运行以确保 app 的 npm 依赖项完成下载和安装。但这个命令也会做其他事情:它会运行任何在你的 package.json
文件里已经被你定义的 npm script hooks,比如 preinstall
和 postinstall
。这里有个例子:
这些脚本可以内连 Bash 命令或者会指向命令行可执行文件(command-line executables.)。
10. 尝试新的东西
Harmory 是 ES6 的工作名称,是 ECMAScript 语言的下一个版本,就是众所周知的 JavaScript。Harmony 为 JavaScript 带来了很多令人兴奋的新功能,其中很多新版本 Node 里已经可以用了。
Harmony 实现了很多新功能,比如: block scoping, generators, proxies, weak maps 等等。
为了在你的 Node app 里实现 harmony 功能,指定一个更加新的 Node 引擎比如 0.11.x
,并在你的启动脚本里设置 –harmony
标记:
11. Browserify
客户端的 JavaScript 有面条式编程的传统,但这不是编程语言本身的问题。合理的依赖项管理器的缺乏使我们很多年以来处在 jQuery-plugin 复制粘贴的黑暗年代。多亏了 npm,我们进入了前端的复兴时代:npm 注册表的发展几近疯狂,浏览器端使用模块的扩散令人吃惊。 Browserify 是一个了不起的工具,可以使 Node 模块在浏览器端工作。如果你是前端开发人员,Browserify 将改变你的生活,也许不是今天,也不在明天,但就在不久之后。查看这里的文章,开始使用 Browserify。
你的习惯是什么?
可能你已经用 Node 做开发有段时间了,也可能刚刚开始,我们希望你会发现这些建议对你有用。如果你有一些(好的)可以分享的 Node 使用习惯,可以发带有 #node habits
标签的推特。Happy hacking!