react-native 配置eslint+prettier(webstrom)

1. eslint、prettier

  • eslint
    ESLint是一个语法规则和代码风格的检查工具,提高代码质量。
  • prettier
    Prettier的中文意思是“漂亮的、机灵的”,也是一个流行的代码格式化工具的名称,它能够解析代码,使用你自己设定的规则来重新打印出格式规范的代码。

eslint 和 prettier 可以配合使用,也可以单独使用。下面我们主要讲eslint和prettier结合使用。

2. dev依赖及说明

"devDependencies": {
    ...
    "babel-eslint": "^10.0.1",
    "eslint": "^5.12.1",
    "eslint-config-prettier": "^4.0.0",
    "eslint-plugin-flowtype": "^3.2.1",
    "eslint-plugin-prettier": "^3.0.1",
    "eslint-plugin-react": "^7.12.4",
    "eslint-plugin-react-native": "^3.6.0",
    "prettier": "^1.16.1",
  },
  • babel-eslint
    对所有有效的babel代码进行lint处理。如果你使用eslint本身不支持的特性,可以使用 babel-eslint。否则可以使用默认解析器而不需要使用babel-eslint。
  • eslint-plugin-prettier
    配合eslint检测代码风格
    eslint-plugin-prettier插件会调用prettier对你的代码风格进行检查,其原理是先使用prettier对你的代码进行格式化,然后与格式化之前的代码进行对比,如果过出现了不一致,这个地方就会被prettier进行标记。
    接下来,我们需要在rules中添加,"prettier/prettier": "error",表示被prettier标记的地方抛出错误信息。
//.eslintrc.js
{
  "plugins": ["prettier"],
  "rules": {
    "prettier/prettier": "error"
  }
}
  • eslint-config-prettier
    通过使用eslint-config-prettier配置,能够关闭eslint一些不必要的或者是与prettier冲突的lint选项。这样我们就不会看到一些error同时出现两次。使用的时候需要确保,这个配置在extends的最后一项。
//.eslintrc.js
{
  extends: [
    'standard', //使用standard做代码规范
    "prettier",
  ],
}

同时使用eslint-plugin-prettiereslint-config-prettier两项配置:

//.eslintrc.js
{
  "extends": ["plugin:prettier/recommended"]
}

3. 配置eslint

3.1 安装相关依赖

首先我们需要安装相关依赖,将<2.dev依赖及说明>中的依赖添加到package.json的devDependencies下,并执行yarn。

node版本要求:之前安装的是8.4 版本过低,导致eslint添加失败。

3.2 添加规则文件

文件名.eslintrc.js,文件位置在项目根目录下。

//.eslintrc.js
module.exports = {
    //此项是用来指定eslint解析器的,解析器必须符合规则,babel-eslint解析器是对babel解析器的包装使其与ESLint解析
    "parser": "babel-eslint",
    // 此项指定环境的全局变量,
    "env": {
        "es6": true,
        "node": true,
        "react-native/react-native": true,
    },
    // 脚本在执行期间访问的额外的全局变量
    // 当访问未定义的变量时,no-undef 规则将发出警告。如果你想在一个文件里使用全局变量,推荐你定义这些全局变量,这样 ESLint 就不会发出警告了。你可以使用注释或在配置文件中定义全局变量。
    "globals": {
        "px2dp": true,
        "FONT_SIZE": true,
        "SCREEN_WIDTH": true,
        "SCREEN_HEIGHT": true,
        "IOS": true,
        "Android": true,
        "Toast": true,
        "isIPhoneX": true,
    },
    // 此项是用来配置标准的js风格,就是说写代码的时候要规范的写,
    "extends": [
        "eslint:recommended",
        "plugin:react/recommended",
        "plugin:flowtype/recommended",
        "plugin:prettier/recommended",
    ],
    // 设置解析器选项(必须设置这个属性)
    "parserOptions": {
        // 想使用的额外的语言特性:
        "ecmaFeatures": {
            // http://es6.ruanyifeng.com/#docs/object#对象的扩展运算符
            "experimentalObjectRestSpread": true,
            // 启用 JSX
            "jsx": true
        },
        //设置"script"(默认)或"module"如果你的代码是在ECMAScript中的模块
        "sourceType": "module"
    },
    // 此项是用来提供插件的,插件名称省略了eslint-plugin-,
    "plugins": [
        "react",
        "react-native",
        "flowtype"
    ],
    /**
     * "off" 或 0 - 关闭规则
     * "warn" 或 1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出),
     * "error" 或 2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)
     */
    "rules": {
        ////////////////
        // 可能的错误 //
        ////////////////

        // 禁止不必要的布尔转换
        "no-extra-boolean-cast": 0,
        "no-useless-computed-key": 0,
        // 禁止不必要的括号 //(a * b) + c;//报错
        "no-extra-parens":0,
        // 禁止不必要的分号
        "no-extra-semi":2,
        // 禁止在字符串和注释之外不规则的空白
        "no-irregular-whitespace":2,
        // 禁止出现令人困惑的多行表达式
        "no-unexpected-multiline":2,
        // 禁止在return、throw、continue 和 break语句之后出现不可达代码
        /*
         function foo() {
         return true;
         console.log("done");
         }//错误
         */
        "no-unreachable":2,
        // 强制 typeof 表达式与有效的字符串进行比较
        // typeof foo === "undefimed" 错误
        "valid-typeof":2,


        //////////////
        // 最佳实践 //
        //////////////

        // 启用严格模式
        'strict': 'error',
        // 空格方式,使用tab

        // 强制使用一致的换行风格
        "linebreak-style": [
            "error",
            "unix"
        ],
        // 允许使用 单引号和es6的``
        "quotes": [
            "error",
            "single",
            { "allowTemplateLiterals": true }
        ],
        // 要求或禁止使用分号而不是 ASI(这个才是控制行尾部分号的,)
        "semi": [
            "error",
            "always"
        ],
        // 尽可能使用`===`
        "eqeqeq": 2,
        // 强制在代码块中开括号前和闭括号后有空格
        "block-spacing": [2, "always"],
        // 在代码块之前强制使用空格
        "space-before-blocks": 2,
        // 要求操作符周围有空格
        "space-infix-ops": 2,
        // 一元操作符必须要有空格
        "space-unary-ops": 2,
        // 强制在注释中 // 或 /* 使用一致的空格
        "spaced-comment": [2, "always", { exceptions: ["-"] }],
        // 强制关键字周围空格的一致性
        "keyword-spacing": [
            2,
            { "before": true, "after": true }
        ],
        // 强制在箭头函数中 "xxx() => {}"
        "arrow-spacing": [
            "error",
            { "before": true, "after": true }
        ],
        // 在冒号后要加上空格
        "key-spacing":[
            "error",
            { "beforeColon": false }
        ],
        // 禁止空格和 tab 的混合缩进
        "no-mixed-spaces-and-tabs": 0,
        // 不允许使用var
        "no-var": 2,
        // 要求在逗号后使用一个或多个空格
        "comma-spacing": [
            "error",
            { "after": true }
        ],
        // 禁止分号前后有空格
        "semi-spacing": 2,
        // 禁止分号之前出现空格
        "semi-spacing": ["error", {"before": false, "after": true}],
        // 不允许改变用const声明的变量
        'no-const-assign': 'error',
        // 如果一个变量不会被重新赋值,最好使用const进行声明。
        'prefer-const': 'error',



        // 不允许使用行内样式
        "react-native/no-inline-styles": 2,
        // 强制类型后面要有一个","
        "flowtype/delimiter-dangle": [
            2,
            "only-multiline"
        ],
        // 在 : 后强制加空格
        "flowtype/space-after-type-colon": [
            2,
            "always"
        ],
        // 在 | & 符号中,强制加空格
        "flowtype/union-intersection-spacing": [
            2,
            "always"
        ],

    }
};

3.3 开启并配置eslint

image.png

4. prettier配置

4.1 安装prettier依赖

  yarn add perttier -D

4.2 安装prettier的webstorm插件

webstrom版本>2018,测试过程中发现2017版Plugins中找不到Prettier。2018版默认已安装prettier插件。


image.png

4.3 配置prettier插件

image.png

4.4 开启代码保存时自动格式化(可选)

image.png

image.png

4.5 添加prettier配置规则

在项目根目录package.json中添加,或在根目录下添加.prettierrc.js文件。

//.prettierrc.js
module.exports = {
    "tabWidth": 4,                   //一个tab代表几个空格数,默认为80
    "useTabs": false,                //是否使用tab进行缩进,默认为false,表示用空格进行缩减
    "singleQuote": true,             // //字符串是否使用单引号,默认为false,使用双引号
    "printWidth": 120,               // 换行字符串阈值
    "semi": true,                    // 句末加分号,默认为true
    "trailingComma": 'none',         //是否使用尾逗号,有三个可选值"<none|es5|all>"
    "bracketSpacing": true,          //对象大括号直接是否有空格,默认为true,效果:{ foo: bar }
    "jsxBracketSameLine": false,     // jsx > 是否另起一行
    "arrowParens": 'avoid',          // (x) => {} 是否要有小括号
    "requirePragma": false,          // 是否要注释来决定是否格式化代码
    "proseWrap": 'preserve'          // 是否要换行
    "parser": "babylon"              //代码的解析引擎,默认为babylon,与babel相同。
}

还有一些其他配置可以在官方文档进行查阅。

目前rn项目中使用的配置:

//package.json
"prettier": {
    "requirePragma": true,
    "singleQuote": true,
    "printWidth": 115,
    "proseWrap": "always"
  }

配置好后代码最上面加格式化注释即可


image.png

参考文章:
https://blog.csdn.net/github_33420275/article/details/83623890
https://segmentfault.com/a/1190000015315545

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

推荐阅读更多精彩内容