前言

ESLint作为插件化的javascript代码检测工具,为我们的平时的开发保驾护航,好处就不多说了详情查看官网

问题

有这么一个五年前开发的老项目,机缘巧合到了我们这边来维护。

项目是zepto撸起来的,单个文件巨大,只有gulp+公司内部古老的打包工具做了下简单的打包。

但是问题很严重的是,现在es6写习惯了,在老项目时总会有些地方会忽略掉直接用了es6的语法。

这种未经babel转译的代码,然而在当前的现状是大部分浏览器是可以运行的,

只有以蓝绿厂为代表的部分国产手机未支持。测试的时候没有进行全机型的覆盖。导致上线后出问题。在这样的背景下进行了讨论,怎么处理这种老项目。

解决方案

解决其实也很简单,无外乎下面三种

项目迁移

时间充足,迭代频繁的情况下,首选迁移,不然zepto写的文件太大太难维护了。基于现状就pass调这条了。

babel

既然是未转移的存在问题,转就完了。

语法检查

在提交之前,检测es6语法,确保不存在之后再允许提交。

权衡之下,选择了语法检查,顺带复习了下eslint的用法。

安装

//可以全局安装
npm i -g eslint
//或者项目本地安装
npm i -D eslint

安装之后,进行初始化(当然可以复用已有的.eslintrc.js):

eslint --init
//非全局安装
./node_modules/.bin/eslint --init
//选择初始化类型 这里就看具体用途了
How would you like to configure ESLint? (Use arrow keys)
Use a popular style guide //已有的流行规范,大家比较推崇的几种
❯ Answer questions about your style // 回答问题来定制
Inspect your JavaScript file(s) // 检查已有js文件来生成

这里我直接选择了3,以为会比较友好的直接生成。

后面依次如下:

Which file(s), path(s), or glob(s) should be examined? ./js //待检测的目录
? What format do you want your config file to be in? JavaScript //配置文件即eslintrc.js的格式,当然是js喽
? Which version of ECMAScript do you use? ES5 //当前使用的ES5
? Where will your code run? Browser //浏览器
? Do you use CommonJS? Yes //CommonJS规范
? Do you use JSX? No //是否用了jsx,显然否

结束之后,生成了我们的配置文件:

//太长,只关注我们关心的部分吧
//环境部分就是自己选择的
"env": {
"browser": true,
"commonjs": true
},
// 扩展配置 eslint:recommended 是核心规则
"extends": "eslint:recommended",
// 支持的ECMAScript 规范,默认也是5
"parserOptions": {
"ecmaVersion": 5
},
// 检查规则,这里不详细表述
"rules": {
// ***
}

配置文件生成完成,那么直接干吧。直接执行看看:

// 检查 文件夹下面的文件
./node_modules/.bin/eslint ./js

然后报了1020个错误。。。毕竟是老项目,符合规范也不现实。但是我们的目的好像不像这么大费周章,只想禁用es6罢了。eslint提供了这个选项:直接false掉好了。rules其实我们不需要,因为是老项目,也不想去做这个限制。所以配置文件被我改成了这样。

    "env": {
"es6":false
},
"parserOptions": {
"ecmaVersion": 5
},
"rules": {
}

这样跑起来看还行,只把文件中的es6部分找出来了



但是这样又有个问题,这个庞大的老项目有文件数目太多。每次都要去检查js文件夹下的所有文件是有点浪费的。毕竟我们有这个这样一个前提,这次未改动的认为是符合要求的(毕竟有问题也早被修复了),应该只关注这次改动部分。这样想的人多了,就有大牛造出下面的工具了。

lint-staged

在commit之前的检测会更有意义一些,这样错误代码就不会提交到仓库。去检测所有文件很慢且有的结果是无关紧要的,你更改关心的是本次改动的内容。这就是lint-staged的用处。

安装及使用:

//切记lint-staged 和 husky要全部安装
npm install --D lint-staged husky

husky 可以阻止坏的commit, push and more。方便我们操作git hooks。

可以这样使用:

{
//自己手动hook
"scripts": {
"precommit": "npm test"
},
//使用husky
"husky": {
"hooks": {
"pre-commit": "npm test"
}
}
}

这里就提一下不要忘记安装这个工具,不然你会发现lint-staged配置完成之后没有起作用(我不想说我是怎么知道的。。。),更多请移步github主页

用法也很简单,在我们的package中增加下配置就好

"scripts": {
"precommit": "lint-staged"
},
"lint-staged": {
"*.js": [
"eslint",
"git add"
]
}

这样,就是只检测本次commit中的js文件了。

那么结合lint-staged,我们可以配下我们的package.json

"scripts": {
"precommit": "lint-staged"
},
"lint-staged": {
"*.js": [
"eslint",
"git add"
]
}

结束

到这里,老项目禁止es6就完成了。简单测试下,覆盖还可以,起码常用的方法可以检测到。正好用到eslint+lint-staged,就大概看了下,巩固下原来不熟悉的地方,给自己也做个记录。希望能对有需要的同学有所帮助。

ESLint + lint-staged 禁用老项目中的es6的更多相关文章

  1. 前端项目中常用es6知识总结 -- 箭头函数及this指向、尾调用优化

    项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...

  2. 前端项目中常用es6知识总结 -- Async、Await让异步美如画

    项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...

  3. 前端项目中常用es6知识总结 -- Promise逃脱回调地狱

    项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...

  4. 前端项目中常用es6知识总结 -- let、const及数据类型延伸

    项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const  2 ...

  5. 解决老项目中 Timer运行一段时间后失效的问题

    那是因为Timer中的代码出现了异常未被捕获,所以线程被挂起 只需要加入  try catch即可 推荐使用 Quartz 2018-08-08 03:50:44 [ Timer-1:39366015 ...

  6. 在老项目中使用Gradle:更改默认目录结构

    apply plugin: 'war' sourceCompatibility = 1.5 version = "1.0" //中央仓库 repositories { mavenC ...

  7. vue-webpack所构建好的项目中增加Eslint

    首先在package.json中配置eslint模块: 在终端运行命令:npm install 然后在build文件夹中web pack.base.conf.js配置eslint 接下来在在项目中新建 ...

  8. nuxt 脚手架创建nuxt项目中不支持es6语法的解决方案

    node本身并不支持es6语法,我们通常在vue项目中使用es6语法,是因为,我们使用babel做过处理, 为了让项目支持es6语法,我们必须同时使用babel 去启动我们的程序,所以再启动程序中加 ...

  9. eslint配置介绍-如何在uniapp中配置eslint

    eslint uniapp-eslint及vue-eslint配置 ESLint 是一个开源的 JavaScript 代码检查工具.可以让程序员在编码的过程中发现问题而不是在执行的过程中. 1. es ...

随机推荐

  1. Java打印M图形(二维数组)——(九)

    对于平面图形输出集合图形与数字组合的,用二维数组.先在Excel表格中分析一下,找到简单的规律.二维数组的行数为行高,列数为最后一个数大小. 对于减小再增大再减小再增大的,可以用一个boolean标志 ...

  2. 基于URL的权限管理(三)

    思路:先创建一个专门的类ActiveUser用于存储用户登录的信息,主要用于存储用户id,账户,名称,菜单,权限. 认证拦截器主要是查看用户是否已登陆,如果没有转发到登陆界面,用户用账户跟密码登录时候 ...

  3. python读写文件字符集

    操作I/O的能力是由操作系统的提供的,每一种编程语言都会把操作系统提供的低级C接口封装起来供开发者使用,Python也不例外.  读写文件是需要请求操作系统去操作磁盘的  所以默认的编码就是你平台的编 ...

  4. 【Mysql sql inject】【入门篇】SQLi-Labs使用 part 1【01-11】

    人员流动性过大一直是乙方公司痛点.虽然试用期间都有岗前学习,但老员工忙于项目无暇带新人成长,入职新人的学习基本靠自己不断摸索.期望看相关文档就可以一蹴而是不现实的.而按部就班的学习又很难短期内将知识有 ...

  5. shell编程之helloworld

    /bin/sh与/bin/bash的区别sh:如果前面有语句报错,则报错语句后面的命令不执行bash:如果前面有语句报错,后面的命令也会执行sh跟bash的区别,实际上就是bash有没有开启posix ...

  6. 读SRE Google运维解密有感(一)

    前言 这几天打算利用碎片时间读了一下"SRE Google运维解密"这本书,目前读了前几章,感觉收获颇多,结合自己的工作经历和书中的要点,写一些感悟和思考 SRE 有关SRE我就不 ...

  7. 网站遭遇CC及DDOS攻击紧急处理方案

    检测访问是否是CC攻击的命令: 80口为网站的访问端口,可以根据实际情况进行修改 # netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: ' ...

  8. MySQL 数据类型(转)

    MySQL 数据类型 在 MySQL 中,有三种主要的类型:文本.数字和日期/时间类型. Text 类型: 数据类型 描述 备注 CHAR(size) 保存固定长度的字符串(可包含字母.数字以及特殊字 ...

  9. PHP实现中文字符串截取无乱码

    在我们学习PHP知识的过程中,PHP截取字符串应该是一个非常常见的字符串基础操作了,想必大家都比较熟悉这方面知识点. 但是有些新手朋友们可能遇到过,当截取中英文字符串时出现乱码的情况,其实这个也是非常 ...

  10. linux + docker + selenium grid 实现分布式执行selenium脚本

    Selenium Grid 有两个概念 hub :主节点,你可以看作 "北京总公司的测试经理". node:分支节点,你可以看作 "北京总公司的测试小兵A" 和 ...