React-Native工程中ESLint静态检测

React-Native工程中ESLint静态检测

ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具,它的目标是保证代码的一致性和避免错误

使用ESLint的原因

  1. 由于大家从客户端转入到React Native开发过程中,容易出现低级语法错误;
  2. 开发者之前从事Android、iOS、前端等工作,因此代码风格不同,导致项目代码风格不统一;
  3. React Native更新迭代较快,系统方法和语法更新较快导致老代码维护麻烦;

虽然以上问题可以通过强化自身技术和代码review等方式缓解,但仍面临开发者技术水平不同,个人习惯不同,知识传播缓慢等原因导致开发时间,开发成本增加,这时静态代码检测的作用:

  1. 可以检测代码低级语法错误
  2. 规范代码风格
  3. 根据需要不断完善自定义代码检测规则
  4. 快速熟悉代码,追踪信息,定位问题等

ESLint简单介绍

  1. ESLint的解释器支持最新的ECMAScript标准,会根据具体情况对和新规则进行更改,以更好地使用语言扩展(如JSX,TS等)
  2. ESLint可以结合Prettier代码格式化和ESLint来捕获可能的错误

由于ESLint是官方推出的规则,是最基础的标准规则包,有时我们在项目的规则配置过程中需要自定义一些规则,为避免麻烦,直接使用eslint-config-airbnb规则包

ESLint规则配置

你可以使用npm安装

npm install eslint --save-dev

运行eslint --init之后,.eslintrc会在文件夹中自动创建,会有如下规则

{
    "rules": {
        "semi": ["error", "always"],  
        "quotes": ["error", "double"] 
    }
}

规则说明:

"semi" (分号)和 "quotes"(引号) 是 ESLint 中 规则 的名称

"off" or 0 - 关闭规则
"warn" or 1 - 将规则视为一个警告(不会影响退出码)
"error" or 2 - 将规则视为一个错误 (退出码为1)

具体可去官网查看https://www.npmjs.com/package/eslint

eslint-config-airbnb配置

eslint-config-airbnb是基础规则配置的一个扩展包

  1. 安装
1. 这个命令可以列出每个安装包的正确版本:

npm info "eslint-config-airbnb@latest" peerDependencies

2. npm 5+,使用如下命令

npx install-peerdeps --dev eslint-config-airbnb

"devDependencies": {
    "babel-eslint": "^10.1.0",
    "eslint": "^7.2.0",
    "eslint-config-airbnb": "^18.2.0",
    "eslint-formatter-pretty": "^4.0.0",
    "eslint-plugin-import": "^2.22.1",
    "eslint-plugin-jsx-a11y": "^6.4.1",
    "eslint-plugin-react": "^7.21.5",
    "eslint-plugin-react-hooks": "^4.0.0",
    "eslint-plugin-react-native": "^3.10.0",
  },
 
  1. 配置

在.eslintrc文件中添加

"extends": ["airbnb", "airbnb/hooks"]

具体可去npm官网查看https://www.npmjs.com/package/eslint-config-airbnb

.eslintrc配置

除了在.eslintrc中配置,也可以直接在package.json中eslintConfig字段指定配置,当然eslint的配置远不止如下js环境配置,具体可以去官网查看https://cn.eslint.org/docs/user-guide/configuring

module.exports = {
    "root": true,
    "env": {
        "browser": true,   //  浏览器环境中的全局变量
        "commonjs": true,  //  CommonJS 全局变量和 CommonJS 作用域
        "es6": true,       //  启用除了 modules 以外的所有 ECMAScript 6 特性
        "node": true       //  Node.js 全局变量和 Node.js 作用域。
    }, // 浏览器环境
    "extends": ["airbnb", "airbnb/hooks"],  // 配置js风格/标准,这里遵循爱彼迎的标准
    "parser": "babel-eslint",               // babel解释器,优化 Parsing error: Unexpected token ..
    "parserOptions": {
        "ecmaFeatures": {
            "jsx": true,        // 启用JSX
            "modules": true,
            // "experimentalObjectRestSpread": true
        },
        "ecmaVersion": 6,       // ES6 默认(3,5)
        "sourceType": "module"  // ECMAScript 模块
    },
    "plugins": [
        "react",
        "react-native",
        "import",
        "jsx-a11y",
        // "@babel"
    ],
    "rules": {
        // //关闭换行符操作系统格式问题
        // "linebreak-style": [
        //     "off",
        //     "unix"
        // ],
        // //使用单引号和双引号
        // "quotes": [
        //     0,
        //     "double"
        // ],
        // "object-curly-spacing": [
        //     1,
        //     'never'
        // ],
        // //使用分号
        // "semi": [
        //     "error",
        //     "always"
        // ],
        // // 禁止缩进错误
        // "indent": 0,
    }
};

本地检测操作

如果使用的是webStorm,可在当前Terminal下或者使用终端在当前工程目录下运行

eslint .

会自动检测全部文件

运行指定文件,如果指定文件和.eslintrc在同级,直接运行

eslint [文件名]
如:
eslint App.js

运行指定文件,和.eslintrc不在同级,运行

eslint [文件夹名]/[文件名]
如:
eslint js/Main.js
同理,多层级eslint [文件夹名]/[文件夹名]/.../[文件名]

如果你想忽略某文件的运行,在package.json中添加

"eslintIgnore": [
    "index.js"
  ]

如果你运行检测了某忽略文件,会提示你:

0:0  warning  File ignored because of your .eslintignore file. Use --no-ignore to override.

使用 eslint index.js --no-ignore 继续检测,会检测忽略的文件

自动fix问题

--fix

该选项指示 ESLint 试图修复尽可能多的问题。修复只针对实际文件本身,而且剩下的未修复的问题才会输出。不是所有的问题都能使用这个选项进行修复

--fix-type

此选项允许你在使用 --fix 或 --fix-dry-run 时指定要应用的修复的类型。修复的三种类型是:

  1. problem - 修复代码中的潜在错误
  2. suggestion - 对改进它的代码应用修复
  3. layout - 应用不改变程序结构 (AST) 的修复

输出检测文件

很多时候终端检测文件的输出看起来很麻烦,这个时候就需要我们将检测的文件输出成文档以便找到位置并修改

eslint [指定文件] -o [文件位置]

eslint index.js -o /Users/tongle/Desktop/eslint/eslint.txt

如下提示:
�[0m   �[2m7:37�[22m  �[31merror�[39m    Missing semicolon 

会自动将index.js的检测结果以文本格式输出到指定位置,还可以添加格式化组件eslint-formatter-pretty,通过npm安装

npm install eslint-formatter-pretty

当指定之后,给定的格式就输出到控制台。如果你想将输出保存到一个文件,你可以在命令行上这样操作:

eslint -f compact index.js > /Users/tongle/Desktop/eslint/index.txt

如下报错提示:

error: Missing semicolon (semi) at App.js:34:10:
  32 |                 <AppContainer uriPrefix={prefix}/>
  33 |             </ActionSheetProvider>
> 34 |         )
     |          ^
  35 |     }
  36 | }
  37 | 

这样更容易找到问题修复问题。

期望下个版本能在线CI检测

本地进行代码检查的过程也会存在被人遗忘的可能性,通过技术的保障,可以避免人为遗忘,作为代码提交的标准流程,通过CI检查后再合并代码,可以有效避免代码错误的问题。CI系统可以为理解为一个云端的环境,环境配置与本地一致,在这种情况下,可以生成与本地一致的报告,可以通过jenkins自动打包平台生成检测报告或者自有打包平台检测

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345