前言
现在前端工程化一般都会加上 eslint + prettier (从零搭建前端工程(下))做格式化,为了团队风格,美观,还有为了减少不必要的冲突,比如 import 文件的顺序。合并代码的时候,冲突无可避免,但是能尽量减少最好。能够统一排序,添加的文件的改动也比较一目了然。相应的工具其实也不少,大同小异,选择适合自己的而用之。
一、eslint 自带的 sort-imports
《sort-imports》。不看了,自定义差,还几乎不能 auto fix。
二、eslint 插件 eslint-plugin-import
《eslint-plugin-import》。支持自定义配置,支持 auto fix,后面说的都是,不然没啥意义了。示例代码:
module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
sourceType: 'module',
ecmaVersion: 'latest',
},
plugins: ['import'],
rules: {
'import/order': [
'error',
{
groups: [
'index',
'builtin',
'external',
'internal',
'object',
'type',
'unknown',
['parent', 'sibling'],
],
pathGroups: [
{
pattern: 'react*',
group: 'builtin',
position: 'after',
},
{
pattern: '@/*',
group: 'internal',
position: 'after',
},
{
pattern: '@*/**',
group: 'internal',
position: 'before',
},
],
pathGroupsExcludedImportTypes: [],
distinctGroup: false,
'newlines-between': 'always',
alphabetize: {
order: 'asc',
orderImportKind: 'asc',
caseInsensitive: true,
},
warnOnUnassignedImports: false,
},
],
},
};
大部分配置都很好理解,就是这个 pathGroupsExcludedImportTypes
实在不明所以。
Issue#2156 有个老哥给出答案:
想要 pathGroups
的配置生效,那么它原本所属的类型就不要出现在 pathGroupsExcludedImportTypes
react* 属于 external
,而这个属性的默认值是 [‘buildin’, ‘external’],所以配置了 react* 的话,就要重定义这个值。 所以示例代码是空数组。
老哥又提到:But now, it has been applied exactly the opposite way.
囧,确实我理解反了,我以为是要使其生效才要写在里面。而且理解成是 pattern 定义的分类是属于下面 group 的,也就是一开始以为是指定 react* 属于 builtin。而其实不是,而是说 react* 在 builtin 类型的相对位置。= =!