规范化标准是践行前端工程化的重要组成部分。
为什么需要规范化标准
软件开发通常需要多人协同,不同的开发者有不同的编码习惯和喜好,不同的习惯和喜好会增加项目维护成本,所以每个项目或团队需要明确统一的标准。
哪里需要规范化标准
开发过程中人为编写的一切。如代码、文档、纪要甚至是提交日志,其中代码的标准化规范尤为重要,因为代码的质量关于项目的质量以及项目后期的维护成本。
实施规范化的方法
- 编码前人为约定
- 通过工具实现
Lint
ESLint
-
基本介绍
ESLint
是当前最为主流的javascript
Lint
工具,用于监测js
代码质量ESLint
很容易统一开发者的编码风格
-
ESLint
安装:直接使用yarn add eslint/npm install eslint
安装即可 -
ESLint
使用-
通过
yarn
或npx
来运行eslint
,或者在package.json
的scripts
来配置命令,然后通过npm
或yarn
来运行。命令行格式为:eslint file
,file
可以是一个指定的文件,也可以是一个路径通配符。
-
运行
eslint
检查代码之前,需要先新建一个eslint
的配置文件.eslintrc
文件(可以通过eslint --init
命令来生成配置文件),文件后缀名可以是.js
,.json
亦或是没有后缀名。或者在package.json
中添加eslintConfig
配置来配置eslint
。"scripts": {}, "eslintConfig": { "env": { "browser": false, "es2021": true }, "extends": [ "standard" ], "parserOptions": { "ecmaVersion": 12 }, "rules": { } },
-
运行
eslint
之后,首先会输出代码语法错误,需要手动将语法错误改正过来之后,再次运行eslint
命令,才会去检查代码风格。
-
运行
eslint file --fix
可以修正一些代码风格,然后将一些仍未被修正的语法问题输出到控制台。需要开发人员手动一条一条修复。
-
-
eslint
配置文件配置值选项说明-
env
:指定你想启用的环境,并设置它们为true
,可以同时开启多个环境。
下面是eslint
支持的环境表
如果想在一个特定的插件中使用一种环境,确保提前在plugins
数组里指定了插件名,然后在env
配置中不带前缀的插件名后跟一个/
。module.exports = { env: { // 运行环境设置 browser: false, // 如果设置为false,则不能使用除了globals中定义的全局变量,如window,alert,document等 es2021: true, 'example/custom': true }, pugins: ['example'], extends: [// 继承的配置 'standard' ], parserOptions: { ecmaVersion: 12 }, rules: { } }
-
extends
:指定继承某一些共享配置 -
parserOptions
:指定你想要支持的JavaScript
语言选项。默认情况下,ESLint
支持ECMAScript 5
语法。该选项只是检测语法,支持ES6
语法并不意味着同时支持新的ES6
全局变量或类型。对于ES6
语法,使用{ "parserOptions": { "ecmaVersion": 6 } }
;对于新的ES6
全局变量,使用{ "env":{ "es6": true } }.
{ "env": { "es6": true } }
自动启用es6语法,但{ "parserOptions": { "ecmaVersion": 6 } }
不自动启用es6
全局变量。 -
rules
:eslint
规则设置。要改变一个规则设置,你必须将规则ID
设置为下列值之一:off
或0
: 表示 关闭规则warn
或1
:开启规则,使用警告级别的错误:warn
error
或2
: 开启规则,使用错误级别的错误:error
{ "rules": { "eqeqeq": "off", "curly": "error", "quotes": ["error", "double"] } }
也可以在文件注释里配置规则
/* eslint eqeqeq: "off", curly: "error" */ /* eslint eqeqeq: 0, curly: 2 */
如果一个规则有额外的选项,可以使用数组字面量指定它们。数组的第一项总是规则的严重程度(数字或字符串)
/* eslint quotes: ["error", "double"], curly: 2 */
-
globals
:配置全局变量,为一个对象,该对象包含以你希望使用的每个全局变量。对于每个全局变量键,将对应的值设置为 “writable
” 以允许重写变量,或 “readonly
” 不允许重写变量。{ "globals": { "var1": "writable", "var2": "readonly" } }
也可以通过在
js
中使用注释来定义全局变量,定义的全局变量默认情况下是只读的/* global var1, var2 */
如果想选择性地指定这些全局变量可以被写入(而不是只被读取),那么你可以用一个
writable
的标志来设置它们/* global var1:writable, var2:writable */
-
配置注释
在文件中使用以下格式的块注释来临时禁止规则出现警告:/* eslint-disable */ alert('foo'); /* eslint-enable */
也可以对指定的规则启用或禁用警告
/* eslint-disable no-alert, no-console */ alert('foo'); console.log('bar'); /* eslint-enable no-alert, no-console */
如果在整个文件范围内禁止规则出现警告,将
/* eslint-disable */
块注释放在文件顶部,并且不出现/* eslint-enable */
块注释/* eslint-disable */ alert('foo');
也可以对整个文件启用或禁用指定规则警告:
/* eslint-disable no-alert */ // Disables no-alert for the rest of the file alert('foo');
在文件中使用以下格式的行注释或块注释在某一特定的行上禁用所有规则
alert('foo'); // eslint-disable-line // eslint-disable-next-line alert('foo'); /* eslint-disable-next-line */ alert('foo'); alert('foo'); /* eslint-disable-line */
在某一特定的行上禁用某些指定的规则:
alert('foo'); // eslint-disable-line no-alert, quotes, semi // eslint-disable-next-line no-alert alert('foo'); alert('foo'); /* eslint-disable-line no-alert, quotes, semi */ /* eslint-disable-next-line no-alert */ alert('foo');
上面的所有方法同样适用于插件规则。例如,禁止
eslint-plugin-example
的rule-name
规则,把插件名(example)
和规则名(rule-name)
结合为example/rule-name
:foo(); // eslint-disable-line example/rule-name foo(); /* eslint-disable-line example/rule-name */
-
-
eslint
和gulp
结合使用
通过gulp-eslint
插件来结合gulp
使用
1. 在gulp
管理的项目中开发依赖安装eslint
和gulp-eslint
2. 添加eslint
配置文件或将配置对象传入gulp-eslint
3. 修改编译js
文件的任务,在js
文件经过babel
转换之前先经过gulp-eslint
处理
4. 默认情况下eslint
只会检查代码,不会根据检查的结果做出反馈。所以需要我们手动调用gulp-eslint
的format
方法输出eslint
的检查结果,并在出现错误时,标志任务失败。const script = () => { return src('src/assets/scripts/*.js', { base: 'src' }) .pipe(plugins.eslint()) .pipe(plugins.eslint.format()) .pipe(plugins.eslint.failAfterError()) .pipe(plugins.babel({ presets: ['@babel/preset-env'] })) .pipe(dest('temp')) .pipe(bs.reload({ stream: true })) }
-
eslint
和webpack
结合使用-
在
webpack
管理的项目中开发依赖安装eslint
和eslint-loader
-
添加
eslint
配置文件,如果是使用了某个js
框架(如React
),需要添加添加对应的框架的支持,在plugins
中添加该框架对应的插件,并继承该框架的使用的语法规范。module.exports = { env: { browser: true, es2021: true }, extends: [ 'plugin:react/recommended', 'standard' ], parserOptions: { ecmaFeatures: { jsx: true }, ecmaVersion: 12, sourceType: 'module' }, plugins: [ 'react' ], rules: { } }
-
对
js
文件使用eslint-loader
处理,需要保证eslint-loader
在所有loader
处理之前对js
文件进行处理,通过添加enforce:'pre'
来实现。{ test: /\.js$/, exclude: /node_modules/, use: 'eslint-loader', enforce: 'pre' // 保证在其他loader之前执行 }
-
-
eslint
检查typescript
- 安装
eslint
和typescript
(必须在初始化配置文件之前安装,不然初始化文件时选择typescript
支持时会报错) - 初始化
eslint
配置文件,选择时添加typescript
支持。 - 运行命令行
(yarn eslint file)
检查.ts
文件
- 安装
-
stylelint
的使用
stylelint
的使用和eslint
基本类似-
首先安装依赖,
stylelint
-
创建配置文件,
.stylelintrc/.stylelintrc.js/stylelint.config.js/stylelint.config.cjs
("type":"module"
模式下)或者在package.json
中添加配置项stylelint
module.exports = { extends: [ "stylelint-config-standard", "stylelint-config-sass-guidelines" ] }
{ "main": "index.js", "license": "MIT", "devDependencies": { "stylelint": "^13.8.0", "stylelint-config-sass-guidelines": "^7.1.0", "stylelint-config-standard": "^20.0.0" }, "stylelint": { "extends": [ "stylelint-config-standard", "stylelint-config-sass-guidelines" ] } }
-
选择要继承的规范(如
standard
),安装该规范对应的插件stylelint-config-standard
,并在配置文件中的extends
选项中添加,注意需要添加插件的全名。 -
添加
sass/less
语法校验,重复第3
步操作,只是把插件换成对应的插件。
-
-
Prettier
的使用
Prettier
是一款通用的前端代码格式化工具,可以完成所有前端代码的格式化 。-
Prettier
的使用非常简单,只需要安装完Prettier
之后,运行命令行yarn prettier file
就可以对指定的文件进行检查。
-
Prettier
默认会将格式化之后的代码输出到控制台上,如果需要将格式化之后的代码覆盖到源文件上,只需要添加--write
参数。
-
如果想要对根目录下所有文件进行格式化,需要将
flie
替换成.
-
-
Git Hooks
Git Hooks
又称git
钩子,每个钩子都对应一个任务,如commit
、push
等。通过shell
脚本可以编写钩子任务触发时要具体执行的操作。Husky
可以实现不通过shell
脚本来实现Git Hooks
的使用需求。- 安装
husky
作为开发依赖 - 在
package.json
中配置husky
,为钩子定义任务。{ "main": "index.js", "repository": "https://github.com/sqw2016/homework2-2.git", "author": "wushaoqing <337193272@qq.com>", "license": "MIT", "scripts": { "precommit": "eslint index.js" }, "devDependencies": { "eslint": "^7.17.0", "eslint-config-standard": "^16.0.2", "eslint-plugin-import": "^2.22.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^4.2.1", "husky": "^4.3.6" }, "husky": { "hooks": { "pre-commit": "yarn precommit" } } }
- 如果要在代码检查之后对代码进行强制格式化,并将代码添加到暂存区则需要使用
lint-staged
- 首先安装
lint-staged
作为开发依赖 - 配置
lint-staged
。通过在package.json
中添加lint-staged
属性进行配置,lint-staged
属性接收一个键值对对象,键为文件通配字符串,值为对匹配到的文件需要执行的命令,可以是一个数组,如果是一个数组的话,则会按照数组顺序依次执行多个命令。"lint-staged": { "*.js": [ "eslint", "git add" ] }
- 将
scripts
中的执行命令改为lint-staged
。
完整配置如下"scripts": { "precommit": "lint-staged" },
{ "main": "index.js", "repository": "https://github.com/sqw2016/homework2-2.git", "author": "wushaoqing <337193272@qq.com>", "license": "MIT", "scripts": { "precommit": "lint-staged" }, "devDependencies": { "eslint": "^7.17.0", "eslint-config-standard": "^16.0.2", "eslint-plugin-import": "^2.22.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^4.2.1", "husky": "^4.3.6", "lint-staged": "^10.5.3" }, "husky": { "hooks": { "pre-commit": "yarn precommit" } }, "lint-staged": { "*.js": [ "eslint", "git add" ] } }
- 首先安装
- 安装