在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. CentOS下 MySQL5.7 详细的部署安装流程

    MySQL5.7.14安装过程: 下载5.7版本:wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.14-linux-glibc2 ...

  2. MVC5 + EF6 完整入门教程三:EF来了

    期待已久的EF终于来了 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程. 本次将会完成EF数据模型的搭建和使用. 基于这个模型,将之前的示例添加数据库查询验证功能. 文章提纲 概述 & ...

  3. My97DatePickerBeta 日历插件

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  4. ios项目中安装和使用CocoaPods

    CocoaPods是什么? http://code4app.com/article/cocoapods-install-usage http://blog.csdn.net/jjmm2009/arti ...

  5. C++中的static关键字的总结

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 1.面向过程设计中的st ...

  6. java.lang.UnsupportedClassVersionError出错

    代码出错如下:java.lang.UnsupportedClassVersionError: cn/itcast/mybatis/first/MybatisFirst : Unsupported ma ...

  7. RoseRT配置高版本的编译器

    RoseRT配置高版本的VC++ ,我有VC++2008 Express ,实习时下载滴! 感谢Google,感谢大神地指导!困扰的问题终于解决,豁然开朗,so开始吧! 第一大步:重中之重, 确保nm ...

  8. Unity3d之个性化鼠标

    代码实例: using UnityEngine; using System.Collections; public class CursorController : MonoBehaviour { / ...

  9. C++软件添加dump调试打印日志

    #include <DbgHelp.h> #pragma comment(lib, "dbghelp.lib") LONG WINAPI TopLevelExcepti ...

  10. php类的__get和__set方法

    (1)这两个方法是自动调用的 (2)这两个方法只有在成员变量是private的时候才会自己调用 testclass.php <?php class testclass { private $va ...