代码统一规范

229 阅读12分钟

代码统一规范

统一编辑器配置

.editorconfig配置(推荐使用)

一种跨平台的文本编辑器配置文件,它的作用是定义统一的代码风格和格式化规则,以便在不同的开发工具和操作系统之间保持一致性,该文件中的设置优先级会高于vscode中的设置,

1.安装VSCode插件

EditorConfig for VS Code

2. .editorconfig文件配置

项目根目录创建.editorconfig这个文件,推荐使用。

root = true                         # 根目录的配置文件,编辑器会由当前目录向上查找,如果找到 `roor = true` 的文件,则不再查找

[*]                                 # 匹配所有的文件
indent_style = space                # 空格缩进
indent_size = 4                     # 缩进空格为4个
end_of_line = lf                    # 文件换行符是 linux 的 `\n`
charset = utf-8                     # 文件编码是 utf-8
trim_trailing_whitespace = true     # 不保留行末的空格
insert_final_newline = true         # 文件末尾添加一个空行
curly_bracket_next_line = false     # 大括号不另起一行
spaces_around_operators = true      # 运算符两遍都有空格
indent_brace_style = 1tbs           # 条件语句格式是 1tbs

[*.js]                              # 对所有的 js 文件生效
quote_type = single                 # 字符串使用单引号

[*.{html,less,css,json}]            # 对所有 html, less, css, json 文件生效
quote_type = double                 # 字符串使用双引号

[package.json]                      # 对 package.json 生效
indent_size = 2                     # 使用2个空格缩进

统一代码格式化

插件格式化

1.安装vscode插件

Prettier - Code formatter(格式化代码)

ESLint (读取 ESLint 配置文件进行语法检测)

Prettier ESLint(按照 ESLint 配置文件进行格式化)

手动格式化:右键->格式化文档的方式->配置默认格式化程序 选择,效率低

自动保存格式化:settting.json添加代码,保存代码之后会自动格式化


  "eslint.enable": true,
  "eslint.run": "onType",
  "eslint.options": {
      "extensions": [
          ".js",
          ".vue",
          ".jsx",
          ".tsx"
      ]
  },
  "editor.codeActionsOnSave": {
      "source.fixAll.eslint": true
  }
}


.prettierrc.js 格式化(可选)

1.安装依赖包

npm install --save-dev --save-exact prettier

2.配置文件

.prettierrc.js 根目录下创建 添加规则

//此处的规则供参考,其中多半其实都是默认值,可以根据个人习惯改写
module.exports = {
  "singleQuote": true,  // 是否使用单引号,默认为 false
  "semi": true,  // 是否在语句末尾添加分号,默认为 true
  "trailingComma": "all",  // 否在对象或数组的最后一个元素后面添加逗号,默认为 none。可选值:none、es5、all
  "printWidth": 120, // 一行代码的最大宽度,默认为 80
  "tabWidth": 2,  // 缩进的空格数,默认为 2
  "useTabs": false,  // 是否使用制表符作为缩进,默认为 false
  "bracketSpacing": true,  // 对象字面量的括号之间是否添加空格,默认为 true
  "jsxBracketSameLine": false,  // 多行 JSX 元素的最后一行的右尖括号是否放在最后一行的结尾,默认为 false
  "arrowParens": "avoid",  // 只有一个参数的箭头函数的参数是否使用圆括号,默认为 avoid。可选值:avoid、always
  "rangeStart": 0,  // 指定格式化的代码范围开始行,默认为 0
  "rangeEnd": null,  // 指定格式化的代码范围结束行,可以不写 默认为 Infinity(或null)
  "requirePragma": false,  // 是否只格式化带有特定注释的文件,默认为 false
  "insertPragma": false,  // 是否在文件开头插入特定的注释,默认为 false
  "proseWrap": "preserve",  // 如何处理 prose(文本块),默认为 preserve。可选值:always、never、preserve
  "htmlWhitespaceSensitivity": "css",  // 如何处理 HTML 文件中的空格,默认为 css。可选值:css、strict、ignore
  "vueIndentScriptAndStyle": false,  // Vue 文件中是否对 `<script>` 和 `<style>` 标签进行缩进,默认为 false
  "endOfLine": "auto"  // 换行符的样式,默认为 auto。可选值:auto、lf、crlf
}

.prettierignore忽略文件

/dist/*
/html/*
.local
/node_modules/**
**/*.svg
**/*.sh
/public/*
3.终端执行

(1)全部格式化

npx prettier --write .
//或
yarn prettier --write .

(2)格式化指定文档

npx prettier --write src/components/Button.js

(3) 检查文档是否已格式化

npx prettier --check .

ESlint 格式化(8版本)

1.安装依赖包


ESlintPrettier 可能会冲突,故需做如下设置:
//1. 安装 eslint-config-prettier 插件
npm i -D eslint-config-prettier
//2. 在eslint的配置文件中写入以下内容
 extends: ['plugin:prettier/recommended'], // 避免与 prettier 冲突





#安装 ESLint

npm i eslint@8     
  


#初始化
npx eslint --init

2. 配置文件.eslintrc.js

根目录下创建.eslintrc.js

package.json中增加配置

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "lint": "eslint src",
    "fix": "eslint src --fix"
  },

.eslintrc.js 添加规则(做删减)

module.exports = {
	root: true,
	// 此项是用来告诉eslint找当前配置文件不能往父级查找
	parserOptions: {
		// 此项是用来指定javaScript语言类型和风格,sourceType用来指定js导入的方式,默认是script,此处设置为module,指某块导入方式
		parser: "@babel/eslint-parser",
		// 设置 script(默认) 或 module,如果代码是在ECMASCRIPT中的模块
		sourceType: "module"
	},
	// 此项指定环境的全局变量,下面的配置指定为浏览器环境
	env: {
		browser: true,
		node: true,
		es6: true
	},
	// 此项是用来配置标准的js风格,就是说写代码的时候要规范的写,如果你使用vs-code我觉得应该可以避免出错
	extends: ["plugin:vue/recommended", "eslint:recommended"],
	rules: {
		"vue/max-attributes-per-line": ["error", { // 每个属性独占一行
			"singleline": { // 单行属性
				"max": 1 // 单行属性最大数量
			},
			"multiline": { // 多行属性
				"max": 1	// 多行属性最大数量
			}
		}],
		"vue/singleline-html-element-content-newline": "off", // 在单行元素的内容前后要求换行
		"vue/multiline-html-element-content-newline": "off", // 在多行元素的内容前后要求换行
		// 'vue/name-property-casing': ['error', 'PascalCase'], // 组件名使用PascalCase命名
		// 'vue/no-v-html': 'off', // 禁止使用v-html指令
		"vue/html-self-closing": [ // 标签自动闭合
			"error",
			{
				html: {
					void: "always", // void元素(如:img、br必须闭合)
					normal: "always", // 普通元素(如:div比如闭合)
					component: "always" // 组件元素(如:my-component必须闭合)
				},
				svg: "always", // svg元素必须闭合
				math: "always" // math元素必须闭合
			}
		],
		"accessor-pairs": 2, // 强制geeter和seeter成对出现
		"arrow-spacing": [ // 箭头函数前后空格
			2, // 错误级别
			{
				before: true, // 前面是否需要空格
				after: true // 后面是否需要空格
			}
		],
		"block-spacing": [2, "always"], // 大括号前后空格
		"brace-style": [
			2,
			"1tbs", // 大括号风格
			{
				allowSingleLine: true // 允许块语句和单行语句写在同一行
			}
		],
		camelcase: [ // 强制使用驼峰命名
			0,
			{
				properties: "always"
			}
		],
		"comma-dangle": [2, "never"], // 对象字面量项尾不能有逗号
		"comma-spacing": [ // 逗号前后的空格
			2,
			{
				before: false, // 逗号前是否需要空格
				after: true // 逗号后是否需要空格
			}
		],
		"comma-style": [2, "last"], // 逗号风格,换行时在行尾
		"constructor-super": 2, // super()必须在构造函数中调用
		curly: [2, "multi-line"], // 	大括号风格
		"dot-location": [2, "property"], // 点号操作符使用风格
		"eol-last": 2, // 文件末尾强制换行
		eqeqeq: ["error", "always", { null: "ignore" }], // 强制使用全等
		"generator-star-spacing": [ // 强制 generator 函数中 * 号前后空格
			2, // 错误级别
			{
				before: true, // * 号前是否需要空格
				after: true // * 号后是否需要空格
			}
		],
		"handle-callback-err": [2, "^(err|error)$"], // 处理错误
		indent: ["error", "tab", { SwitchCase: 1 }], // 缩进风格
		"padded-blocks": [2, "never"], // 块语句内部前后空行
		"vue/html-indent": [ // vue文件缩进风格
			"error",	// 错误级别
			"tab",	// 缩进风格
			{
				attribute: 1, // 属性缩进
				baseIndent: 1, // 基础缩进
				closeBracket: 0, // 闭合标签缩进
				alignAttributesVertically: true, // 属性垂直对齐
				ignores: [] // 忽略缩进
			}
		],
		"jsx-quotes": [2, "prefer-single"], // 强制在JSX属性中一致地使用单引号或双引号
		"key-spacing": [ // 对象字面量中冒号后的空格
			2,
			{
				beforeColon: false, // 冒号前是否需要空格
				afterColon: true // 冒号后是否需要空格
			}
		],
		"keyword-spacing": [ // 关键字前后空格
			2,
			{
				before: true, // 关键字前是否需要空格
				after: true // 关键字后是否需要空格
			}
		],
		"new-cap": [ // 构造函数首字母大写
			2,
			{
				newIsCap: true, // 构造函数首字母大写
				capIsNew: false // new 关键字首字母大写
			}
		],
		"new-parens": 2, // new时必须加括号
		"no-array-constructor": 2, // 禁止使用数组构造器
		"no-caller": 0, // callee// arguments.caller 和 arguments.callee 被移除,可使用命名函数表达式代替
		// 'no-console': 'off', // 禁止使用console
		"no-class-assign": 2, // 禁止修改类声明
		"no-cond-assign": 2, // 禁止条件表达式中出现赋值操作符
		"no-const-assign": 2, // 禁止修改const声明的变量
		"no-control-regex": 0, // 禁止正则表达式字面量中出现控制字符
		"no-delete-var": 2, // 不能删除变量
		"no-dupe-args": 2, // 函数参数不能重复
		"no-dupe-class-members": 2,	// 类成员不能重复
		"no-dupe-keys": 2, // 对象字面量中禁止出现重复key
		"no-duplicate-case": 2, // switch中的case标签不能重复
		"no-empty-character-class": 2, // 禁止在正则表达式中使用空字符集
		"no-empty-pattern": 2, // 禁止使用空解构模式
		"no-eval": 0, // eval() // eval() 会被移除
		"no-ex-assign": 2, // 禁止对catch语句的参数重新赋值
		"no-extend-native": 2, // 禁止扩展原生类型
		"no-extra-bind": 2, // 禁止不必要的函数绑定
		"no-extra-boolean-cast": 2, //	禁止不必要的bool转换
		"no-extra-parens": [2, "functions"], //	禁止不必要的括号
		"no-fallthrough": 2, // 禁止 case 语句落空
		"no-floating-decimal": 2, // 禁止省略浮点数中的0 .5 3.
		"no-func-assign": 2, // 禁止重复的函数声明
		"no-implied-eval": 2, // 禁止使用隐式eval
		"no-inner-declarations": [2, "functions"], // 禁止在if while for语句中使用声明语句
		"no-invalid-regexp": 2, // 禁止无效的正则表达式
		"no-irregular-whitespace": 2, // 禁止不规则的空白
		"no-iterator": 2, // 禁止使用__iterator__属性
		"no-label-var": 2, // 禁止标签与变量同名
		"no-labels": [ // 禁止标签定义在case之后
			2,
			{
				allowLoop: false, // allowLoop, allowSwitch // 允许在循环内使用label
				allowSwitch: false // 禁止标签定义在case之后
			}
		],
		"no-lone-blocks": 2, // 禁止不必要的嵌套块
		"no-mixed-spaces-and-tabs": 2, // 禁止混用tab和空格
		"no-multi-spaces": 2, // 禁止多余的空格
		"no-multi-str": 2, // 禁止多行字符
		"no-multiple-empty-lines": [ // 禁止出现多行空行
			2,
			{
				max: 1 // 最大连续空行数
			}
		],
		"html-closing-bracket-newline": [2, { multiline: false }], // html标签结束标签换行 // 禁止出现多行空行
		"vue/html-closing-bracket-newline": [2, { multiline: false }], // html标签结束标签换行 // 禁止出现多行空行
		"array-bracket-newline": "off", // 数组括号内的空格使用风格 <a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank"> 多个属性换行时,结尾的标签跟随最后一个属性,可以不换行
		"no-native-reassign": 2, // 禁止修改原生对象
		"no-negated-in-lhs": 2, // 禁止在in条件语句左侧使用否定操作符
		"no-new-object": 2, // 禁止使用new Object()
		"no-new-require": 2, // 禁止使用new require
		"no-new-symbol": 2, // 禁止 Symbol new 操作符
		"no-new-wrappers": 2, // 禁止使用new创建包装实例
		"no-obj-calls": 2, // 禁止把全局对象作为函数调用
		"no-octal": 2, // 禁止使用八进制
		"no-octal-escape": 2, // 禁止使用八进制转义序列
		"no-path-concat": 2, // node // __dirname, __filename // 禁止对__dirname, __filename使用字符串连接
		"no-proto": 2, // 禁止使用__proto__属性
		"no-redeclare": 2, // 禁止重复声明变量
		"no-regex-spaces": 2, // 禁止正则表达式字面量中出现多个空格
		"no-return-assign": [0, "except-parens"], // 禁止在return语句中使用赋值语句
		"no-self-assign": 2, // 禁止自己给自己赋值
		"no-self-compare": 2, // 禁止自身比较
		"no-sequences": 0, // md5 error // 禁止逗号操作符
		"no-shadow-restricted-names": 2, // 禁止使用保留字作为变量名
		"no-spaced-func": 2, // 禁止函数名和括号之间有空格
		"no-sparse-arrays": 2, // 禁止稀疏数组
		"no-this-before-super": 2, // 在调用super()之前不能使用this或super
		"no-throw-literal": 2, // throw 必须是 Error 对象
		"no-trailing-spaces": 2, // 行尾禁止有空格
		"no-undef": 2, // 未定义变量
		"no-undef-init": 2, // 禁止将undefined作为变量初始化
		"no-unexpected-multiline": 2, // md5 error //禁止行内空格和tab混用
		"no-unmodified-loop-condition": 0, // while(x) // x未修改
		"no-unneeded-ternary": [// 	禁止不必要的嵌套 var isYes = true ? true : false; // 错误写法
			2,
			{
				defaultAssignment: false // 默认赋值
			}
		],
		"no-unreachable": 2, // 不能有无法执行的代码
		"no-unsafe-finally": 2, // md5 error // finally块中不能有控制流语句
		"no-unused-vars": [ // 禁止出现未使用的变量
			2,
			{
				vars: "all", // 所有变量
				args: "none" // 函数参数不使用
			}
		],
		"no-useless-call": 2, // 禁止不必要的call和apply
		"no-useless-computed-key": 2, // 禁止在对象字面量中使用不必要的计算属性
		"no-useless-constructor": 2, //	禁止不必要的构造函数
		"no-useless-escape": 0, // md5 error // 禁止不必要的转义字符
		"no-whitespace-before-property": 2, // 对象字面量中冒号的前后空格
		"no-with": 2, // with error // 禁止使用with
		"one-var": [ // 声明多个变量时,必须使用一个var
			2,
			{
				initialized: "never" // 声明多个变量时,必须使用一个var
			}
		],
		"operator-linebreak": [ // 换行符的位置
			2,
			"after",
			{
				overrides: { // 换行符的位置
					"?": "before", // 三元运算符
					":": "before" // if语句
				}
			}
		],

		// 'quotes':'off',
		quotes: [	// 引号类型 `` "" ''
			1,
			// 'single', // 建议使用单引号
			"double", // 建议使用双引号
			{
				avoidEscape: true, // 避免转义
				allowTemplateLiterals: true // 允许使用模板字符串
			}
		],
		// 'semi': 'off',
		// 'comma-dangle':'off',
		semi: [2, "never"],	// 语句末尾是否需要分号
		"semi-spacing": [ // 分号前后空格
			2,
			{
				before: false,	// 分号前是否需要空格
				after: true // 分号后是否需要空格
			}
		],
		"space-before-blocks": [2, "always"], // '{'前是否需要空格
		"space-before-function-paren": [ // 函数定义时括号前面要不要有空格
			"error",
			{
				anonymous: "always", // 	匿名函数
				named: "never", // 命名函数
				asyncArrow: "always" // 异步函数
			}
		],
		"space-in-parens": [2, "never"], // ()内是否需要空格
		"space-infix-ops": 2, // 中缀操作符周围要不要有空格
		"space-unary-ops": [ //	一元操作符前后要不要加空格
			2,
			{
				words: true, // 一元运算符前后是否加空格
				nonwords: false
			}
		],
		"spaced-comment": [ // 注释风格要不要有空格什么的
			2,
			"always", // always:在行首出现,且后面至少有一个空格,在行尾出现没有空格
			{
				markers: ["global", "globals", "eslint", "eslint-disable", "*package", "!", ","] // 标记不需要空格的注释
			}
		],
		"template-curly-spacing": [2, "never"], // 大括号内是否允许空格
		"use-isnan": 2, // 用isNaN()检查NaN
		"valid-typeof": 2, // 必须使用合法的typeof的值
		"wrap-iife": [2, "any"], // 立即执行函数表达式的小括号风格问题,参数是否允许省略
		"yield-star-spacing": [2, "both"], // 	yield*表达式中的*号前后是否有空格
		yoda: [2, "never"], // 	禁止尤达条件
		"prefer-const": 2, //	首选const
		"no-debugger": process.env.NODE_ENV === "production" ? 2 : 0, // 生产环境禁止使用debugger
		"object-curly-spacing": [ // 大括号内是否允许空格
			2,
			"always", // always:在行首出现,且后面至少有一个空格,在行尾出现没有空格
			{
				objectsInObjects: true // 对象的属性值允许有空格
			}
		],
		"array-bracket-spacing": [2, "never"] // 数组前后是否加空格
	}
}

配置.eslintignore文件

dist
node_modules
3.终端执行
npx eslint . --fix  //开发提示修复

npm run fix  提交代码前执行从src下找到错误信息,修复提交

vscode设置保存自动格式化(全局setting.json添加也可以)

项目根目录下新建.vscode文件夹,下添加settings.json

{
	// 指定哪些文件不参与搜索
	"search.exclude": {
	  "**/node_modules": true,
	  "dist": true,
	  "build": true,
	  "yarn.lock": true,
    "package.lock":true
	},
	// 保存自动格式化
	"editor.formatOnSave": true,
	"[javascript]": {
	  "editor.defaultFormatter": "esbenp.prettier-vscode"
	},
	"[javascriptreact]": {
	  "editor.defaultFormatter": "esbenp.prettier-vscode"
	},
  }