最近使用create-react-app
创建了一个项目,然后使用npm run eject
使配置文件暴露
此时,产生了错误 Using babel-preset-react-app
requires that you specify NODE_ENV
or BABEL_ENV
environment variables. Valid values are “development”, “test”, and “production”. Instead, received: undefined.
这个问题困扰我很久,近期找到了create-react-app
的相关issue
Babel error immediately on eject #12070。根据issue中提出的临时解决方案,进行如下总结
解决方案1:修改package.json
{
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
],
"parserOptions": {
"babelOptions": {
"presets": [
["babel-preset-react-app", false]
"babel-preset-react-app/prod"
]
}
}
}
}
解决方案2:添加.eslintrc.json
,推荐使用此方法对eslint进行详细配置
{
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"plugin:react/jsx-runtime"
],
"parserOptions": {
"babelOptions": {
"presets": [
["babel-preset-react-app", false],
"babel-preset-react-app/prod"
]
}
},
"env": {
"es6": true,
"browser": true,
"node": true,
"commonjs": true
}
}
同时,这里使用了eslint-plugin-react
配置库
$ npm install eslint eslint-plugin-react --save-dev
用于继承某些基础配置。值可以是字符串/数组。值为数组时,每个配置继承它前面的配置。
说白了,就是别人提前写好了一套 rules,你直接拿过来用就行。不用自己一个一个一个的,写 rules 规则
手动自定义代码规范
off
不检查warning
报警告error
报错使用第三方插件。(要先安装才能使用)
因此,可以理解为,plugins 就是在 eslint 常规检查 js 代码规范这个能力之外,给它增加一些新的能力。
ESLint 默认使用Espree作为其解析器,你可以在配置文件中指定一个不同的解析器,只要该解析器符合下列要求:
注意,即使满足这些兼容性要求,也不能保证一个外部解析器可以与 ESLint 正常配合工作,ESLint 也不会修复与其它解析器不兼容的相关 bug。
为了表明使用该 npm 模块作为你的解析器,你需要在你的 .eslintrc 文件里指定 parser 选项。例如,下面的配置指定了 Esprima 作为解析器:
{
"parser": "esprima",
"rules": {
"semi": "error"
}
}
以下解析器与 ESLint 兼容:
注意,在使用自定义解析器时,为了让 ESLint 在处理非 ECMAScript 5 特性时正常工作,配置属性 parserOptions 仍然是必须的。解析器会被传入 parserOptions,但是不一定会使用它们来决定功能特性的开关。
ESLint 默认使用Espree作为其解析器,你可以在配置文件中指定一个不同的解析器,只要该解析器符合下列要求:
注意,即使满足这些兼容性要求,也不能保证一个外部解析器可以与 ESLint 正常配合工作,ESLint 也不会修复与其它解析器不兼容的相关 bug。
为了表明使用该 npm 模块作为你的解析器,你需要在你的 .eslintrc 文件里指定 parser 选项。例如,下面的配置指定了 Esprima 作为解析器:
{
"parser": "esprima"
}
以下解析器与 ESLint 兼容:
注意,在使用自定义解析器时,为了让 ESLint 在处理非 ECMAScript 5 特性时正常工作,配置属性 parserOptions 仍然是必须的。解析器会被传入 parserOptions,但是不一定会使用它们来决定功能特性的开关。
ESLint的默认解析器和核心规则只支持最新的最终ECMAScript
标准,不支持Babel
提供的实验性(如新特性)和non-standard
(如流或TypeScript
类型)语法。@babel/eslint-parser
是一个解析器,它允许ESLint在Babel转换的源代码上运行。
注意:如果不使用experimental语法
则无需使用@babel/eslint-parser
,因为默认解析器支持所有non-experimental
语法和JSX
要使您的eslint支持decorator
特性,需要将parser
设为如@babel/eslint-parser
这种支持experimental语法
的解析器
npm i @babel/eslint-parser @babel/eslint-plugin --save-dev
module.exports = {
"parser": "@babel/eslint-parser",
"plugins": [
"@babel/eslint-plugin"
]
}
同时,应该安装decorator
对应的babel插件
npm i @babel/plugin-proposal-decorator --save-dev
在package.json
中启用该插件
{
"babel":{
"plugins": [
[
"@babel/plugin-proposal-decorators",
{
"legacy": true
}
]
]
}
}
配置jsconfig.json
{
"complierOptions": {
"experimentalDecorators": true
}
}
//.eslintrc.js
module.exports = {
root: true,
parser: '@typescript-eslint/parser',
plugins: [
'@typescript-eslint',
],
extends: [
'plugin:react/recommended',
'plugin:react/jsx-runtime',
'plugin:@typescript-eslint/recommended',
],
};
npm install --save-dev eslint typescript @typescript-eslint/parser @typescript-eslint/eslint-plugin