webpack+vue+Eslint+husky+lint-staged 统一项目编码规范
一. Eslint:
为什么我们要在项目中使用ESLint
ESLint可以校验我们写的代码,给代码定义一个规范,项目里的代码必须按照这个规范写。
加入ESLint有非常多的好处,比如说可以帮助我们避免一些非常低级的错误,一些格式上的问题导致我们在运行生产环境的时候出现一些不明所以的报错。还有就是在跟团队协作的时候,每个人都保持同一个风格进行代码书写,这样团队内部相互去看别人的代码的时候,就可以更容易的看懂。
ESLint实战小技巧全揭秘
1. 局部安装eslint
$ npm install eslint -D
2. 初始化配置文件:
$ eslint --init
3. webpack中配置eslint:
需要先安装 eslint-loader 解析 .eslint.js 文件
$ npm install eslint-loader -D
在 webpack.base.conf.js 的 rules 中添加以下规则:
{
test: /\.(vue|js|jsx)$/,
loader: 'eslint-loader',
exclude: /node_modules/,
enforce: 'pre',
options: {
fix: true,
}
}
4. 配置 Eslint:
我们这里是 Vuejs 项目,所以需要同时对 .vue 文件中的 js 代码进行检测,就需要利用 eslint-plugin-vue 插件来搭配使用。使用别人写好的规则包(以eslint-config-开头的npm包),如eslint-config-standard,因为本人比较偏向于 Airbnb JavaScript Style,所以今后的代码规范将均使用此规范。
安装依赖:
$ npm install eslint-config-airbnb-base eslint-plugin-import eslint-plugin-vue babel-eslint -D
(一)配置 package.json 文件:
在 package.json 中添加 lint 脚本:
// ...
"scripts": {
// ...
"lint": "eslint --ext .js,.vue src"
},
// ...
上面的命令中 --ext 参数就是用来指定需要检查的扩展名的文件,src 就是指定检查的目录。
命令行运行 npm run lint,输出如下:

在报这么多的错误之后,如果我们一条一条地去修复,就会变的非常的麻烦,相信刚接触ESLint的童鞋都深有体会。其实这些错误都可以让ESLint帮助我们自动地修复。只需要在ESLint后面加上一个参数--fix,它就会自动修复 Lint 出来的问题。当我们再去terminal里面跑一下:$ npm run lint,就会发现很多问题都被自动修复了。剩余没有被自动修复的问题按照提示进行修复即可。
"lint": "eslint --fix --ext .js,.jsx,.vue src"
(二)配置 .eslintrc.js 文件:
先放整体文件看看
module.exports = {
"env": {
"browser": true,
"es6": true
},
"extends": [
"airbnb-base",
"plugin:vue/essential",
],
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parserOptions": {
"ecmaVersion": 2018,
"sourceType": "module",
"parser": "babel-eslint",
},
"plugins": [
"vue",
],
"rules": {
'no-console': 'off'
}
};
(1)extends:
一个配置文件可以被基础配置中的已启用的规则继承。可以使用以下规则继承,代表继承Eslint中推荐的(打钩的)规则项:
module.exports = {
"extends": "eslint:recommended",
"rules": {
}
}
使用别人写好的规则包(以eslint-config-开头的npm包),如eslint-config-standard,我项目中使用的是airbnb:
module.exports = {
"extends": [
"airbnb-base",
"plugin:vue/essential"
],
"rules": { } }
(2)plugin属性:
ESLint 支持使用第三方插件(以eslint-plugin-开头的npm包),在使用插件之前,必须使用 npm 安装。如eslint-plugin-react、eslint-plugin-vue等。
module.exports = {
"plugins": [
"vue"
]
};
(3)rules属性:
当需要根据自己的需求进行配置时,可以在 rules 中添加规则;module.exports = {
"extends": [
"airbnb-base",
"plugin:vue/essential",
],
"plugins": [
"vue",
],
"rules": {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
}
};
如在平时开发中经常要用到console,可以将这条规则关掉,这样在开发环境运行 npm run lint 时,命令行就不会输出 no-console/no-debugger 警告了。
二. husky & lint-staged:
git莫属,而良好的代码规范有助于项目的维护,为了防止一些不规范的代码 commit并push到远端,我们可以在git命令执行前用一些钩子来检测并阻止。现在大前端主要有两种 git钩子插件:husky(jquery与next.js都在用),pre-commit(antd在用)。我项目中使用的是 husky。git的小伙伴们都知道 git 有很多命令commit、push、rebase等等。那这些命令主要是在执行.git文件夹中的东西,git 钩子文档上介绍非常详细,git init后,在.git/hooks文件中,有一些.simple结尾的钩子示例脚本,那么 git 钩子目录就是在.git文件夹的hooks下,如下所示:
按照文档上,配置钩子脚本,修改hooks中文件名对应的钩子文件,启用钩子。使用shell脚本检查。
!/usr/bin/env bash
# get files to be linted
FILES=$(git diff --cached --name-only | grep -E '^src|^test/unit/specs|^test/e2e')
# lint them if any
if [[ $FILES ]]; then
./node_modules/.bin/eslint $FILES
fi
文件名是pre-commit, 在commit 之前启用的钩子函数, 利用 git diff查看当前有哪些文件修改过,只对指定文件夹中修改的文件使用eslint进行代码检查,渐进式对整个项目实现代码规范。
脚本写好后,不用每次都手动复制到.git/hooks目录下,只需对当前文件创建软连接,到指定目录,在package.json中配置脚本命令,
"scripts": {
"install-hook": "ln -s ../../build/git-hooks/pre-commit .git/hooks/pre-commit",
}
在项目初始化后, 执行npm run install-hook,很方便地配置好了pre-commit 钩子。
2. husky 和 lint-staged 结合构建钩子:
husky能够防止不规范代码被commit、push等,而使用了eslint后,用 lint-staged 可以在 lint 后,更加灵活,执行其他脚本,尝试进行修改错误,比如 eslint --fix 检查后并修复错误等,所以项目中使用了 husky 与 lint-staged 结合使用。
首先,husky 和 lint-staged 安装依赖:
$ npm install -D lint-staged husky
修改 package.json 文件:
{
...
"scripts": {
"lint": "eslint --fix --ext .js,.jsx,.vue src"
},
"husky": {
hooks": {
"pre-commit": "lint-staged",
"pre-push": "lint-staged"
}
},
"lint-staged": {
"src/**/*.{js,json,vue}": [
"eslint --fix",
"git add"
]
},
...
}
此时,当你 git commit的时候,将会执行 precommit里的脚本,没有问题了才可以提交。

附:在安装和测试过程中遇到的一些问题的解决办法:
(1)在安装完 Eslint 进行测试时,出现了好几个 parser error 的问题,不是说缺少;就是说缺少 >,其实是因为不兼容导致的报错,只要加上 babel-eslint 即可;
首先安装 babel-eslint :
$ npm install -D babel-eslint
其次在 .eslintrc.js 文件中加入:
{
"parserOptions": {
"parser": "babel-eslint"
},
}
(2)安装 husky 后提交代码 husky 不生效:
$ rm -rf .git/hooks
$ npm uninstall husky -D
$ npm install husky -D
(3)npm run lint 始终报 npm 的 error,使用如下命令即可:
$ npm run lint -s
(4)关于prettier 的问题:
prettier 是一个很好的格式化代码的插件,但对已经有一定迭代完成度的代码不推荐使用。使用该插件后,它会将原有的代码也进行格式化,造成很多不可知的问题,我就是前车之鉴,使用 prettier 后,原本已经没有 eslint 问题的代码,又多出了更多的不知道什么原因的报错,只能将代码回退处理。
webpack+vue+Eslint+husky+lint-staged 统一项目编码规范的更多相关文章
- webpack+vue 我的视角(持续更新)
最近一直在研究webpack+vue的组合拳,现在分享一下: webpack就是一个项目管理工具,可以各种模块化加载,然后压缩,当然还有热加载技术(时灵时不灵..) vue是mv*模式的框架,组件化开 ...
- Webpack + vue 搭建
前言: 为何使用webpack? 为何相对于gulp&grunt更有优势 WebPack(前往官网)可以看做是模块打包机:直接分析项目结构,找到JavaScript模块以及其它的一些浏览器不能 ...
- webpack+vue多入口环境搭建
项目地址:https://pan.baidu.com/s/1c1Dflp2 使用前提:安装nodejs环境,webpack的配置官网的例子跟着跑一遍,会vue开发 研究webpack+vue研究了一个 ...
- [20190614]webpack+vue学习记录
本文记录一些学习webpack+vue相关的知识点,方便以后查阅,添加或修改 1. 初始化vue项目的代码结构 build--项目依赖包配置信息 config--项目配置文件 dev.env.js-- ...
- 使用webpack+vue.js构建前端工程化
参考文章:https://blog.csdn.net/qq_40208605/article/details/80661572 使用webpack+vue.js构建前端工程化本篇主要介绍三块知识点: ...
- 每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30分钟手把手教你学webpack实战 vue.js+webpack模块管理及组件开发
每天记录一点:NetCore获得配置文件 appsettings.json 用NetCore做项目如果用EF ORM在网上有很多的配置连接字符串,读取以及使用方法 由于很多朋友用的其他ORM如S ...
- vue eslint 规范配置
vue eslint 规范配置 为了代码格式统一,避免一些低级或者不合理的错误,现强行使用eslint的 standard规范 项目配置 目前都是使用 vue 提供的脚手架进行开发的,虽然 vue-c ...
- Vue+ESLint+Git钩子函数pre-commit配置教程
一.创建Vue项目eslint-standard vue create eslint-standard 二.创建.eslintrc.* 删除package.json中的eslintConfig配置 我 ...
- 做一个gulp+webpack+vue的单页应用开发架子
1.目标 最近项目上的事情不多,根据我自己的开发习惯,决定开发一些简单的开发架子,方便以后事情多的时候直接套用.本文讲的一个gulp+webpack+vue的单页应用架子,想要达到的目的: 可以通过命 ...
随机推荐
- Typora 的使用
一. Typora的markdown语法 1.标题 使用简单的ctr+数字健,就可以快速完成各种级别的标题 #一阶标题 或者快捷键Ctrl+1 ##二阶标题 或者快捷键Ctrl+2 ##二阶标题 或者 ...
- C# LoadXml System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1.
去掉BOM头 writer = new XmlTextWriter(stream, new UnicodeEncoding(false,false)); 如果是UTF8 writer = new Xm ...
- SpringMVC 出现 406(Not Acceptable)
首先,需要清楚,http state 406代表什么意思: 406是HTTP协议状态码的一种,表示无法使用请求的特性来响应请求的网页.一般指客户端浏览器不接受所请求页面的MIME类型. 出现这样的错误 ...
- springboot启动流程(八)ioc容器refresh过程(下篇)
所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 上一篇文章,我们知道了解析过程将从解析main方法所在的主类开始.在文章的最后我们稍微看 ...
- gradient 渐变
看了大漠 写的关于 Gradient 的文章,我也想写点以便加深记忆. 首先gradient 分为linear-gradient (线性渐变) 和 radial-gradient(径向渐变),渐变是作 ...
- K2 BPM_当BPM遇上RPA | 企业合规和风险管理从此更高效_全球领先的工作流引擎
强化企业合规与风险管理已成为全球企业发展的共识,尤其是对于药企.银行.地产这类对于合规性要求高的企业而言,识别预测潜在的管理风险和遵循不断升级的合规义务,是保证企业平稳运行的关键. 如何从流程层面降低 ...
- sql根据一个表查询的数据作为条件查询另一个表
代码格式如下: ) 要注意的是:in后面的查询语句必须是查询一个字段跟前面的表相对应的.比如要根据订单号orderID,OpenBills 这个表就需要查询到orderID这个字段,BillConsu ...
- 同一个url对应多个视图函数,取第一个视图函数有效
# -*- coding: utf-8 -*- from flask import Flask app = Flask(__name__) @app.route('/') def index(): r ...
- openstack安装部署——计算服务(控制节点&计算节点)前言
1.前言Openstack计算服务通过认证服务获取认证:通过镜像服务获取镜像:通过仪表盘提供的用户界面与用户交互.镜像的存取受工程和用户的限制,配额受工程的限制(例如不同工程允许虚拟机实例数量不同). ...
- MFC编程——Where is WinMain?
源码 #include<afxwin.h> class MyApp :public CWinApp { public: virtual BOOL InitInstance(); }; My ...