去了解ESLint吧

参考文章

原理

ESlint 使用Espress把js语法转换成AST,然后通过 AST selectors找到静态代码中内容,再根据 rule 的规则去判断这一段js 是否符合规范。

  • ESLint 使用 Espree 解析 JavaScript
  • ESLint 使用 AST 去分析代码中的模式
  • ESLint 是完全插件化的,每个规则都是一个插件,并且可以在运行时添加更多规则

Configuring ESLint

ESLint 是完全可配置的,有2中方式开配置ESLint:

  • 使用JavaScript注释,把配置信息直接嵌入到代码源文件中
  • 指定一个独立的*配置文件**(.eslintrc.

ESLint中可配置以下选项:

  • 运行环境(Environments), 每种运行环境都带有一组特定的预定义全局变量
  • 全局变量(Globals), 运行期间可访问的其他全局变量
  • 规则 (Rules),启用了哪些规则,以及其错误级别
  • 插件(Plugins),使用了哪些第三方插件定义的额外规则、运行环境、配置等

配置文件

ESlint配置文件支持多种文件格式,如果存在多个配置文件,优先级顺序按如下:

  • JavaScript, .eslintrc.js, 导出一个配置对象。export an object
  • JavaScript(ESM), .eslintrc.cjs, 在 package.json 中 指定 "type":"module"
  • YAML,.eslintrc.yaml, eslintrc.yml
  • JSON,.eslintrc.json, ESLint中的json 文件可使用js格式的注释
  • package.json, eslintConfig属性,指定配置文件路径

2中使用方式

  • ESLint 会自动查找检测配置文件.eslintrc.*,直到 系统的根目录~/ (**除非 指定了root:true**)
  • 命令行CLI —config参数 eslint -c muconfig.json myfiletotest.js

共享设置

在ESlint配置文件中设置可共享的对象,可提供给所有正在执行的规则去访问,可用于自定义规则中想要去访问相同信息。

1
2
3
{
"settings": {}
}

层叠配置

1
2
3
4
5
6
7
your-project
├── .eslintrc.json
├── lib
│ └── source.js
└─┬ tests
├── .eslintrc.json
└── test.js

默认情况下,距离要检测文件最近的.eslintrc.*文件优先级最高,其次才是其父目录,直到根目录,当发现配置文件中指定"root":true,会停止寻找。

配置层次结构优先级(高->低):

  • 行内配置 /*eslint-enable*/
  • 命令行选项 --global,—config,--rule
  • 项目级别 配置
    • .eslintrc.*package.json与要检测的文件 在同一目录中
    • 继续 在 其祖先目录中寻找 .eslintrc.*package.json文件,直到根目录(系统上当前用户的主目录(~/)也被视为根目录,即需要寻找到此停止,在8.0版本,该目录中的配置将被忽略),或者找到"root":true的配置文件

扩展配置文件

一个配置一旦扩展,就可以继承另一个配置文件的所有特征(规则、插件、选项),且可以修改所有选项。有3中配置:

  • 基本配置,扩展的配置
  • 派生配置,扩展基本配置的配置
  • 最后生成的配置:将派生配置合并到基本配置的结果(the result of merging the derived configurantion into the base configuration.)

extends 属性值(2种)

  • 字符串,(配置文件的路径、可共享的配置名称、eslint:recommended(推荐的规则)、eslint:all(所有规则))
  • 字符串数组,每个附加配置都扩展了它前面的配置

extends属性中的 相对路径、可共享的配置名称,是从它们出现的配置文件的位置解析

配置名称可省略eslint-config-前缀,例如,airbnb 解析为eslint-config-airbnb

使用可共享的配置(npm包)

可共享的配置是一个npm包,并导出一个配置对象,必须安装在项目的跟目录中。

extends的属性值 可以省略包的eslint-config-前缀

如何创建一个可共享的配置?

  • 1、create a Node.js module, 名字以eslint-config-开头,例如 eslint-config-jiang

    npm scoped modules也是支持的,可以命名为@scope/eslint-config,或以其作为前缀。例如 @jiang/eslint-config @jiang/eslint-config-myconfig

  • 2、新建index.js文件,并导出一个配置对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    module.exports = {
    globals: {
    MyGlobales: true,
    Jiang: {
    name: "jiang",
    age: 29,
    friends: ["Aime", "Jack"]
    }
    },
    rule: {
    semi: [2, "always"],
    "no-debugger": [1],
    "no-alert": [0]
    }
    }
  • 3、发布可共享的配置包

    发布到npm,在package.json 使用peerDependencies字段去声明对eslint的依赖。为了兼容性,声明依赖项推荐使用>=范围语法,即最定要求的eslint版本

    1
    2
    3
    4
    5
    {
    "peerDependencies": {
    "eslint" : ">= 8"
    }
    }

    如果共享配置也依赖与其他插件,要将其指定为 前置依赖peerDependency。 如果,共享配置依赖于第三方解析器或其他可共享配置,要将这些包指定为项目依赖dependencies

    本地测试,要发布的包
    • npm link / pnpm link, 全局链接模块,使当前本地包可在系统范围内或其他位置访问

    • 在需要使共享配置的的项目中,npm link eslint-config-myconfig

  • 4、使用可共享的配置

    1
    2
    3
    {
    "extends": "eslint-config-myconfig"
    }
共享多个配置

可以在同一个npm包共享多个配置,且为包指定默认配置。例如,新建一个特定配置文件my-special-config.js,包名eslint-config-jiang,通过以下方式访问附加配置

1
2
3
{
"extends": "jiang/my-special-config"
}

如果是 scoped modules,则不能省略 eslint-config命名空间。假设包名@jiang/eslint-config,

1
2
3
{
"extends": "@jiang/eslint-config/my-special-config"
}

使用来自插件的规则

插件 也是一个 npm包,可给ESLint添加新规则,导出可共享配置。要确保该npm包安装在ESLint能访问到的目录下。

plugins属性值可以省略包名的前缀eslint-plugin-

extends属性值 格式: plugin: + 包名 + / + 配置名称, 例如 plugin:react/recommended

1
2
3
4
5
6
7
8
9
10
11
12
{
"plugins": [
"react"
],
"extends": [
"eslint:recommended",
"plugin:react/recommended"
],
"rules": {
"react/no-set-state": "off"
}
}

配置名称, 在configs选项设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
module.exports = {
deprecatedRules,
rules: allRules,
configs: {
recommended: {
plugins: [
'react',
],
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
rules: {
'react/display-name': 2,
'react/jsx-key': 2,
'react/jsx-no-comment-textnodes': 2,
'react/jsx-no-duplicate-props': 2,
'react/jsx-no-target-blank': 2,
'react/jsx-no-undef': 2,
'react/jsx-uses-react': 2,
'react/jsx-uses-vars': 2,
'react/no-children-prop': 2,
'react/no-danger-with-children': 2,
'react/no-deprecated': 2,
'react/no-direct-mutation-state': 2,
'react/no-find-dom-node': 2,
'react/no-is-mounted': 2,
'react/no-render-return-value': 2,
'react/no-string-refs': 2,
'react/no-unescaped-entities': 2,
'react/no-unknown-property': 2,
'react/no-unsafe': 0,
'react/prop-types': 2,
'react/react-in-jsx-scope': 2,
'react/require-render-return': 2,
},
},
all: {
plugins: [
'react',
],
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
rules: activeRulesConfig,
},
'jsx-runtime': {
plugins: [
'react',
],
parserOptions: {
ecmaFeatures: {
jsx: true,
},
jsxPragma: null, // for @typescript/eslint-parser
},
rules: {
'react/react-in-jsx-scope': 0,
'react/jsx-uses-react': 0,
},
},
},
};

​ 启用eslint推荐的规则子集,rules页中复选框选中的规则

使用eslint:all

​ 启用当前eslint版本中所有的核心规则

更精细化配置,overrides属性

使用overrides属性,根据配置中文件 glob模式覆盖规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"rules": {
quotes:["error", "dobule"]
},
"overrides": [
{
"files": ["foo/*.js"],
"excludedFiles": "*.test.js",
"rules": {
"quotes": ["error", "single"]
}
}
]
}

忽略ESlint规则检查

1、.eslintignore 文件

在项目根目录下创建.eslintignore文件中指定要忽略检查的文件或目录。

  • 每一行一个glob模式,指定要忽略的路径
  • # 开头的行 被视为注释
  • 路径时相对于当前工作目录的
  • !是否定模式
1
2
3
4
# Ignore build files except build/test.js
!.build
.build/*
!.build/test.js
2、配置文件 中的ignorePatterns

使用ignorePatterns指定要忽略检查的文件

1
2
3
{
"ignorePatterns": ["*.ignore.js"]
}


参考文章

原理

ESlint 使用Espress把js语法转换成AST,然后通过 AST selectors找到静态代码中内容,再根据 rule 的规则去判断这一段js 是否符合规范。

  • ESLint 使用 Espree 解析 JavaScript
  • ESLint 使用 AST 去分析代码中的模式
  • ESLint 是完全插件化的,每个规则都是一个插件,并且可以在运行时添加更多规则

Configuring ESLint

ESLint 是完全可配置的,有2中方式开配置ESLint:

  • 使用JavaScript注释,把配置信息直接嵌入到代码源文件中
  • 指定一个独立的*配置文件**(.eslintrc.*)*

ESLint中可配置以下选项:

  • 运行环境(Environments), 每种运行环境都带有一组特定的预定义全局变量
  • 全局变量(Globals), 运行期间可访问的其他全局变量
  • 规则 (Rules),启用了哪些规则,以及其错误级别
  • 插件(Plugins),使用了哪些第三方插件定义的额外规则、运行环境、配置等

配置文件

ESlint配置文件支持多种文件格式,如果存在多个配置文件,优先级顺序按如下:

  • JavaScript, .eslintrc.js, 导出一个配置对象。export an object
  • JavaScript(ESM), .eslintrc.cjs, 在 package.json 中 指定 "type":"module"
  • YAML,.eslintrc.yaml, eslintrc.yml
  • JSON,.eslintrc.json, ESLint中的json 文件可使用js格式的注释
  • package.json, eslintConfig属性,指定配置文件路径

2中使用方式

  • ESLint 会自动查找检测配置文件.eslintrc.*,直到 系统的根目录~/ (除非 指定了root:true
  • 命令行CLI —config参数 eslint -c muconfig.json myfiletotest.js

共享设置

在ESlint配置文件中设置可共享的对象,可提供给所有正在执行的规则去访问,可用于自定义规则中想要去访问相同信息。

1
2
3
{
"settings": {}
}

层叠配置

1
2
3
4
5
6
7
your-project
├── .eslintrc.json
├── lib
│ └── source.js
└─┬ tests
├── .eslintrc.json
└── test.js

默认情况下,距离要检测文件最近的.eslintrc.*文件优先级最高,其次才是其父目录,直到根目录,当发现配置文件中指定"root":true,会停止寻找。

配置层次结构优先级(高->低):

  • 行内配置 /*eslint-enable*/
  • 命令行选项 --global,—config,--rule
  • 项目级别 配置
    • .eslintrc.*package.json与要检测的文件 在同一目录中
    • 继续 在 其祖先目录中寻找 .eslintrc.*package.json文件,直到根目录(系统上当前用户的主目录(~/)也被视为根目录,即需要寻找到此停止,在8.0版本,该目录中的配置将被忽略),或者找到"root":true的配置文件

扩展配置文件

一个配置一旦扩展,就可以继承另一个配置文件的所有特征(规则、插件、选项),且可以修改所有选项。有3中配置:

  • 基本配置,扩展的配置
  • 派生配置,扩展基本配置的配置
  • 最后生成的配置:将派生配置合并到基本配置的结果(the result of merging the derived configurantion into the base configuration.)

extends 属性值(2种)

  • 字符串,(配置文件的路径、可共享的配置名称、eslint:recommended(推荐的规则)、eslint:all(所有规则))
  • 字符串数组,每个附加配置都扩展了它前面的配置

extends属性中的 相对路径、可共享的配置名称,是从它们出现的配置文件的位置解析

配置名称可省略eslint-config-前缀,例如,airbnb 解析为eslint-config-airbnb

使用可共享的配置(npm包)

可共享的配置是一个npm包,并导出一个配置对象,必须安装在项目的跟目录中。

extends的属性值 可以省略包的eslint-config-前缀

如何创建一个可共享的配置?

  • 1、create a Node.js module, 名字以eslint-config-开头,例如 eslint-config-jiang

    npm scoped modules也是支持的,可以命名为@scope/eslint-config,或以其作为前缀。例如 @jiang/eslint-config @jiang/eslint-config-myconfig

  • 2、新建index.js文件,并导出一个配置对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    module.exports = {
    globals: {
    MyGlobales: true,
    Jiang: {
    name: "jiang",
    age: 29,
    friends: ["Aime", "Jack"]
    }
    },
    rule: {
    semi: [2, "always"],
    "no-debugger": [1],
    "no-alert": [0]
    }
    }
  • 3、发布可共享的配置包

    发布到npm,在package.json 使用peerDependencies字段去声明对eslint的依赖。为了兼容性,声明依赖项推荐使用>=范围语法,即最定要求的eslint版本

    1
    2
    3
    4
    5
    {
    "peerDependencies": {
    "eslint" : ">= 8"
    }
    }

    如果共享配置也依赖与其他插件,要将其指定为 前置依赖peerDependency。 如果,共享配置依赖于第三方解析器或其他可共享配置,要将这些包指定为项目依赖dependencies

    本地测试,要发布的包
    • npm link / pnpm link, 全局链接模块,使当前本地包可在系统范围内或其他位置访问
    • 在需要使共享配置的的项目中,npm link eslint-config-myconfig
  • 4、使用可共享的配置

    1
    2
    3
    {
    "extends": "eslint-config-myconfig"
    }
共享多个配置

可以在同一个npm包共享多个配置,且为包指定默认配置。例如,新建一个特定配置文件my-special-config.js,包名eslint-config-jiang,通过以下方式访问附加配置

1
2
3
{
"extends": "jiang/my-special-config"
}

如果是 scoped modules,则不能省略 eslint-config命名空间。假设包名@jiang/eslint-config,

1
2
3
{
"extends": "@jiang/eslint-config/my-special-config"
}

使用来自插件的规则

插件 也是一个 npm包,可给ESLint添加新规则,导出可共享配置。要确保该npm包安装在ESLint能访问到的目录下。

plugins属性值可以省略包名的前缀eslint-plugin-

extends属性值 格式: plugin: + 包名 + / + 配置名称, 例如 plugin:react/recommended

1
2
3
4
5
6
7
8
9
10
11
12
{
"plugins": [
"react"
],
"extends": [
"eslint:recommended",
"plugin:react/recommended"
],
"rules": {
"react/no-set-state": "off"
}
}

配置名称, 在configs选项设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
module.exports = {
deprecatedRules,
rules: allRules,
configs: {
recommended: {
plugins: [
'react',
],
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
rules: {
'react/display-name': 2,
'react/jsx-key': 2,
'react/jsx-no-comment-textnodes': 2,
'react/jsx-no-duplicate-props': 2,
'react/jsx-no-target-blank': 2,
'react/jsx-no-undef': 2,
'react/jsx-uses-react': 2,
'react/jsx-uses-vars': 2,
'react/no-children-prop': 2,
'react/no-danger-with-children': 2,
'react/no-deprecated': 2,
'react/no-direct-mutation-state': 2,
'react/no-find-dom-node': 2,
'react/no-is-mounted': 2,
'react/no-render-return-value': 2,
'react/no-string-refs': 2,
'react/no-unescaped-entities': 2,
'react/no-unknown-property': 2,
'react/no-unsafe': 0,
'react/prop-types': 2,
'react/react-in-jsx-scope': 2,
'react/require-render-return': 2,
},
},
all: {
plugins: [
'react',
],
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
rules: activeRulesConfig,
},
'jsx-runtime': {
plugins: [
'react',
],
parserOptions: {
ecmaFeatures: {
jsx: true,
},
jsxPragma: null, // for @typescript/eslint-parser
},
rules: {
'react/react-in-jsx-scope': 0,
'react/jsx-uses-react': 0,
},
},
},
};

启用eslint推荐的规则子集,rules页中复选框选中的规则

使用eslint:all

启用当前eslint版本中所有的核心规则

更精细化配置,overrides属性

使用overrides属性,根据配置中文件 glob模式覆盖规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"rules": {
quotes:["error", "dobule"]
},
"overrides": [
{
"files": ["foo/*.js"],
"excludedFiles": "*.test.js",
"rules": {
"quotes": ["error", "single"]
}
}
]
}

忽略ESlint规则检查

1、.eslintignore 文件

在项目根目录下创建.eslintignore文件中指定要忽略检查的文件或目录。

  • 每一行一个glob模式,指定要忽略的路径
  • # 开头的行 被视为注释
  • 路径时相对于当前工作目录的
  • !是否定模式
1
2
3
4
# Ignore build files except build/test.js
!.build
.build/*
!.build/test.js
2、配置文件 中的ignorePatterns

使用ignorePatterns指定要忽略检查的文件

1
2
3
{
"ignorePatterns": ["*.ignore.js"]
}

语言相关的选项

指定环境

一个环境提供了一组预定义的全局变量。可用的环境:brower、node、commonjs、es6、shared-node-browser、amd、mocha、jest、jquery、mongo、shelljs

  • 使用注释, 在js文件中指定环境

    1
    /* eslint-env node, mocha*/
  • 配置文件中,使用env属性来指定环境并设为true

    1
    2
    3
    4
    5
    6
    7
    8
    {
    "env": {
    "browser": true,
    "commonjs": true,
    "es2021": true,
    "node": true,
    }
    }
  • package.json

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    {
    name:"eslint-demo",
    "version": "1.0.0",
    eslintConfig: {
    "env": {
    "browser": true,
    "es2021": true,
    "node": true
    }
    }
    }

指定全局变量

当访问未定义的变量时,ESLintno-undef规则会发出警告。可在配置文件中定义或使用注释定义全局变量。

  • 使用注释定义全局变量, 默认是可读的,使用writable标识其可被写入

    1
    2
    3
    /*  global var1, var2 */

    /* global var1:writable, var2:writable */
  • 在配置文件定义全局变量,使用globals属性设置为一个对象, 可用”off”禁用全局变量

    1
    2
    3
    4
    5
    6
    7
    {
    "globals": {
    "var1": "writable",
    "var2": "readonly",
    "Promise": "off"
    }
    }

指定解析器

ESLint可以指定想要支持的js语言选项,ESlint默认支持 ECMAScript 5 语法。使用parseroptions属性设置一个对象,其属性如下:

  • ecmaVersion, 可设置为3,5(defalut),6,7,8,9,11,或者2015(same as 6),2016(7),2017(8),latest (最新支持的版本)
  • sourceType,类型,scriptmodule,
  • allowReserved, 允许使用保留字做标识符
  • ecmaFeatures, 对象,指定想要使用的附件语言功能。例如 jsx: true, 支持JSX语法
1
2
3
4
5
6
7
8
9
{
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
}
}

援疆计划

自我介绍

各位领导,下午好,我是刘振江,来自产险科技中心个人客户研发团队,是一名前端工程师。入司2年多,一直在网销非车项目组工作,负责开发维护我们平安保险商城官网,配合业务老师上线各类的营销活动。另外,还参与优化了ITS航母系统内的录单、出单流程,以及开发完善了新产品配置、上下架等功能。总体来讲,做的还可以,需求方满意,自己也小有成就感。

我从小在新疆生活长大,小学、初中在团场上的(农二师26团),高中去了库尔勒,大学考到了武汉,工作来了深圳。对新疆是有感情,也是热爱的。所以当知道公司有”援疆派驻人才”招募计划,我第一时间就报名了,真的希望能借此机会,回到新疆发展,通过努力、扎实的工作,能办出些实事来,去实实在在的为新疆的发展做出贡献。

与此同时,我也想着能通过这份工作,好好的去宣传新疆,让更过的人了解真正的新疆,从而喜欢上新疆。因为我自身感受而言,内地的朋友对新疆了解的不多,往往会把新疆想象成一个神秘、封闭和落后的地方,他们仅仅知道些新疆美食、美景。甚至有些人会有些误解,例如“新疆不安全”,“新疆交通落后,出行不方便”,“新疆干旱没水,到处都是戈壁沙漠”等。

援疆结束后,我希望能够继续留在新疆工作,毕竟新疆潜力巨大,发展一定会越来越好。对我个人而言,则会有很大的个人成长与发展空间。还有一点,父母都在新疆,发小好友,初、高中同学也大都在新疆工作和生活,从家庭、友情方面考虑,留在新疆,应该是好的选择。

问题?
  • 援疆人才培养方案是怎样的?有培训的具体计划?
  • 到了新疆,有老师或领导带我们吗?大致工作是什么?需要哪些技能,有没有相应的指导或培训,我们考核指标是怎样?
希望达成的目标?
  • 能办出些实事来,能真正让喀什发展的更好,给喀什地区的各族群众带来好处
  • 自己能通过文字、照片、视频等形式记录我的援疆历程,让更多的人知道援疆,去了解新疆,去参与到新疆的建设与发展中。

新疆安全

  • 新疆便民警务站很多

  • 进入餐厅、超市、电影院等公共场所,随身带的大小包都要过安检仪,类似在深圳乘坐地铁过安检一样

  • 安保措施严格繁琐,但为了自治区的长治久安,大家都能体谅和理解

新疆交通
  • 新疆是全国机场数量最多的省区
  • 全疆所有地区地州都通了铁路; 哈密、吐鲁番乌鲁木齐(兰新高铁)。 城际列车,南疆之星(乌鲁木齐-库尔勒),北疆之星(乌鲁木齐-伊宁)
  • 2021_0120_0b0976a6g00qn7ub500brd000k000g0p
  • 新建公路,最美独库公路/天山公路(独山子-库车),横穿天山,连接南北疆,沿途有那拉提草原(巩乃斯林场),巴音布克草原(九曲十八弯),天山大峡谷,库车大峡谷
    伊昭公路(伊宁-昭苏),伊犁 薰衣草, 天马,昭苏马场
  • 塞果高速(赛里木湖-果子沟)
新疆美食

囊、拌面、大盘鸡,库尔勒香梨、伊犁的奶茶、阿克苏苹果、库车的小白杏、吐鲁番的葡萄、哈密瓜

新疆美景

北疆,高山、草原,湖泊、森林,塞外江南

南疆,沙漠、戈壁,大漠边塞风光,喀什老城、慕士塔格峰、天山大峡谷、罗布泊、塔克拉玛干沙漠

新疆方言
  • 劳道
  • 皮牙子
  • 大肉
  • 勺子-
  • 哈马斯,(全部)
  • 巴郎子、羊缸子(妇女)
  • 麦格来 (过来)
  • 赶巴扎 (国际大巴扎)
喀什

新Q, “喀什噶尔”,”玉石集中之地”, 1个县级市、10个县、1个自治县(塔什库尔干塔吉克族)

汉族 28万,维吾尔族 428万 92%

喀什噶尔石榴,莎车巴旦木,伽师瓜,叶城的核桃

帕米尔冰川矿区水