摘自:https://github.com/dead-horse/node-style-guide

https://github.com/felixge/node-style-guide

2空格缩进

使用2个空格而不是 tab 来进行代码缩进,同时绝对不要混用空格和 tab 。

Sublime Text 2 设置(perfernces > Settings - User):

  "tab_size": 2,
"translate_tabs_to_spaces": true

换行

使用 UNIX 风格的换行符 (\n),同时在每个文件的结尾添加一个换行符。 Windows 风格的换行符 (\r\n) 是绝对禁止出现在任何项目中的。

Sublime Text 2 设置(perfernces > Settings - User):

  "default_line_ending": "unix"

去除行末尾的多余空格

就像吃完饭要刷牙一样,在提交 (commit) 代码之前你需要清理掉所有的不必要的空格。

Sublime Text2 设置(perfernces > Settings - User):

  "trim_trailing_white_space_on_save": true

使用分号

是否使用分号,在社区争论已久。 isaac 也写过一篇讨论的文章, 但是,当可以用廉价的语法来消除一些可能引入的错误的时候,请当一个保守派。

每行80个字符

限制你每行代码不超过80个字符。尽管现在的显示器越来越大,但是你的大脑并没有变大,并且你还可以把你的大显示器切分成多屏来显示。

Sublime Text 2 设置(perfernces > Settings - User):

  "rulers": [80]

多屏:view > Layout > Columns 2

使用单引号

除非编写.json文件,其他时候都请用单引号包裹字符串。

Right:

var foo = 'bar';

Wrong:

var foo = "bar";

大括号位置

请把你的所有的左大括号都放在语句开始的这一行。

Right:

if (true) {
console.log('winning');
}

Wrong:

if (true)
{
console.log('losing');
}

同时,请注意在条件判断前后都添加一个空格。

每个变量声明都带一个 var

每个变量声明都带一个 var ,这样删除或者调整变量声明的顺序会更加容易。 不要把变量都声明在最前面,而是声明在它最有意义的地方。

Right:

var keys   = ['foo', 'bar'];
var values = [23, 42]; var object = {};
while (items.length) {
var key = keys.pop();
object[key] = values.pop();
}

Wrong:

var keys = ['foo', 'bar'],
values = [23, 42],
object = {},
key; while (items.length) {
key = keys.pop();
object[key] = values.pop();
}

变量、属性和函数名都采用小驼峰

变量、属性和函数的命名风格都需要遵循小驼峰风格。 同时所有的命名都是有意义的。 尽量避免用单字符变量和少见单词来命名。

Right:

var adminUser = db.query('SELECT * FROM users ...');

Wrong:

var admin_user = db.query('SELECT * FROM users ...');
var a = db.query('SELECT * FROM users ...');

类名采用大驼峰

类名都采用大驼峰风格来命名。

Right:

function BankAccount() {
}

Wrong:

function bank_Account() {
}

用大写来标识常量

常量变量和对象的静态常量属性都需要特殊表明,通过全部大写的方式来表明。

尽管 Node.js / V8 支持 mozilla 的 const 关键字, 但是不幸的是,对象的属性并不支持这个关键字,而且 const 没有包含于任何一个 ECMA 规范中。

Right:

var SECOND = 1 * 1000;

function File() {
}
File.FULL_PERMISSIONS = 0777;

Wrong:

const SECOND = 1 * 1000;

function File() {
}
File.fullPermissions = 0777;

对象、数组的创建

使用尾随逗号,尽量用一行来声明,只有在编译器不接受的情况下才把对象的 key 用单引号包裹。 使用字面表达式,用 {}, [] 代替 new Array, new Object

Right:

var a = ['hello', 'world'];
var b = {
good: 'code',
'is generally': 'pretty',
};

Wrong:

var a = [
'hello', 'world'
];
var b = {"good": 'code'
, is generally: 'pretty'
};

使用 === 比较符

写代码并不是在背这些 stupid rules 。使用 === 操作符来进行比较操作,它会完全按照你的期望来执行。

Right:

var a = 0;
if (a === '') {
console.log('winning');
}

Wrong:

var a = 0;
if (a == '') {
console.log('losing');
}

三元操作符分多行

三元操作符不应该写在一行,将它分割到多行。

Right:

var foo = (a === b)
? 1
: 2;

Wrong:

var foo = (a === b) ? 1 : 2;

不要扩展内建类型

不要扩展 javascript 内建对象的方法。将来的你会感谢你这个做法的。

Right:

var a = [];
if (!a.length) {
console.log('winning');
}

Wrong:

Array.prototype.empty = function() {
return !this.length;
} var a = [];
if (a.empty()) {
console.log('losing');
}

使用有意义的判断条件

所有复杂的条件判断都需要赋予一个有意义的名字或者方法。

Right:

var isValidPassword = password.length >= 4 && /^(?=.*\d).{4,}$/.test(password);

if (isValidPassword) {
console.log('winning');
}

Wrong:

if (password.length >= 4 && /^(?=.*\d).{4,}$/.test(password)) {
console.log('losing');
}

写精简的函数

保持你的函数尽可能的精简。 一个好的函数应该能够在幻灯片上一屏显示,并且让坐在教室最后一排的人看清楚。 别再去数你的每一个函数并控制在15行以内了。

尽早的从函数中返回

为了避免深入嵌套的 if 语句,请尽早的从函数中返回。

Right:

function isPercentage(val) {
if (val < 0) {
return false;
} if (val > 100) {
return false;
} return true;
}

Wrong:

function isPercentage(val) {
if (val >= 0) {
if (val < 100) {
return true;
} else {
return false;
}
} else {
return false;
}
}

针对这个示例,甚至可以进一步精简优化:

function isPercentage(val) {
var isInRange = (val >= 0 && val <= 100);
return isInRange;
}

给你的闭包命名

请尽量给你的闭包、匿名函数命名。 这让人知道你在意这个函数,更重要的是,这将会产生可读性更好的堆栈跟踪和CPU调用信息等。

Right:

req.on('end', function onEnd() {
console.log('winning');
});

Wrong:

req.on('end', function() {
console.log('losing');
});

不要嵌套闭包

使用闭包,但是不要嵌套他们,否则你的代码将会一团糟。

Right:

setTimeout(function() {
client.connect(afterConnect);
}, 1000); function afterConnect() {
console.log('winning');
}

Wrong:

setTimeout(function() {
client.connect(function() {
console.log('losing');
});
}, 1000);

使用单行注释风格

不管是单行注释还是多行注释,都使用 // 。 同时请尝试在更高层次来编写注释(解释函数整体的思路), 只在解释一些难以理解代码的时候添加注释,而不是给一些琐碎的东西加上注释。

Right:

// 'ID_SOMETHING=VALUE' -> ['ID_SOMETHING=VALUE'', 'SOMETHING', 'VALUE']
var matches = item.match(/ID_([^\n]+)=([^\n]+)/)); // This function has a nasty side effect where a failure to increment a
// redis counter used for statistics will cause an exception. This needs
// to be fixed in a later iteration.
function loadUser(id, cb) {
// ...
} var isSessionValid = (session.expires < Date.now());
if (isSessionValid) {
// ...
}

Wrong:

// Execute a regex
var matches = item.match(/ID_([^\n]+)=([^\n]+)/)); // Usage: loadUser(5, function() { ... })
function loadUser(id, cb) {
// ...
} // Check if the session is valid
var isSessionValid = (session.expires < Date.now());
// If the session is valid
if (isSessionValid) {
// ...
}

Object.freeze, Object.preventExtensions, Object.seal, with, eval

这一堆屎一样的东西,你永远都不会需要他们。

Getters 和 Setters

不要使用 setters ,他们会引发一些使用你的代码的人无法解决的问题。 当没有副作用的时候,可以使用 getters,例如提供一个集合类的长度属性的时候。

异步回调函数

Node 的异步回调函数的第一个参数应该是错误指示,只有这样才能够享受许多流程控制模块的福利。

Right:

function cb(err, data , ...) {...}

Wrong:

function cb(data, ...) {...}

继承

尽管有许多的方法来实现继承,但是最为推荐的是 Node 的标准写法:

function Socket(options) {
// ...
stream.Stream.call(this);
// ...
} util.inherits(Socket, stream.Stream);

文件命名

单词之间使用 _ underscore 来分割,如果你不想暴露某个文件给用户,你也可以用 _ 来开头

Right:

child_process.js
string_decoder.js
_linklist.js

Wrong:

childProcess.js
stringDecoder.js

空格

在所有的操作符前后都添加空格,function 关键字后面添加空格

Right:

var add = function (a, b) {
return a + b;
};

Wrong:

var add=function(a,b){
return a+b;
}

Node.js编程规范的更多相关文章

  1. JS编程规范

    在第一家公司用C++时,公司有着严格的代码规范,甚至到了严苛的地步,现在回想起来,对它充满感激.一个好的习惯让你收益终身. 之后使用JS/TS却没有为自己定一套编程规范,所幸为时不晚,在这里参考air ...

  2. Node.js编程之异步

    异步操作 Node采用V8引擎处理JavaScript脚本,最大特点就是单线程运行,一次只能运行一个任务.这导致Node大量采用异步操作(asynchronous opertion),即任务不是马上执 ...

  3. 【Node.js】4.从一个例子切入Node js的规范

    在开始之前,需要明确的一点就是, ①Node应用是由模块组成的,每一个文件都是一个模块,有自己的作用域. ②在这个文件里定义的变量,函数,类都是私有的,对其他的文件不可见. ③在一个文件中,也就是在一 ...

  4. JS编程规范指南

    原文:github.com/ryanmcdermott/clean-code-javascript 说明:本文翻译自 github 上的一个项目,只取部分精华. 一.变量 用有意义且常用的单词命名 / ...

  5. 《Node.js开发指南》知识整理

    Node.js简介 Node是一个可以让JavaScript运行在服务器端的平台,抛弃了传统平台依靠多线程来实现高并发的设计思路,而采用单线程.异步式I/O.事件驱动式的程序设计模型. 安装和配置No ...

  6. Node.js 开发指南

    1.Node.js 简介 Node.js 其实就是借助谷歌的 V8 引擎,将桌面端的 js 带到了服务器端,它的出现我将其归结为两点: V8 引擎的出色: js 异步 io 与事件驱动给服务器带来极高 ...

  7. 深入理解node.js异步编程:基础篇

    ###[本文是基础内容,大神请绕道,才疏学浅,难免纰漏,请各位轻喷] ##1. 概述 目前开源社区最火热的技术当属Node.js莫属了,作为使用Javascript为主要开发语言的服务器端编程技术和平 ...

  8. [Node.js] Promise,Q及Async

    原文地址:http://www.moye.me/2014/12/27/promise_q_async/ 引子 在使用Node/JS编程的时候,经常会遇到这样的问题:有一连串的异步方法,需要按顺序执行, ...

  9. node.js浅见

    看过很多朋友node.js代码敲得很好,但是对于概念还是很生疏.个人认为,代码是树叶,树干搭起来才是王道. 1.简述node.js的适用场景: IIO密集而非计算密集的情景:高并发微数据(比如账号系统 ...

随机推荐

  1. [转]oracle 常用的指令

    1.显示当前用户名 select user from dual; show user 2.显示当然用户有哪些表 select * from tab; 3.显示当所有用户的表 select * from ...

  2. no accounts with itunes connect access

    有时候打包上传的时候 会遇见  no accounts with itunes connect access 的报错 原因主要如下: 1. 你没有被开发者管理员加入 itunes connect 权限 ...

  3. Apache Spark 2.2.0 正式发布

    本章内容: 待整理 参考文献: Apache Spark 2.2.0正式发布 Spark Release 2.2.0

  4. Netty+MUI从零打造一个仿微信的高性能聊天项目,兼容iPhone/iPad/安卓

    要说到微信,我相信是个人都应该知道,几乎人人都会安装这款社交APP吧,它已经成为了我们生活中不可缺少的一份子. 我记得我上大学那会刚接触Java,做的第一个小项目就是基于J2SE的聊天室,使用Java ...

  5. 一篇文全面了解DevOps:从概念、关键问题、兴起到实现需求

    一篇文全面了解DevOps:从概念.关键问题.兴起到实现需求 转自:一篇文全面了解DevOps:从概念.关键问题.兴起到实现需求 2018-06-06 目前在国外,互联网巨头如Google.Faceb ...

  6. default listener is not configured in grid infrastructure home

    Oracle Restart enable database creation requries Default listener configured and running in Grid Inf ...

  7. app嵌入的H5页面的数据埋点总结

    好久没写博客了,大半年时间花费在了许多杂事上. 最近1个月专门为H5页面的app开发了一些埋点功能,主要是考虑到以后的可复制性和通用型,由于不是前端开发出身,相对来说还是比较简陋的. 正题开始:H5页 ...

  8. Vue.js常用指令:v-bind

    一.什么是v-bind指令 v-bind指令用于响应更新HTML特性,允许将一个或多个属性动态绑定到表达式.v-bind是应用在动态属性上面的. 二.语法 v-bind语法如下: v-bind:动态属 ...

  9. 从去除毛刺的策略看开运算opening_circle和闭运算closing_circle的异同

    例一:毛刺在往外凸的面上 策略1:分割出黑色部分,然后通过开运算去掉毛刺,再通过原黑色部分区域减去开运算之后的区域,得到毛刺部分的区域. read_image (Tu, 'C:/Users/xiahu ...

  10. Java如何查找系统的代理设置?

    在Java编程中,如何查找系统的代理设置? 以下示例显示如何使用HttpURLConnection类的systemSetting()方法和getResponse()方法的put方法在系统上查找代理设置 ...