Lint
-
-
- no-nested-ternary 不支持 fix
- react/jsx-closing-tag-location 自动 fix
- consistent-return 不支持 fix
- react/prefer-stateless-function 不支持 fix
- no-cond-assign 不支持 fix
- require-yield 不支持 fix
- prefer-destructuring 部分支持 fix
- react/destructuring-assignment 不支持 fix
- comma-dangle prettier 全部 fix
- max-len 部分 fix
- no-mixed-operators 不支持 fix
- react/no-array-index-key 不支持 fix
- @typescript-eslint/no-use-before-define 不支持 fix
- no-use-before-define 不支持 fix
- no-param-reassign 不支持 fix
- react-hooks/rules-of-hooks 部分支持 fix
- import/no-extraneous-dependencies 不支持 fix
- import/no-unresolved 不支持 fix
- 🌚 掩耳盗铃解决法
-
Pro 中一直有一套自己的 lint 的规则列表,默认模式比较严格,以下是一些常见的 lint 错误,以下是内置的一些错误。
- prettier
- eslint
- stylelint
📏 规则列表
本次更新不兼容规则共计 18 条,已有 102 个页面的项目为例,迁移时间大概在 2 个小时左右。如果是以前代码写的比较规范,速度可能更快。 以下列举了不能自动 fix 的所有规则说明,可以根据说明来进行修复。如果你需要某项规则,可以在 .eslintrc.js
中将规则配置为 0 或 1。
// 0 为关闭
// 1 会报错 warning
// 2 会报错 error,堵塞 ci 和 commit
'import/prefer-default-export': 0,
你也可以通过 eslint-disable-next-line
来忽略某些规则,尤其是写一些简单地部署脚本时。
// eslint-disable-next-line prefer-destructuring
packageName = packageName.match(/^_(@?[^@]+)/)![1];
no-nested-ternary 不支持 fix
禁止使用嵌套的三元表达式
// 🔴 错误的用法
var thing = foo ? bar : baz === qux ? quxx : foobar;
foo ? (baz === qux ? quxx() : foobar()) : bar();
// ✅ 正确的用法
var thing = foo ? bar : foobar;
var thing;
if (foo) {
thing = bar;
} else if (baz === qux) {
thing = quxx;
} else {
thing = foobar;
}
react/jsx-closing-tag-location 自动 fix
react 的标签开合应该对齐
// 🔴 错误的用法
<Hello>
marklar
</Hello>
// ✅ 正确的用法
<Hello>
marklar
</Hello>
no-restricted-globals react/no-access-state-in-setstate 不支持 fix 不要在 this.setState 中使用 this.state
// 🔴 错误的用法
setState({ value: this.state.value + 1 }); // 2
setState({ value: this.state.value + 1 }); // 2, 因为 setState 为异步所以还是 2 不是 3
// ✅ 正确的用法
this.setState((prevState) => ({ value: prevState.value + 1 }));
consistent-return 不支持 fix
使用一致的返回,如果有返回值应该每个 render 都提供返回值
// 🔴 错误的用法
function doSomething(condition) {
if (condition) {
return true;
} else {
return;
}
}
// ✅ 正确的用法
function doSomething(condition) {
if (condition) {
return true;
} else {
return false;
}
}
react/prefer-stateless-function 不支持 fix
如果没有使用 state 应该使用 react function
// 🔴 错误的用法
class Foo extends React.Component {
render() {
if (!this.props.foo) {
return null;
}
return <div>{this.props.foo}</div>;
}
}
// ✅ 正确的用法
const Foo = (props) => {
if (!props.foo) {
return null;
}
return <div>{props.foo}</div>;
};
no-cond-assign 不支持 fix
禁止在条件语句中出现赋值操作符
// 🔴 错误的用法
var x;
if ((x = 0)) {
var b = 1;
}
// ✅ 正确的用法
var x;
if (x === 0) {
var b = 1;
}
require-yield 不支持 fix
禁用函数内没有yield
的 generator 函数
// 🔴 错误的用法
function* foo() {
return 10;
}
// ✅ 正确的用法
function* foo() {
yield 5;
return 10;
}
prefer-destructuring 部分支持 fix
优先使用数组和对象解构,这个规则只是 warning,不会阻碍提交,但是仍然推荐修复,使用解构赋值可以很方便的进行默认值的设置
// 🔴 错误的用法
var foo = array[0];
var foo = object.foo;
var foo = object['foo'];
// 🔴 错误的用法
var [foo] = array;
var foo = array[someIndex];
// With `object` enabled
var { foo } = object;
var foo = object.bar;
react/destructuring-assignment 不支持 fix
尽量使用解构赋值从 props 中取值。这个规则只是 warning,不会阻碍提交,但是仍然推荐修复,使用解构赋值可以很方便的进行默认值的设置
// 🔴 错误的用法
const MyComponent = (props) => {
return <div id={props.id} />;
};
// ✅ 正确的用法
const MyComponent = (props) => {
const { id } = props;
return <div id={id} />;
};
comma-dangle prettier 全部 fix
根据 ECMAScript5 (和 ECMAScript3!)规范,对象字面量中的拖尾逗号是合法的,拖尾逗号简化了对象和数组增加或删除元素,因为你只需接触你要修改的行。另一个支持拖尾逗号的观点是,当对象或数组添加或删除元素时,它提高了代码差异的清晰度。
var foo = {
bar: 'baz',
qux: 'quux',
};
foo({
bar: 'baz',
qux: 'quux',
});
max-len 部分 fix
代码中非常长的行在任何语言中都很难阅读。为了提高可读性和可维护性,许多程序员制定了一项约定,来限制一行代码的字符数量(按照惯例 80 个字符)。
prettier 能部分修复,但是注释需要手工修复。url 会被忽略。
// 🔴 错误的用法
var foo = { bar: 'This is a bar.', baz: { qux: 'This is a qux' }, difficult: 'to read' };
// ✅ 正确的用法
var foo = {
bar: 'This is a bar.',
baz: { qux: 'This is a qux' },
easier: 'to read',
};
no-mixed-operators 不支持 fix
封闭的复杂表达式使用括号括起来明确了开发者的意图,使代码更具可读性。当表达式中连续的不同的操作符没有使用括号括起来就会报错。
// 🔴 错误的用法
var foo = (a && b) || c || d;
var foo = (a && b < 0) || c > 0 || d + 1 === 0;
var foo = a + b * c;
// ✅ 正确的用法
var foo = (a && b) || c || d;
var foo = a || b || c;
var foo = a && b && c;
var foo = (a && b < 0) || c > 0 || d + 1 === 0;
var foo = a && (b < 0 || c > 0 || d + 1 === 0);
var foo = (a + b) * c;
react/no-array-index-key 不支持 fix
不要使用 index 当 key,在 react 中使用 index 当 key 可能会造成一些问题,尤其是如果是希望改变列表的顺序,如果你使用了 index,或造成顺序更改后列表不更新的问题。但是在某些情况下 index 是必要使用的,例如动态输入列表。所以这个规则是 warning。
@typescript-eslint/no-use-before-define 不支持 fix
no-use-before-define 不支持 fix
不要在定义前使用,这个不用说了,会直接 error。
no-param-reassign 不支持 fix
不要赋值函数的参数,可以显著的减少 magic code。
// 🔴 错误的用法
function foo(bar) {
bar = 13;
}
function foo(bar) {
bar++;
}
// ✅ 正确的用法
function foo(a) {
var b = a;
b++;
return b;
}
react-hooks/rules-of-hooks 部分支持 fix
只在最顶层使用 hooks 和 只在 React 函数中调用 Hook,这个规则可以避免很多低级错误,必备。
// 🔴 在条件语句中使用 Hook 违反第一条规则
if (name !== '') {
useEffect(function persistForm() {
localStorage.setItem('formData', name);
});
}
// ✅ 正确的用法
useEffect(function persistForm() {
if (name !== '') {
localStorage.setItem('formData', name);
}
});
import/no-extraneous-dependencies 不支持 fix
不允许引入未在 dependencies 引入的依赖。为了保证测试等代码,允许在以下目录中使用 devDependencies 中的依赖
'**/tests/**.{ts,js,jsx,tsx}',
'**/_test_/**.{ts,js,jsx,tsx}',
'/mock/**/**.{ts,js,jsx,tsx}',
'**/**.test.{ts,js,jsx,tsx}',
'**/_mock.{ts,js,jsx,tsx}',
'**/example/**.{ts,js,jsx,tsx}',
'**/examples/**.{ts,js,jsx,tsx}',
import/no-unresolved 不支持 fix
虽然在 dependencies 中存在但是 require.resolve 无法获得,此规则由 warning 变成 error。忽略了 ['^@/', '^@@/', '^@alipay/bigfish/']
,并且对大小写敏感。此规则可以显著的减少编译阶段的错误。
🌚 掩耳盗铃解决法
如果想继续使用宽松的 lint 规则,可以在 .eslintrc.js
中如下配置。
{
"extends": "@alipay/bigfish/softyEslint",
"rules": {
// 你的自定义规则
"no-nested-ternary": 0,
}
}