在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

Node黑客开发的10个好习惯(2016)的更多相关文章

  1. 用Node.js开发Windows 10物联网应用

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 未来10年内,物联网将会如移动互联网这样深入到我们生活的各方各面.所以微软现在对物联网进行了 ...

  2. Node.js学习笔记——Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

  3. Linux虚拟机中 Node.js 开发环境搭建

    Node.js 开发环境搭建: 1.下载CentOS镜像文件和VMWare虚拟机程序; 2.安装VMWare——>添加虚拟机——>选择CentOS镜像文件即可默认安装带有桌面的Linux虚 ...

  4. heX——基于 HTML5 和 Node.JS 开发桌面应用

    heX 是网易有道团队的一个开源项目,允许你采用前端技术(HTML,CSS,JavaScript)开发桌面应用软件的跨平台解决方案.heX 是你开发桌面应用的一种新的选择,意在解决传统桌面应用开发中繁 ...

  5. 2015年最佳的15个 Node.js 开发工具

    Node.js 越来月流行,这个基于 Google V8 引擎建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.在本文中,我们列出了2015年最佳的15个 Node.js 开发工具.这些工具 ...

  6. 推荐近期15个 Node.js 开发工具

    近来Node.js 越来月流行了,这个基于Google V8 引擎建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.在本文中,我们列出了2015年最佳的15个 Node.js 开发工具.这些 ...

  7. 快速搭建 Node.js 开发环境以及加速 npm

    如何快速搭建 node 开发环境 npm 超慢 github 无法打开的问题 于是我觉得应该写一篇文章解答所有这些起步问题,让新同学也能顺顺利利入门. 快速搭建 Node.js 开发环境 如果你想长期 ...

  8. Windows Phone开发(10):常用控件(上)

    原文:Windows Phone开发(10):常用控件(上) Windows Phone的控件有几个来源,和传统的桌面应用程序开发或Web开发一样,有默认提供的控件和第三方开者发布的控件.一般而言,如 ...

  9. 推荐15个月 Node.js 开发工具

    Node.js 越来月流行.这个基于 Google V8 引擎建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.在本文中.我们列出了2015年最佳的15个 Node.js 开发工具.这些工具 ...

随机推荐

  1. python 执行execute遇到的问题

    1.如下方式去查询无法查询出结果,但直接在数据库查询中去查询是能查询到结果的,郁闷中,花了很久的时间才知道原来是双引号导致的 把:name="%s" 中的%s前后的双引号去掉就对了 ...

  2. MEF的学习笔记

    为什么要使用MEF 在商业应用软件开发过程中,对于各个软件项目,都需要建立相应的系统框架,为了更好的规范系统的开发,提高生产效率,应该在公司级别制定相应的API标准.这些API标准将站在系统架构层次, ...

  3. WCF初探-26:WCF中的会话

    理解WCF中的会话机制 在WCF应用程序中,会话将一组消息相互关联,从而形成对话.会话”是在两个终结点之间发送的所有消息的一种相互关系.当某个服务协定指定它需要会话时,该协定会指定所有调用(即,支持调 ...

  4. windbg无法下载符号文件

    symbol file path: srv*d:\symbolslocal*http://msdl.microsoft.com/download/symbols 即使设置是对的,但我用.reload, ...

  5. 2014中国黑客榜(beta版)

    黑客,英文hacker.精通计算机各类技术的计算机高手,泛指擅长IT技术的人群.计算机科学家. 最近受某机构所托搜集国内活跃黑客近况.本着客观专业,权威可信的原则参考了国内从00年到最新的黑客榜单,以 ...

  6. Java学习之多态

    多态的概念 多态==晚绑定. 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = new Child(); ...

  7. 【转】Weblogic的集群

    原文链接:http://www.cnblogs.com/HondaHsu/p/4267972.html 一.Weblogic的集群 还记得我们在第五天教程中讲到的关于Tomcat的集群吗? 两个tom ...

  8. 设计模式(2)--单例模式(Singleton Pattern)

    概述 一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称):当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的 ...

  9. C/C++中的NULL讨论和总结

    代码如下 #include <stdio.h> int main(){ int *p; p = NULL; printf("p=0x%x\n",p); typedef ...

  10. hdu 1082, stack emulation, and how to remove redundancy 分类: hdoj 2015-07-16 02:24 86人阅读 评论(0) 收藏

    use fgets, and remove the potential '\n' in the string's last postion. (main point) remove redundanc ...