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
Node黑客开发的10个好习惯(2016)的更多相关文章
- 用Node.js开发Windows 10物联网应用
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 未来10年内,物联网将会如移动互联网这样深入到我们生活的各方各面.所以微软现在对物联网进行了 ...
- Node.js学习笔记——Node.js开发Web后台服务
一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...
- Linux虚拟机中 Node.js 开发环境搭建
Node.js 开发环境搭建: 1.下载CentOS镜像文件和VMWare虚拟机程序; 2.安装VMWare——>添加虚拟机——>选择CentOS镜像文件即可默认安装带有桌面的Linux虚 ...
- heX——基于 HTML5 和 Node.JS 开发桌面应用
heX 是网易有道团队的一个开源项目,允许你采用前端技术(HTML,CSS,JavaScript)开发桌面应用软件的跨平台解决方案.heX 是你开发桌面应用的一种新的选择,意在解决传统桌面应用开发中繁 ...
- 2015年最佳的15个 Node.js 开发工具
Node.js 越来月流行,这个基于 Google V8 引擎建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.在本文中,我们列出了2015年最佳的15个 Node.js 开发工具.这些工具 ...
- 推荐近期15个 Node.js 开发工具
近来Node.js 越来月流行了,这个基于Google V8 引擎建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.在本文中,我们列出了2015年最佳的15个 Node.js 开发工具.这些 ...
- 快速搭建 Node.js 开发环境以及加速 npm
如何快速搭建 node 开发环境 npm 超慢 github 无法打开的问题 于是我觉得应该写一篇文章解答所有这些起步问题,让新同学也能顺顺利利入门. 快速搭建 Node.js 开发环境 如果你想长期 ...
- Windows Phone开发(10):常用控件(上)
原文:Windows Phone开发(10):常用控件(上) Windows Phone的控件有几个来源,和传统的桌面应用程序开发或Web开发一样,有默认提供的控件和第三方开者发布的控件.一般而言,如 ...
- 推荐15个月 Node.js 开发工具
Node.js 越来月流行.这个基于 Google V8 引擎建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.在本文中.我们列出了2015年最佳的15个 Node.js 开发工具.这些工具 ...
随机推荐
- python 执行execute遇到的问题
1.如下方式去查询无法查询出结果,但直接在数据库查询中去查询是能查询到结果的,郁闷中,花了很久的时间才知道原来是双引号导致的 把:name="%s" 中的%s前后的双引号去掉就对了 ...
- MEF的学习笔记
为什么要使用MEF 在商业应用软件开发过程中,对于各个软件项目,都需要建立相应的系统框架,为了更好的规范系统的开发,提高生产效率,应该在公司级别制定相应的API标准.这些API标准将站在系统架构层次, ...
- WCF初探-26:WCF中的会话
理解WCF中的会话机制 在WCF应用程序中,会话将一组消息相互关联,从而形成对话.会话”是在两个终结点之间发送的所有消息的一种相互关系.当某个服务协定指定它需要会话时,该协定会指定所有调用(即,支持调 ...
- windbg无法下载符号文件
symbol file path: srv*d:\symbolslocal*http://msdl.microsoft.com/download/symbols 即使设置是对的,但我用.reload, ...
- 2014中国黑客榜(beta版)
黑客,英文hacker.精通计算机各类技术的计算机高手,泛指擅长IT技术的人群.计算机科学家. 最近受某机构所托搜集国内活跃黑客近况.本着客观专业,权威可信的原则参考了国内从00年到最新的黑客榜单,以 ...
- Java学习之多态
多态的概念 多态==晚绑定. 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = new Child(); ...
- 【转】Weblogic的集群
原文链接:http://www.cnblogs.com/HondaHsu/p/4267972.html 一.Weblogic的集群 还记得我们在第五天教程中讲到的关于Tomcat的集群吗? 两个tom ...
- 设计模式(2)--单例模式(Singleton Pattern)
概述 一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称):当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的 ...
- C/C++中的NULL讨论和总结
代码如下 #include <stdio.h> int main(){ int *p; p = NULL; printf("p=0x%x\n",p); typedef ...
- 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 ...