Node黑客开发的10个好习惯(2016)

        在2015年底之际,javascript开发者已经掌握了大量的工具。最后一次我们调查的时候,现代化的JS蓝图才刚刚出现。今天,我们很容易在JS的庞大生态系统中迷失,而成功的团队大部分时间都遵守着JS开发的准则,保持着他们的项目健康发展。

        在进入2016之际,我们奉上10个Node.js Hacker开发的好习惯。对于Nodejs应用开发者来说,这10个习惯比Node模块开发者更加特别,尽管他们有着不同的目标和制约因素。

1.通过npm init来创建每个新项目

npm init能够为你的项目创建一个可用的package.json文件,并且能根据你的工作目录来推测出共同的属性。

$ mkdir my-awesome-app
$ cd my-awesome-app
$ npm init --yes

 你要做的第一件事情就是通过你的Nodejs版本来指定"engines"的内容。

"engines": {
  "node": "4.2.1"
}

 2.巧用npmrc

默认情况下,npm命令并不会将已经安装的依赖写入package.json(这样一来,你必须经常检查你的依赖项)。

如果你使用--save来自动更新package.json,npm会通过前缀(^)安装包,会将你依赖的模块变更到一个不稳定的版本。这虽然对模块开发者来说是好事,但是对于app开发者来说却不一定是好事,因为你需要让你的依赖项都处在可控的环境下。

一个好的解决方案如下:

$ npm install foobar --save --save-exact

 更好的方案,可以将配置设置到~/.npmrc来更新默认项。

$ npm config set save=true
$ npm config set save-exact=true
$ cat ~/.npmrc

 这样,npm install footbar会自动将footbar添加到package.json,而你的依赖项也不会发生变化。

3.跟上ES6的步伐

Node 4.0以上版本,依据多个ES6的特性更新了V8引擎。不要被复杂的东西给吓住了,只要你想学,肯定能很快学会。如下有一些能够满足你的简单的改善点:

let user = users.find(u => u.id === ID);

console.log(`Hello, ${ user.name }!`);

4.坚持使用小写

有些语言推荐文件名跟类名相同,比如MyClass和“MyClass.js”。在Node中不建议这么做,建议使用小写的文件名:

let MyClass = require('my-class');

 Node.js是一个强大的跨平台支持以Linux为中心的工具类中罕见的例子。但是在OSX 和Windows中会认为'myclass.js' 和'MyClass.js' 是一样的,linux却对文件大小写敏感。为了让你的代码能够在各个平台完美运行,你需要精确匹配require,也包括大小写。

最简单的办法就是坚持使用小写的文件名,例如'my-class.js'。

5.app集群化

由于Node的runtime限制在单一CPU核心和1.5GB的内存,在一台大的服务器上部署一个非集群化的app是极大的资源浪费。

为了充分利用多核和超越1.5GB的内存,引入集群化支持到你的app中。即使你的仅仅在你的小规模的硬件上运行一个单进程,集群化也给你未来带来了简单的灵活性。

测试是最好的办法来决定你的集群化进程的数量,但最好开始使用你的平台提供的默认值,再做简单的回退。例如:

const CONCURRENCY = process.env.WEB_CONCURRENCY || 1;

选择一个集群抽象来避免重复进程管理。如果你喜欢将主文件和worker文件分开,你可以尝试forky。如果你喜欢单一入口函数,可以看一下throng

6.环保意识

不要乱丢与你项目相关的配置文件。相反,充分利用环境变量。

首先,安装node-foreman

$ npm install --save --save-exact foreman

 其次,创建一个Procfile来指定你的app的进程类型:

web: bin/web
worker: bin/worker

 最后,你便可以使用nf命令来启动

"scripts": {
  "start": "nf start"
}

 为了提供本地的开发环境,创建一个.gitignore .env文件,它会被node-foreman模块进行加载。

DATABASE_URL='postgres://localhost/foobar'
HTTP_TIMEOUT=10000

 这时,仅需要一个简单的npm start命令便可以在当前环境下启动一个web进程和一个worker进程。当你部署了你的程序后,程序便会自动适应新域名的环境变量。

7.减少内存垃圾

node(v8)引擎使用的是既"懒"又"贪婪"的垃圾回收机制。由于最大的内存限制是1.5G,有时候它会等到不得不回收的时候才去将未使用的内存进行回收。如果你的内存使用量在上涨,那么它有可能不是内存泄漏,而是Node的一贯懒散行为。

为了更好的控制程序的内存控制器,可以在Procfile中为V8提供标志。

web: node --optimize_for_size --max_old_space_size=920 --gc_interval=100 server.js

 当成勋运行环境的内存小于1.5G的时候,这一点显得尤为重要。比如,如果你想将你的Node分割成512MB的容器时:

web: node --optimize_for_size --max_old_space_size=460 --gc_interval=100 server.js

8.使用钩子

npm的lifecycle scripts能为程序的自动化带来帮助。如果你在编译程序之前要运行程序,可以使用preinstall脚本。如果需要编译grunt,gulp,browserify或者webpack,请使用postinstall脚本。

在package.json中添加:

"scripts": {
  "postinstall": "bower install && grunt build",
  "start": "nf start"
}

 可以通过环境变量来控制这些脚本:

"postinstall": "if $BUILD_ASSETS; then npm run build-assets; fi",
"build-assets": "bower install && grunt build"

 如果你的脚本失去控制,把他们移动到

"postinstall": "scripts/postinstall.sh"

 脚本中通常在Path中添加了 ./node_modules/.bin,所以可以直接使用命令bower或者webpack来运行。

9.仅上传重要文件到git上

大多数程序是由必须文件和生成文件组成。当使用git来管理代码,请避免track生成的文件。

例如node程序通常有node_modules作为程序的依赖,这些文件不需要上传到git上。只要程序的依赖项在package.json中,任何人都可以通过npm install 来创建一个相同node_modules副本。

track生成文件会在你的git历史中留下不必要的记录。更糟糕的是,有些依赖是仅仅是本机的且需要被编译,把他们提交上去可能会导致程序的不可以移植性,因为你可能仅仅将你的程序在一个不正确的环境下编译的。

基于同样的原因,不要将bower_components或者grunt build的生成文件提交上去。

如果曾经将node_modules提交了,可以通过如下命令移除

$ echo 'node_modules' >> .gitignore
$ git rm -r --cached node_modules
$ git commit -am 'ignore node_modules'

 可以忽略npm的安装日志:

$ echo 'npm-debug.log' >> .gitignore
$ git commit -am 'ignore npm-debug'

 当忽略了这些非必需的文件后,工程会变得很小,提交内容也会变得简单,也不需要合并生成的文件。

10.简单化

“技术预测”已经被公认为不准确的了。但是我在这里还是要预测下一年,我预测2016将是简化javascript的一年。越来越多的开发者简化了他们的框架。他们通过静态前端(静态前端可以通过CDN来提供服务)、Node.js API来构建动态数据的方式来构建应用程序。

我们也将看到复杂的编译系统在项目中带来的阻力。前沿的开发者正在通过“vanilla”简化他们的程序,而不再使用bower、gulp和grunt。

最后,我们将在2016年简化我们的代码。有时,像Douglas Crockford's "The Better Parts移除特性,有时又像我最喜欢的回调替换----async-await来添加特性。异步等待(async-await)在Node中还没有实现,但是你可以使用BabelJS

尽量去简化你的程序吧,而不要去看你的程序中可以使用有多少工具和框架。

你的习惯?

我已经在所有的项目中都按照上述的习惯来实行。无论你是一个Node新手还是服务端开发的JS老将,你已经有了自己的招数。我们都期待着来听听你的习惯,通过#node_habits来分享你的习惯吧。

英文原文:https://blog.heroku.com/archives/2015/11/10/node-habits-2016

原文地址:https://www.cnblogs.com/Kevin-Zhao/p/5125035.html