说明
接下来的内容全部都是copy的,都是一些标准的建议,初学者只好拿来膜拜了。
这是一份关于如何写出一致且美观的 Node.js 代码的风格指南。
它从社区最流行的写法中抽取出来,同时融入了部分个人观点。
这份指南由 Felix 编写。
通过 CC BY-SA 3.0 发布。
你可以 fork 这份指南,并针对自己的需求的进行部分的调整。
中文指南由 dead_horse 翻译,同时根据个人和团队经验有部分增加条目。
2空格缩进
使用2个空格而不是 tab 来进行代码缩进,同时绝对不要混用空格和 tab 。
Sublime Text 2 设置(perfernces > Settings - User):
1 | "tab_size": 2, |
换行
使用 UNIX 风格的换行符 (\n
),同时在每个文件的结尾添加一个换行符。
Windows 风格的换行符 (\r\n
) 是绝对禁止出现在任何项目中的。
Sublime Text 2 设置(perfernces > Settings - User):
1 | "default_line_ending": "unix" |
去除行末尾的多余空格
就像吃完饭要刷牙一样,在提交 (commit) 代码之前你需要清理掉所有的不必要的空格。
Sublime Text2 设置(perfernces > Settings - User):
1 | "trim_trailing_white_space_on_save": true |
使用分号
是否使用分号,在社区争论已久。
isaac 也写过一篇讨论的文章,
但是,当可以用廉价的语法来消除一些可能引入的错误的时候,请当一个保守派。
每行80个字符
限制你每行代码不超过80个字符。尽管现在的显示器越来越大,但是你的大脑并没有变大,并且你还可以把你的大显示器切分成多屏来显示。
Sublime Text 2 设置(perfernces > Settings - User):
1 | "rulers": [80] |
多屏:view > Layout > Columns 2
使用单引号
除非编写.json文件,其他时候都请用单引号包裹字符串。
Right:
1 | var foo = 'bar'; |
Wrong:
1 | var foo = "bar"; |
大括号位置
请把你的所有的左大括号都放在语句开始的这一行。
Right:
1 | if (true) { |
Wrong:
1 | if (true) |
同时,请注意在条件判断前后都添加一个空格。
每个变量声明都带一个 var
每个变量声明都带一个 var ,这样删除或者调整变量声明的顺序会更加容易。
不要把变量都声明在最前面,而是声明在它最有意义的地方。
Right:
1 | var keys = ['foo', 'bar']; |
Wrong:
1 | var keys = ['foo', 'bar'], |
变量、属性和函数名都采用小驼峰
变量、属性和函数的命名风格都需要遵循小驼峰风格。
同时所有的命名都是有意义的。
尽量避免用单字符变量和少见单词来命名。
Right:
1 | var adminUser = db.query('SELECT * FROM users ...'); |
Wrong:
1 | var admin_user = db.query('SELECT * FROM users ...'); |
类名采用大驼峰
类名都采用大驼峰风格来命名。
Right:
1 | function BankAccount() { |
Wrong:
1 | function bank_Account() { |
用大写来标识常量
常量变量和对象的静态常量属性都需要特殊表明,通过全部大写的方式来表明。
尽管 Node.js / V8 支持 mozilla 的 const 关键字,
但是不幸的是,对象的属性并不支持这个关键字,而且 const 没有包含于任何一个 ECMA 规范中。
Right:
1 | var SECOND = 1 * 1000; |
Wrong:
1 | const SECOND = 1 * 1000; |
对象、数组的创建
使用尾随逗号,尽量用一行来声明,只有在编译器不接受的情况下才把对象的 key 用单引号包裹。
使用字面表达式,用 {}, []
代替 new Array, new Object
。
Right:
1 | var a = ['hello', 'world']; |
Wrong:
1 | var a = [ |
使用 === 比较符
写代码并不是在背这些 stupid rules 。使用 ===
操作符来进行比较操作,它会完全按照你的期望来执行。
Right:
1 | var a = 0; |
Wrong:
1 | var a = 0; |
三元操作符分多行
三元操作符不应该写在一行,将它分割到多行。
Right:
1 | var foo = (a === b) |
Wrong:
1 | var foo = (a === b) ? 1 : 2; |
不要扩展内建类型
不要扩展 javascript 内建对象的方法。将来的你会感谢你这个做法的。
Right:
1 | var a = []; |
Wrong:
1 | Array.prototype.empty = function() { |
使用有意义的判断条件
所有复杂的条件判断都需要赋予一个有意义的名字或者方法。
Right:
1 | var isValidPassword = password.length >= 4 && /^(?=.*\d).{4,}$/.test(password); |
Wrong:
1 | if (password.length >= 4 && /^(?=.*\d).{4,}$/.test(password)) { |
写精简的函数
保持你的函数尽可能的精简。
一个好的函数应该能够在幻灯片上一屏显示,并且让坐在教室最后一排的人看清楚。
别再去数你的每一个函数并控制在15行以内了。
尽早的从函数中返回
为了避免深入嵌套的 if 语句,请尽早的从函数中返回。
Right:
1 | function isPercentage(val) { |
Wrong:
1 | function isPercentage(val) { |
针对这个示例,甚至可以进一步精简优化:
1 | function isPercentage(val) { |
给你的闭包命名
请尽量给你的闭包、匿名函数命名。
这让人知道你在意这个函数,更重要的是,这将会产生可读性更好的堆栈跟踪和CPU调用信息等。
Right:
1 | req.on('end', function onEnd() { |
Wrong:
1 | req.on('end', function() { |
不要嵌套闭包
使用闭包,但是不要嵌套他们,否则你的代码将会一团糟。
Right:
1 | setTimeout(function() { |
Wrong:
1 | setTimeout(function() { |
使用单行注释风格
不管是单行注释还是多行注释,都使用 //
。
同时请尝试在更高层次来编写注释(解释函数整体的思路),
只在解释一些难以理解代码的时候添加注释,而不是给一些琐碎的东西加上注释。
Right:
1 | // 'ID_SOMETHING=VALUE' -> ['ID_SOMETHING=VALUE'', 'SOMETHING', 'VALUE'] |
Wrong:
1 | // Execute a regex |
Object.freeze, Object.preventExtensions, Object.seal, with, eval
这一堆屎一样的东西,你永远都不会需要他们。
Getters 和 Setters
不要使用 setters ,他们会引发一些使用你的代码的人无法解决的问题。
当没有副作用的时候,可以使用 getters,例如提供一个集合类的长度属性的时候。
异步回调函数
Node 的异步回调函数的第一个参数应该是错误指示,只有这样才能够享受许多流程控制模块的福利。
Right:
1 | function cb(err, data , ...) {...} |
Wrong:
1 | function cb(data, ...) {...} |
继承
尽管有许多的方法来实现继承,但是最为推荐的是 Node 的标准写法:
1 | function Socket(options) { |
文件命名
单词之间使用 _
underscore 来分割,如果你不想暴露某个文件给用户,你也可以用 _
来开头
Right:
1 | child_process.js |
Wrong:
1 | childProcess.js |
空格
在所有的操作符前后都添加空格,function
关键字后面添加空格
Right:
1 | var add = function (a, b) { |
Wrong:
1 | var add=function(a,b){ |
尽量参照 Node.js 源码的编码风格
入乡随俗
给别人的项目提交 pull request 的时候,要注意遵循项目的编码规范,保持项目编码风格的统一。
来源: https://raw.githubusercontent.com/dead-horse/node-style-guide/master/Readme.md