Node.js编程规范
摘自: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编程规范的更多相关文章
- JS编程规范
在第一家公司用C++时,公司有着严格的代码规范,甚至到了严苛的地步,现在回想起来,对它充满感激.一个好的习惯让你收益终身. 之后使用JS/TS却没有为自己定一套编程规范,所幸为时不晚,在这里参考air ...
- Node.js编程之异步
异步操作 Node采用V8引擎处理JavaScript脚本,最大特点就是单线程运行,一次只能运行一个任务.这导致Node大量采用异步操作(asynchronous opertion),即任务不是马上执 ...
- 【Node.js】4.从一个例子切入Node js的规范
在开始之前,需要明确的一点就是, ①Node应用是由模块组成的,每一个文件都是一个模块,有自己的作用域. ②在这个文件里定义的变量,函数,类都是私有的,对其他的文件不可见. ③在一个文件中,也就是在一 ...
- JS编程规范指南
原文:github.com/ryanmcdermott/clean-code-javascript 说明:本文翻译自 github 上的一个项目,只取部分精华. 一.变量 用有意义且常用的单词命名 / ...
- 《Node.js开发指南》知识整理
Node.js简介 Node是一个可以让JavaScript运行在服务器端的平台,抛弃了传统平台依靠多线程来实现高并发的设计思路,而采用单线程.异步式I/O.事件驱动式的程序设计模型. 安装和配置No ...
- Node.js 开发指南
1.Node.js 简介 Node.js 其实就是借助谷歌的 V8 引擎,将桌面端的 js 带到了服务器端,它的出现我将其归结为两点: V8 引擎的出色: js 异步 io 与事件驱动给服务器带来极高 ...
- 深入理解node.js异步编程:基础篇
###[本文是基础内容,大神请绕道,才疏学浅,难免纰漏,请各位轻喷] ##1. 概述 目前开源社区最火热的技术当属Node.js莫属了,作为使用Javascript为主要开发语言的服务器端编程技术和平 ...
- [Node.js] Promise,Q及Async
原文地址:http://www.moye.me/2014/12/27/promise_q_async/ 引子 在使用Node/JS编程的时候,经常会遇到这样的问题:有一连串的异步方法,需要按顺序执行, ...
- node.js浅见
看过很多朋友node.js代码敲得很好,但是对于概念还是很生疏.个人认为,代码是树叶,树干搭起来才是王道. 1.简述node.js的适用场景: IIO密集而非计算密集的情景:高并发微数据(比如账号系统 ...
随机推荐
- linux一些稍微高级的命令
cut 命令:提取文件中指定的字段(列).字符内容.单词的默认分隔符为空格. cut [选项]... [文件]... 选项: -b 按照字节切 -c 按照字符切 -d 指定分割符 -f 指定 ...
- (原)pycharm中debugger时console如何打开
转载请注明出处; https://www.cnblogs.com/darkknightzh/p/9913439.html 使用pycharm在debugger时,旁边的console一不小心给关了.要 ...
- swift3 与 OC 语法区别
1.Swift还增加了Objective-C中没有的类型比如元组(Tuple). 元组可以让你创建或者传递一组数据,比如作为函数的返回值时,你可以用一个元组可以返回多个值. 元组(tuples)把多个 ...
- 安装二维码、条形码识别工具zbar
参考:http://blog.csdn.net/gaofuqi/article/details/26698547 http://www.imagemagick.org/download/ImageMa ...
- [Aaronyang] 写给自己的WPF4.5 笔记10[层次数据需求处理,TreeView绿色文章1/4]
我的文章一定要做到对读者负责,否则就是失败的文章 --------- www.ayjs.net aaronyang技术分享 AY留言: 文章根据难易,我根据游戏的规则进行了分色,希望读者 ...
- C#字符串转换为float
1.解决不同计算机上,区域和时间不同而引起的转换问题(如:“123.456”报“字符串格式不正确”问题) //解决区域.语言变更引起的“识别不出小数点问题”如:转换时“123.456”转换时不认识&q ...
- Service discovery
https://www.cnblogs.com/dirt2/p/5987067.html Use Assigned Numbers in the Service Discovery Protocol ...
- SNF快速开发平台--规则引擎介绍和使用文档
设计目标: a) 规则引擎语法能够满足分单,计费,WMS策略的配置要求.语法是一致和统一的 b) 能够在不修改规则引擎模块的情况下,加入任意一个新的规则:实现上述需求之外的规则配置需求 c) 运算速度 ...
- (Java编程思想)Thinking in Java
1. 为什么突然想去研读<Thinking in Java>? 最近终于下定决心撸了一本<Thinking in Java>第四版,虽然在此之前我就久闻这本书的大名,但一直未曾 ...
- linux每日命令(39):lsof命令
lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 ...