一个快乐的 Node.js 黑客的 10 个习惯

一个快乐的 Node.js 黑客的 10 个习惯

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.jsonscripts.test 区域可以用来指定脚本,来运行你的测试套件,如果你是使用像 Mocha 这样的东西运行测试,一定要将其包含在 package.jsondevDependencies 里, 并指向项目本地的二进制文件,而非你已经全局下载的 Mocha

5. 保持依赖关系不受源代码控制

很多 Node app 使用 npm 模块时用 C 语言依赖项,比如 bsonwshiredis,这些必须进行编译以适应 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,比如 preinstallpostinstall。这里有个例子:

这些脚本可以内连 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!


14 回复

一个快乐的 Node.js 黑客的 10 个习惯

JavaScript 自从诞生以来,虽然在很长一段时间内缺乏一些关键工具,但随着 Node.js 和 npm 的出现,这一切发生了巨大的变化。Node.js 提供了强大的命令行接口、REPL、包管理器和一个有组织的开源社区,使得 JavaScript 生态系统变得更为强大。以下是十个有助于提升 Node.js 开发效率的习惯。

1. 使用 npm init 开始新项目

npm init 命令可以帮助你创建一个 package.json 文件,这是一个项目的核心配置文件。它会根据当前目录名推断模块名称,并读取你的 Git 设置来确定仓库信息。

npm init

2. 声明所有依赖关系

每次安装项目本地的模块时使用 --save--save-dev,这将把依赖项添加到 package.json 文件中,确保项目依赖关系的一致性。

npm install lodash --save

3. 指定一个启动脚本

package.json 中为 scripts.start 添加一个值,这样可以用 npm start 快速启动应用。

{
  "name": "my-app",
  "version": "1.0.0",
  "scripts": {
    "start": "node index.js"
  }
}

4. 指定一个测试脚本

同样地,在 package.json 中为 scripts.test 添加一个值,以便运行测试套件。

{
  "scripts": {
    "test": "mocha"
  }
}

5. 保持依赖关系不受源代码控制

忽略 node_modules 目录,避免将依赖项纳入版本控制系统中。

/node_modules/

6. 使用环境变量配置 npm

利用环境变量来配置 npm 参数,这有助于管理不同环境下的配置差异。

export NPM_CONFIG_LOGLEVEL=warn

7. 使用自定义的 npm 注册表

配置自定义的 npm 注册表可以提高依赖项的下载速度和稳定性。

npm config set registry https://npm.example.com

8. 保持跟踪过时的依赖关系

使用 npm outdatednpm update 来检查和更新过时的依赖关系。

npm outdated
npm update

9. 用 npm 脚本运行自定义构建步骤

package.json 中定义自定义的 npm 脚本,例如 preinstallpostinstall,可以在安装过程中执行特定的操作。

{
  "scripts": {
    "preinstall": "echo 'Running preinstall hook'",
    "postinstall": "echo 'Running postinstall hook'"
  }
}

10. 尝试新的东西

尝试新的技术如 Harmony 特性,可以使你的应用更加现代和高效。

node --harmony my-app.js

11. 使用 Browserify

Browserify 允许你在浏览器中使用 Node.js 模块,极大地简化了前端开发。

npm install browserify --save-dev

通过遵循以上习惯,你可以更高效地开发和维护 Node.js 应用。如果你有更多的好习惯,欢迎分享!


这是楼主自己写的, 还是翻译的。 价值蛮高哟

不错。收藏了!!!

Browserify 其实,我到现在搞不明白怎么玩…起码,前端很多类库用的都是bower …

不错, 个楼主格式化了一下… 搜到原文了: https://blog.heroku.com/archives/2014/3/11/node-habits 中间很多段代码没合并到文章里来吧… 另外 “npm registry” 翻译错了吧

学习了, 谢谢 共享~

mark学习

也可以吧,您觉得呢

npm registry 应该怎么翻译比较妥当? 肯定不能翻译成"注册表"了, 要不翻译成"注册库"?

npm 镜像

一个快乐的 Node.js 黑客的 10 个习惯

1. 使用 npm init 开始新项目

npm init 是创建一个新的 Node.js 项目并生成 package.json 文件的快捷方式。你可以使用以下命令:

npm init

这个命令会引导你填写项目的基本信息,如项目名称、版本、描述、入口文件等。

2. 声明所有依赖关系

每次安装新的模块时,记得使用 --save--save-dev 参数来更新 package.json 文件:

npm install express --save

这样可以确保其他开发者能够方便地安装所有必要的依赖。

3. 指定一个启动脚本

package.json 中定义 start 脚本,以便其他人可以使用 npm start 来启动应用:

{
  "name": "your-app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  }
}

4. 指定一个测试脚本

同样在 package.json 中定义 test 脚本,确保其他开发者可以运行测试:

{
  "scripts": {
    "test": "mocha"
  },
  "devDependencies": {
    "mocha": "^9.0.0"
  }
}

5. 保持依赖关系不受源代码控制

忽略 node_modules 目录,让它在每次部署时重新生成。你可以在 .gitignore 文件中加入以下内容:

/node_modules/

6. 使用环境变量配置 npm

设置环境变量来配置 npm,例如:

export npm_config_registry=https://your-custom-registry.com

7. 用你自己的 npm 注册表

配置你的 Heroku 应用使用自定义的 npm 注册表:

heroku config:set NPM_CONFIG_REGISTRY=https://your-custom-registry.com

8. 保持跟踪过时的依赖关系

使用 npm outdated 命令来检查哪些依赖关系需要更新:

npm outdated

9. 用 npm 脚本运行自定义构建步骤

package.json 中定义 preinstallpostinstall 脚本:

{
  "scripts": {
    "preinstall": "echo 'Running preinstall'",
    "postinstall": "echo 'Running postinstall'"
  }
}

10. 尝试新的东西

尝试使用 Harmony 特性,如 block scoping, generators, proxies, weak maps 等:

{
  "engines": {
    "node": ">=14.0.0"
  },
  "scripts": {
    "start": "node --experimental-modules --harmony index.js"
  }
}

这些习惯可以帮助你更高效地编写和维护 Node.js 项目。

回到顶部