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 开发工具.这些工具 ...
随机推荐
- CentOS下 MySQL5.7 详细的部署安装流程
MySQL5.7.14安装过程: 下载5.7版本:wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.14-linux-glibc2 ...
- MVC5 + EF6 完整入门教程三:EF来了
期待已久的EF终于来了 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程. 本次将会完成EF数据模型的搭建和使用. 基于这个模型,将之前的示例添加数据库查询验证功能. 文章提纲 概述 & ...
- My97DatePickerBeta 日历插件
<!doctype html><html lang="en"><head> <meta charset="UTF-8" ...
- ios项目中安装和使用CocoaPods
CocoaPods是什么? http://code4app.com/article/cocoapods-install-usage http://blog.csdn.net/jjmm2009/arti ...
- C++中的static关键字的总结
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 1.面向过程设计中的st ...
- java.lang.UnsupportedClassVersionError出错
代码出错如下:java.lang.UnsupportedClassVersionError: cn/itcast/mybatis/first/MybatisFirst : Unsupported ma ...
- RoseRT配置高版本的编译器
RoseRT配置高版本的VC++ ,我有VC++2008 Express ,实习时下载滴! 感谢Google,感谢大神地指导!困扰的问题终于解决,豁然开朗,so开始吧! 第一大步:重中之重, 确保nm ...
- Unity3d之个性化鼠标
代码实例: using UnityEngine; using System.Collections; public class CursorController : MonoBehaviour { / ...
- C++软件添加dump调试打印日志
#include <DbgHelp.h> #pragma comment(lib, "dbghelp.lib") LONG WINAPI TopLevelExcepti ...
- php类的__get和__set方法
(1)这两个方法是自动调用的 (2)这两个方法只有在成员变量是private的时候才会自己调用 testclass.php <?php class testclass { private $va ...