{"id":17705002,"url":"https://github.com/dwqs/node-style-guide","last_synced_at":"2025-05-13T01:23:55.058Z","repository":{"id":87782411,"uuid":"89044861","full_name":"dwqs/node-style-guide","owner":"dwqs","description":"A guide for styling your node.js / JavaScript code.","archived":false,"fork":false,"pushed_at":"2017-06-24T04:53:21.000Z","size":11,"stargazers_count":32,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-01T05:34:30.591Z","etag":null,"topics":["nodejs","nodejs-style"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dwqs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-04-22T04:42:55.000Z","updated_at":"2022-11-26T17:08:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"16b14cca-ba31-463f-9025-797ad4aac202","html_url":"https://github.com/dwqs/node-style-guide","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dwqs%2Fnode-style-guide","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dwqs%2Fnode-style-guide/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dwqs%2Fnode-style-guide/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dwqs%2Fnode-style-guide/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dwqs","download_url":"https://codeload.github.com/dwqs/node-style-guide/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253851949,"owners_count":21973829,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["nodejs","nodejs-style"],"created_at":"2024-10-24T22:05:50.066Z","updated_at":"2025-05-13T01:23:55.039Z","avatar_url":"https://github.com/dwqs.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"## Nodejs Style Guide(by [felixge](https://github.com/felixge/node-style-guide))\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n\n[格式](#%E6%A0%BC%E5%BC%8F)\n  - [2个空格缩进](#2%E4%B8%AA%E7%A9%BA%E6%A0%BC%E7%BC%A9%E8%BF%9B)\n  - [换行](#%E6%8D%A2%E8%A1%8C)\n  - [清除尾随空格](#%E6%B8%85%E9%99%A4%E5%B0%BE%E9%9A%8F%E7%A9%BA%E6%A0%BC)\n  - [使用分号](#%E4%BD%BF%E7%94%A8%E5%88%86%E5%8F%B7)\n  - [每行限制 80 个字符](#%E6%AF%8F%E8%A1%8C%E9%99%90%E5%88%B6-80-%E4%B8%AA%E5%AD%97%E7%AC%A6)\n  - [使用单引号](#%E4%BD%BF%E7%94%A8%E5%8D%95%E5%BC%95%E5%8F%B7)\n  - [在同一行书写左大括号](#%E5%9C%A8%E5%90%8C%E4%B8%80%E8%A1%8C%E4%B9%A6%E5%86%99%E5%B7%A6%E5%A4%A7%E6%8B%AC%E5%8F%B7)\n  - [每个 var 语句只声明一个变量](#%E6%AF%8F%E4%B8%AA-var-%E8%AF%AD%E5%8F%A5%E5%8F%AA%E5%A3%B0%E6%98%8E%E4%B8%80%E4%B8%AA%E5%8F%98%E9%87%8F)\n\n[命名约定](#%E5%91%BD%E5%90%8D%E7%BA%A6%E5%AE%9A)\n  - [使用小驼峰式命名法对变量、属性和函数名命名](#%E4%BD%BF%E7%94%A8%E5%B0%8F%E9%A9%BC%E5%B3%B0%E5%BC%8F%E5%91%BD%E5%90%8D%E6%B3%95%E5%AF%B9%E5%8F%98%E9%87%8F%E5%B1%9E%E6%80%A7%E5%92%8C%E5%87%BD%E6%95%B0%E5%90%8D%E5%91%BD%E5%90%8D)\n  - [使用大驼峰式命名法对类名命名](#%E4%BD%BF%E7%94%A8%E5%A4%A7%E9%A9%BC%E5%B3%B0%E5%BC%8F%E5%91%BD%E5%90%8D%E6%B3%95%E5%AF%B9%E7%B1%BB%E5%90%8D%E5%91%BD%E5%90%8D)\n  - [使用大写字母对常量命名](#%E4%BD%BF%E7%94%A8%E5%A4%A7%E5%86%99%E5%AD%97%E6%AF%8D%E5%AF%B9%E5%B8%B8%E9%87%8F%E5%91%BD%E5%90%8D)\n\n[变量](#%E5%8F%98%E9%87%8F)\n  - [创建对象/数组变量](#%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E6%95%B0%E7%BB%84%E5%8F%98%E9%87%8F)\n\n[条件](#%E6%9D%A1%E4%BB%B6)\n  - [使用 === 操作符](#%E4%BD%BF%E7%94%A8--%E6%93%8D%E4%BD%9C%E7%AC%A6)\n  - [三目运算符使用多行形式](#%E4%B8%89%E7%9B%AE%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BD%BF%E7%94%A8%E5%A4%9A%E8%A1%8C%E5%BD%A2%E5%BC%8F)\n  - [使用描写性的的条件](#%E4%BD%BF%E7%94%A8%E6%8F%8F%E5%86%99%E6%80%A7%E7%9A%84%E7%9A%84%E6%9D%A1%E4%BB%B6)\n\n[函数](#%E5%87%BD%E6%95%B0)\n  - [编写简短函数](#%E7%BC%96%E5%86%99%E7%AE%80%E7%9F%AD%E5%87%BD%E6%95%B0)\n  - [提前从函数返回](#%E6%8F%90%E5%89%8D%E4%BB%8E%E5%87%BD%E6%95%B0%E8%BF%94%E5%9B%9E)\n  - [对闭包命名](#%E5%AF%B9%E9%97%AD%E5%8C%85%E5%91%BD%E5%90%8D)\n  - [避免闭包嵌套](#%E9%81%BF%E5%85%8D%E9%97%AD%E5%8C%85%E5%B5%8C%E5%A5%97)\n  - [方法的链式调用](#%E6%96%B9%E6%B3%95%E7%9A%84%E9%93%BE%E5%BC%8F%E8%B0%83%E7%94%A8)\n\n[注释](#%E6%B3%A8%E9%87%8A)\n  - [注释使用斜杠语法](#%E6%B3%A8%E9%87%8A%E4%BD%BF%E7%94%A8%E6%96%9C%E6%9D%A0%E8%AF%AD%E6%B3%95)\n\n[其它杂项](#%E5%85%B6%E5%AE%83%E6%9D%82%E9%A1%B9)\n  - [Object.freeze, Object.preventExtensions, Object.seal, with, eval](#objectfreeze-objectpreventextensions-objectseal-with-eval)\n  - [将 Requires 语句放在上面](#%E5%B0%86-requires-%E8%AF%AD%E5%8F%A5%E6%94%BE%E5%9C%A8%E4%B8%8A%E9%9D%A2)\n  - [Getters 和 setters](#getters-%E5%92%8C-setters)\n  - [不去扩展内置对象的原型](#%E4%B8%8D%E5%8E%BB%E6%89%A9%E5%B1%95%E5%86%85%E7%BD%AE%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%8E%9F%E5%9E%8B)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n## 格式\n\n可以使用 [.editorconfig](http://editorconfig.org/) 配置文件来强制编辑器的格式配置. 推荐使用 Node.js Style Guide 提供的 [.editorconfig](https://github.com/felixge/node-style-guide/blob/master/.editorconfig) 文件来自动设置编辑器的缩进、换行和空格行为, 使其符合下面的规则.\n\n### 2个空格缩进\n\n使用 2 个空格来缩进代码, 并谨记不要将 Tabs 和空格混淆--否则会陷入另一个地狱.\n\n### 换行\n\n使用 Unix 风格的换行(`\\n`), 并将一个换行符作为文件的最后一个字符. 任何一个仓库都应该禁止 Windows 风格的换行(`\\r\\n`).\n\n### 清除尾随空格\n\n就和每次吃饭之后要刷牙一样, 在每次提交之前应该清除 JavaScript 文件中的尾随空格.\n\n### 使用分号\n\n根据 [科学研究](http://news.ycombinator.com/item?id=1547647), 分号的使用是我们社区的核心价值. 考虑到 [对立观点](http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding), 当谈到滥用纠错机制(abusing error correction mechanisms)时, 传统主义者会更乐于谈简单的语法.\n\n### 每行限制 80 个字符\n\n每行限制 80 个字符. 近几年来, 虽然屏幕变得越来越大, 但是大脑没有. 你的编辑器也支持利用额外的空间来分屏吧？\n\n### 使用单引号\n\n除非在写 JSON, 否则应该优先考虑使用单引号:\n\n正确示例:\n\n```\nvar foo = 'bar';\n```\n\n错误示例:\n\n```\nvar foo = \"bar\";\n```\n\n### 在同一行书写左大括号\n\n在同一行声明语句块的左大括号.\n\n正确示例:\n\n```\nif (true) {\n  console.log('winning');\n}\n```\n\n错误示例:\n\n```\nif (true)\n{\n  console.log('losing');\n}\n```\n\n另外推荐的是在条件语句前后都使用空格.\n\n### 每个 var 语句只声明一个变量\n\n每个 `var` 语句只声明一个变量, 这也让重编行号变得简单. 然而, 要忽略 [Crockford](http://javascript.crockford.com/code.html) 中提到的不推荐在函数内部声明变量, 记住要把变量声明在更容易理解的地方.\n\n正确示例:\n\n```\nvar keys   = ['foo', 'bar'];\nvar values = [23, 42];\n\nvar object = {};\nwhile (keys.length) {\n  var key = keys.pop();\n  object[key] = values.pop();\n}\n```\n\n错误示例:\n\n```\nvar keys = ['foo', 'bar'],\n    values = [23, 42],\n    object = {},\n    key;\n\nwhile (keys.length) {\n  key = keys.pop();\n  object[key] = values.pop();\n}\n```\n\n## 命名约定\n\n### 使用小驼峰式命名法对变量、属性和函数名命名\n\n变量、属性和函数名应该使用小驼峰式命名法, 并且名称是可描述的. 应该避免使用单字符变量和不通用的缩写.\n\n正确示例:\n\n```\nvar adminUser = db.query('SELECT * FROM users ...');\n```\n\n错误示例:\n\n```\nvar admin_user = db.query('SELECT * FROM users ...');\n```\n\n### 使用大驼峰式命名法对类名命名\n\n类名应该采用大驼峰式命名法.\n\n正确示例:\n\n```\nfunction BankAccount() {\n}\n```\n\n错误示例:\n\n```\nfunction bank_Account() {\n}\n```\n\n### 使用大写字母对常量命名\n\n常量可被声明为普通变量或类的静态属性, 并使用大写字母对其命名.\n\n正确示例:\n\n```\nvar SECOND = 1 * 1000;\n\nfunction File() {\n}\nFile.FULL_PERMISSIONS = 0777;\n```\n\n错误示例:\n\n```\nconst SECOND = 1 * 1000;\n\nfunction File() {\n}\nFile.fullPermissions = 0777;\n```\n\n## 变量\n\n### 创建对象/数组变量\n\n使用尾随的逗号进行分隔, 并把简短的声明放在单行.\n\n正确示例:\n\n```\nvar a = ['hello', 'world'];\nvar b = {\n  good: 'code',\n  'is generally': 'pretty',\n};\n```\n\n错误示例:\n\n```\nvar a = [\n  'hello', 'world'\n];\nvar b = {\"good\": 'code'\n        , is generally: 'pretty'\n        };\n```\n\n## 条件\n\n### 使用 === 操作符\n\n编程并不是记住 [愚蠢的规则](https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comparison_Operators). 使用 `===` 操作符, 它会达到预期结果.\n\n正确示例:\n\n```\nvar a = 0;\nif (a !== '') {\n  console.log('winning');\n}\n```\n\n错误示例:\n\n```\nvar a = 0;\nif (a == '') {\n  console.log('losing');\n}\n```\n\n### 三目运算符使用多行形式\n\n不推荐将三目运算符写在一行, 而应该将其分成多行.\n\n正确示例:\n\n```\nvar foo = (a === b)\n  ? 1\n  : 2;\n```\n\n错误示例:\n\n```\nvar foo = (a === b) ? 1 : 2;\n```\n\n### 使用描写性的的条件\n\n任何一个重要的条件判断都应该被重新赋值给一个描写性的变量或者函数.\n\n正确示例:\n\n```\nvar isValidPassword = password.length \u003e= 4 \u0026\u0026 /^(?=.*\\d).{4,}$/.test(password);\n\nif (isValidPassword) {\n  console.log('winning');\n}\n```\n\n错误示例:\n\n```\nif (password.length \u003e= 4 \u0026\u0026 /^(?=.*\\d).{4,}$/.test(password)) {\n  console.log('losing');\n}\n```\n\n## 函数\n\n### 编写简短函数\n\n保持函数简短. 一个好的函数适合展现在一个幻灯片(slide)上, 这样如果在一个比较大房间中, 也便于最后一排的人阅读. 不要指望他们拥有完美的视觉, 每一个函数的代码应该限制在 15 行左右.\n\n### 提前从函数返回\n\n为了避免 `if` 语句过度嵌套, 应该提前将函数值返回.\n\n正确示例:\n\n```\nfunction isPercentage(val) {\n  if (val \u003c 0) {\n    return false;\n  }\n\n  if (val \u003e 100) {\n    return false;\n  }\n\n  return true;\n}\n```\n\n错误示例:\n\n```\nfunction isPercentage(val) {\n  if (val \u003e= 0) {\n    if (val \u003c 100) {\n      return true;\n    } else {\n      return false;\n    }\n  } else {\n    return false;\n  }\n}\n```\n\n对这个示例, 可以选择编写更简短的函数:\n\n```\nfunction isPercentage(val) {\n  var isInRange = (val \u003e= 0 \u0026\u0026 val \u003c= 100);\n  return isInRange;\n}\n```\n\n### 对闭包命名\n\n给闭包随意命名一个名字, 表示很关心它们, 这样便于产生更好的堆栈跟踪、堆和 cpu 配置文件.\n\n正确示例:\n\n```\nreq.on('end', function onEnd() {\n  console.log('winning');\n});\n```\n\n错误示例:\n\n```\nreq.on('end', function() {\n  console.log('losing');\n});\n```\n\n### 避免闭包嵌套\n\n合理使用闭包, 避免闭包嵌套, 否则代码会难以阅读.\n\n正确示例:\n\n```\nsetTimeout(function() {\n  client.connect(afterConnect);\n}, 1000);\n\nfunction afterConnect() {\n  console.log('winning');\n}\n```\n\n错误示例:\n\n```\nsetTimeout(function() {\n  client.connect(function() {\n    console.log('losing');\n  });\n}, 1000);\n```\n\n### 方法的链式调用\n\n如果有方法的链式调用, 每个方法应该占一行, 并使用缩进来表明它们同属一个调用链.\n\n正确示例:\n\n```\nUser\n  .findOne({ name: 'foo' })\n  .populate('bar')\n  .exec(function(err, user) {\n    return true;\n  });\n```\n\n错误示例:\n\n```\nUser\n.findOne({ name: 'foo' })\n.populate('bar')\n.exec(function(err, user) {\n  return true;\n});\n\nUser.findOne({ name: 'foo' })\n  .populate('bar')\n  .exec(function(err, user) {\n    return true;\n  });\n\nUser.findOne({ name: 'foo' }).populate('bar')\n.exec(function(err, user) {\n  return true;\n});\n\nUser.findOne({ name: 'foo' }).populate('bar')\n  .exec(function(err, user) {\n    return true;\n  });\n```\n\n## 注释\n\n### 注释使用斜杠语法\n\n单行注释或者多行注释都应该使用斜杠语法. 尝试用注释来解释一些高层次机制(higher level mechanisms) 或者阐述代码中的难点. 不要使用注释来重申琐碎的事情.\n\n正确示例:\n\n```\n// 'ID_SOMETHING=VALUE' -\u003e ['ID_SOMETHING=VALUE', 'SOMETHING', 'VALUE']\nvar matches = item.match(/ID_([^\\n]+)=([^\\n]+)/));\n\n// This function has a nasty side effect where a failure to increment a\n// redis counter used for statistics will cause an exception. This needs\n// to be fixed in a later iteration.\nfunction loadUser(id, cb) {\n  // ...\n}\n\nvar isSessionValid = (session.expires \u003c Date.now());\nif (isSessionValid) {\n  // ...\n}\n```\n\n错误示例:\n\n```\n// Execute a regex\nvar matches = item.match(/ID_([^\\n]+)=([^\\n]+)/);\n\n// Usage: loadUser(5, function() { ... })\nfunction loadUser(id, cb) {\n  // ...\n}\n\n// Check if the session is valid\nvar isSessionValid = (session.expires \u003c Date.now());\n// If the session is valid\nif (isSessionValid) {\n  // ...\n}\n```\n\n## 其它杂项\n\n### Object.freeze, Object.preventExtensions, Object.seal, with, eval\n\n避免使用上述方法.\n\n### 将 Requires 语句放在上面\n\n在文件中将 Requires 语句放在上面, 这样能清楚地表明此文件的依赖关系. 这种做法除了提供一个概述帮助他人快速了解文件依赖和可能存在的内存影响之外, 也有利于他人判断在其它地方使用该文件时, 是否还需要他们选择一个 `package.json` 文件.\n\n### Getters 和 setters\n\n不推荐使用 setters, 对于那些试图使用你的软件来解决问题的人, 这会导致更多问题. 可以随意使用 getters, 这不受 [副作用](http://en.wikipedia.org/wiki/Side_effect_(computer_science)) 影响, 如给集合提供一个 `length` 属性.\n\n### 不去扩展内置对象的原型\n\n不要扩展 JavaScript 内置对象的原型, 免得给自己挖坑.\n\n正确示例:\n\n```\nvar a = [];\nif (!a.length) {\n  console.log('winning');\n}\n```\n\n错误示例:\n\n```\nArray.prototype.empty = function() {\n  return !this.length;\n}\n\nvar a = [];\nif (a.empty()) {\n  console.log('losing');\n}\n```\n\n## License\n\n[CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdwqs%2Fnode-style-guide","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdwqs%2Fnode-style-guide","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdwqs%2Fnode-style-guide/lists"}