UNPKG

eslint-config-ise

Version:

ISE JavaScript TypeScript Node.js 规范

355 lines (284 loc) 10.6 kB
/** * 本文件的规则由 eslint-plugin-react 和 eslint-plugin-react-hooks 提供 * @link https://github.com/yannickcr/eslint-plugin-react * @link https://www.npmjs.com/package/eslint-plugin-react-hooks */ module.exports = { plugins: ['react', 'react-hooks'], rules: { // https://github.com/alibaba/f2e-spec/issues/95 // 防止 React 组件定义中缺少 displayName 'react/display-name': ['warn', { ignoreTranspilerName: false }], // 不要使用模糊的类型检查器 (any, array, object) 'react/forbid-prop-types': ['warn', { forbid: ['any', 'array', 'object'] }], // prop 值为 true 时,可以省略它的值 'react/jsx-boolean-value': ['error', 'never', { always: [] }], // 标签的属性有多行时,结束标签需另起一行 // @unessential 'react/jsx-closing-bracket-location': ['error', 'line-aligned'], // JSX 语法闭合标签的缩进和换行 // @unessential 'react/jsx-closing-tag-location': 'error', // JSX 行内属性间仅有一个空格 // @unessential 'react/jsx-props-no-multi-spaces': 'error', // JSX 属性的大括号内部两侧无空格 // @unessential 'react/jsx-curly-spacing': ['error', 'never', { allowMultiline: true }], // JSX 中命名事件处理函数的前缀约定 'react/jsx-handler-names': [ 'off', { eventHandlerPrefix: 'handle', eventHandlerPropPrefix: 'on', }, ], // JSX 属性使用 2 个空格缩进 // @unessential 'react/jsx-indent-props': ['error', 2], // JSX 语法检查数组和迭代器的 key 'react/jsx-key': 'off', // 标签属性的换行,如果标签有多个属性,且存在换行,则每个属性都需要换行独占一行 // @unessential 'react/jsx-max-props-per-line': ['error', { maximum: 1, when: 'multiline' }], // 不要在 JSX 属性中使用 .bind() 'react/jsx-no-bind': [ 'warn', { ignoreRefs: false, allowArrowFunctions: true, allowBind: false, }, ], // 不要声明重复的属性名 'react/jsx-no-duplicate-props': ['error', { ignoreCase: true }], // JSX 中不要直接使用字符串,而是通过{'TEXT'} 'react/jsx-no-literals': ['off', { noStrings: true }], // 不要使用未声明的组件 'react/jsx-no-undef': 'error', // 使用大驼峰风格命名组件 'react/jsx-pascal-case': [ 'error', { allowAllCaps: true, ignore: [], }, ], // 类型检查器的属性名按首字母排序 'react/sort-prop-types': [ 'off', { ignoreCase: true, callbacksLast: false, requiredFirst: false, }, ], // 本条废弃,用新规则代替 react/jsx-sort-props 'react/jsx-sort-prop-types': 'off', // 属性按首字母排序 'react/jsx-sort-props': [ 'off', { ignoreCase: true, callbacksLast: false, shorthandFirst: false, shorthandLast: false, noSortAlphabetically: false, reservedFirst: true, }, ], // 本条是对JS规范 no-unused-vars 的补充,防止React被错误地标记为未使用 'react/jsx-uses-react': ['error'], // 本条是对JS规范 no-unused-vars 的补充,防止变量被错误地标记为未使用 'react/jsx-uses-vars': 'error', // 不要使用危险属性 'react/no-danger': 'warn', // 禁止使用已经废弃的方法 // @unessential 'react/no-deprecated': 'error', // 不要在 componentWillUpdate 内改变 state 值 'react/no-will-update-set-state': 'error', // 使用 this.state 获取状态,用 setState 改变状态;不能用 this.state 赋值改变状态 'react/no-direct-mutation-state': 'off', // isMounted 已经被废弃 'react/no-is-mounted': 'error', // 每个文件只包含一个 React 组件 'react/no-multi-comp': ['error', { ignoreStateless: true }], // 禁止使用 setState 'react/no-set-state': 'off', // 使用 ref 回调函数或 React.createRef(),不要使用字符串 'react/no-string-refs': 'error', // 不要在无状态组件中使用 this 'react/no-this-in-sfc': 'error', // 在JSX中,所有DOM属性和属性命名都应该是小驼峰 'react/no-unknown-property': 'error', // 使用 class extends React.Component ,而不是 React.createClass 'react/prefer-es6-class': ['error', 'always'], // 当未使用生命周期方法、setState 或者 ref,使用无状态函数定义组件 'react/prefer-stateless-function': 'off', // prop 需要 propTypes 验证类型 'react/prop-types': [ 'warn', { ignore: [], customValidators: [], skipUndeclared: false, }, ], // 防止 JSX 中未引入 React 'react/react-in-jsx-scope': 'off', // render 方法必须要有返回值 'react/require-render-return': 'error', // 无子元素的标签需写成自闭合标签 'react/self-closing-comp': 'error', // 组件方法排序 'react/sort-comp': [ 'off', { order: [ 'static-methods', 'instance-variables', 'lifecycle', '/^on.+$/', 'getters', 'setters', '/^(get|set)(?!(InitialState$|DefaultProps$|ChildContext$)).+$/', 'instance-methods', 'everything-else', 'rendering', ], groups: { lifecycle: [ 'displayName', 'propTypes', 'contextTypes', 'childContextTypes', 'mixins', 'statics', 'defaultProps', 'constructor', 'getDefaultProps', 'getInitialState', 'state', 'getChildContext', 'componentWillMount', 'componentDidMount', 'componentWillReceiveProps', 'shouldComponentUpdate', 'componentWillUpdate', 'componentDidUpdate', 'componentWillUnmount', ], rendering: ['/^render.+$/', 'render'], }, }, ], // 多行的 JSX 标签需用小括号包裹 // @unessential 'react/jsx-wrap-multilines': [ 'error', { declaration: true, assignment: true, return: true, arrow: true, }, ], // 设置第一个属性的位置。multiline-multiprop:如果JSX标签占用多行并且有多个属性,则第一个属性应始终放在新行上 // @unessential 'react/jsx-first-prop-new-line': ['error', 'multiline-multiprop'], // 不要在 JSX 属性的等号两边加空格 // @unessential 'react/jsx-equals-spacing': ['error', 'never'], // JSX 使用 2 个空格缩进 // @unessential 'react/jsx-indent': ['error', 2], // 不要单独使用 target='_blank' 'react/jsx-no-target-blank': 'warn', // 不要在 setState 中使用 this.state 'react/no-access-state-in-setstate': 'error', // 指定 React 组件的文件扩展名 'react/jsx-filename-extension': [ 'error', { extensions: ['.jsx', '.js', '.tsx', '.ts', '.vue'] }, ], // JSX 语句的文本节点中不要使用注释字符串(例如,以//或/ *开头) 'react/jsx-no-comment-textnodes': 'error', // 禁止使用 ReactDOM.render 的返回值 'react/no-render-return-value': 'error', // 组件必须包含 shouldComponentUpdate 或者 PureRenderMixin 'react/require-optimization': ['off', { allowDecorators: [] }], // 不要使用 findDOMNode,严格模式下已经弃用 // @unessential 'react/no-find-dom-node': 'error', // 禁止某些特定的 prop 命名,只对组件生效,DOM节点不生效 'react/forbid-component-props': ['off', { forbid: [] }], // 禁止某些特定的元素命名 'react/forbid-elements': ['off', { forbid: [] }], // 禁止在有子节点的组件或 DOM 元素中使用 dangerouslySetInnerHTML 属性 'react/no-danger-with-children': 'error', // 声明的 prop 必须被使用 'react/no-unused-prop-types': [ 'error', { customValidators: [], skipShapeProps: true, }, ], // style 的属性值必须是一个对象 'react/style-prop-object': 'error', // 标签中禁止出现无意义字符,比如 > " } ' 'react/no-unescaped-entities': 'error', // 禁止将 children 作为属性名 'react/no-children-prop': 'error', // 自闭合标签的斜线前有且仅有一个空格 // @unessential 'react/jsx-tag-spacing': [ 'error', { closingSlash: 'never', beforeSelfClosing: 'always', afterOpening: 'never', }, ], // 该条废弃,被替代为 jsx-tag-spacing 'react/jsx-space-before-closing': ['off', 'always'], // 不要用数组索引作为 map 元素的 key 'react/no-array-index-key': 'warn', // 如果属性没有 isRequired 类型检查,需要在 defaultProps 内对其赋值 'react/require-default-props': 'off', // 禁止使用其他组件的prop类型,除非有明确的导入/导出 'react/forbid-foreign-prop-types': 'off', // HTML 自闭标签不能有子节点 'react/void-dom-elements-no-children': 'error', // defaultProps 需要与 propTypes 相匹配 'react/default-props-match-prop-types': ['warn', { allowRequiredDefaults: false }], // 在扩展 React.PureComponent 时禁止使用 shouldComponentUpdate 'react/no-redundant-should-component-update': 'error', // 声明的 state 必须被使用 'react/no-unused-state': 'error', // 布尔类型的属性的命名约定,建议用 is 或 has 前缀 'react/boolean-prop-naming': 'off', // 禁止大小写拼写错误,该检测规则未写入规范 'react/no-typos': 'error', // JSX 属性或子元素强制使用花括号或禁止使用不必要的花括号 'react/jsx-curly-brace-presence': 'off', // Checks rules of Hooks // @link https://reactjs.org/docs/hooks-rules.html 'react-hooks/rules-of-hooks': 'error', // Checks effect dependencies // @link https://reactjs.org/docs/hooks-rules.html 'react-hooks/exhaustive-deps': 'warn', }, settings: { 'import/resolver': { node: { extensions: ['.js', '.jsx', '.json'], }, }, react: { pragma: 'React', version: 'detect', }, }, };