一. 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莫属,而良好的代码规范有助于项目的维护,为了防止一些不规范的代码 commitpush到远端,我们可以在git命令执行前用一些钩子来检测并阻止。现在大前端主要有两种 git钩子插件:husky(jquery与next.js都在用),pre-commit(antd在用)。我项目中使用的是 husky。
  用过 git的小伙伴们都知道 git 有很多命令commitpushrebase等等。那这些命令主要是在执行.git文件夹中的东西,git 钩子文档上介绍非常详细,git init后,在.git/hooks文件中,有一些.simple结尾的钩子示例脚本,那么 git 钩子目录就是在.git文件夹的hooks下,如下所示:
 
 
上图中的脚本文件就是 git 的钩子函数。
如果想启用对应的钩子函数,只需手动删除后缀。所以,列出两种配置方法:
 
1. 手动修改钩子文件:
按照文档上,配置钩子脚本,修改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 文件中加入:

{
   "extends": [
      "airbnb-base",
      "plugin:vue/essential"
   ],
"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 统一项目编码规范的更多相关文章

  1. webpack+vue 我的视角(持续更新)

    最近一直在研究webpack+vue的组合拳,现在分享一下: webpack就是一个项目管理工具,可以各种模块化加载,然后压缩,当然还有热加载技术(时灵时不灵..) vue是mv*模式的框架,组件化开 ...

  2. Webpack + vue 搭建

    前言: 为何使用webpack? 为何相对于gulp&grunt更有优势 WebPack(前往官网)可以看做是模块打包机:直接分析项目结构,找到JavaScript模块以及其它的一些浏览器不能 ...

  3. webpack+vue多入口环境搭建

    项目地址:https://pan.baidu.com/s/1c1Dflp2 使用前提:安装nodejs环境,webpack的配置官网的例子跟着跑一遍,会vue开发 研究webpack+vue研究了一个 ...

  4. [20190614]webpack+vue学习记录

    本文记录一些学习webpack+vue相关的知识点,方便以后查阅,添加或修改 1. 初始化vue项目的代码结构 build--项目依赖包配置信息 config--项目配置文件 dev.env.js-- ...

  5. 使用webpack+vue.js构建前端工程化

    参考文章:https://blog.csdn.net/qq_40208605/article/details/80661572 使用webpack+vue.js构建前端工程化本篇主要介绍三块知识点: ...

  6. 每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30分钟手把手教你学webpack实战 vue.js+webpack模块管理及组件开发

    每天记录一点:NetCore获得配置文件 appsettings.json   用NetCore做项目如果用EF  ORM在网上有很多的配置连接字符串,读取以及使用方法 由于很多朋友用的其他ORM如S ...

  7. vue eslint 规范配置

    vue eslint 规范配置 为了代码格式统一,避免一些低级或者不合理的错误,现强行使用eslint的 standard规范 项目配置 目前都是使用 vue 提供的脚手架进行开发的,虽然 vue-c ...

  8. Vue+ESLint+Git钩子函数pre-commit配置教程

    一.创建Vue项目eslint-standard vue create eslint-standard 二.创建.eslintrc.* 删除package.json中的eslintConfig配置 我 ...

  9. 做一个gulp+webpack+vue的单页应用开发架子

    1.目标 最近项目上的事情不多,根据我自己的开发习惯,决定开发一些简单的开发架子,方便以后事情多的时候直接套用.本文讲的一个gulp+webpack+vue的单页应用架子,想要达到的目的: 可以通过命 ...

随机推荐

  1. spring 框架的核心总结

    最近在学习Java语言,从而也学习了SpringFramework 这个大名鼎鼎的框架.从而做一些的记录. 题外话: 学习过几种不同的语言,后来知道所有的编程语言里所有的概念翻来覆去都是一样的事物,只 ...

  2. 【数学】Prime-Factor Prime

    Prime-Factor Prime 题目描述 A positive integer is called a "prime-factor prime" when the numbe ...

  3. Idea 使用 Junit4 进行单元测试

    目录 Idea 使用 Junit4 进行单元测试 1. Junit4 依赖安装 2. 编写测试代码 3. 生成测试类 4. 运行 Idea 使用 Junit4 进行单元测试 1. Junit4 依赖安 ...

  4. 怎样手写一个Object.create()方法

    Object.create()会将参数对象作为一个新创建的空对象的原型, 并返回这个空对象, 基于这个功能, 就有了下面这个Object.create()的手动实现: function _create ...

  5. Sql Server根据字符串拆分多列

    select parsename(REPLACE(Field,',','.'),3) as segment_1, parsename(REPLACE(Field,',','.'),2) as segm ...

  6. socket基本用法

    socket介绍 1.什么是socket socket是应用层与传输层中间的一个软件抽象层,它是一组接口.它把TCP/IP这些复杂的协议统一封装起来 这样我们只要知道如何使用socket就好,就已经符 ...

  7. Postman如何进行参数化

    前言 Postman作为一款接口测试工具,受到了非常多的开发工程师的拥护. 那么做为测试,了解Postman这款工具就成了必要的了. 这篇文章就是为了解决Postman怎么进行参数化的. 全局变量 全 ...

  8. MYSQL查询练习 1

    -- 查询练习 1------------ CREATE TABLE stu ( sid ), sname ), age INT, gender ) ); , 'male'); , 'female') ...

  9. NORDIC BLE MAC ADDR

      一个ble设备,地址可以分成2大类 1.Public Device Address(公共设备地址) 公共设备地址 Public Device Address是48bits的数字,就和电脑mac地址 ...

  10. C#中两个List<TModel>中根据指定条件--判断并获取不同数据的数据集合2

    方式一:Linq List<Test> list = new List<Test>(); list.Add(new Test { score = 10, name = &quo ...