前端项目如何自定义页面import排序?
现在前端开发项目一般都会用 ES Module 模块化开发方式,这就少不了用 import 去加载相关依赖包或组件等。随着 import 语句使用量增加,就迫切需要某种规则约束当前页面的 import 语句的排序,从而提高代码的可读性和可维护性,避免出错。
问题缘由
在最近的开发中因为项目缺少约束 import 语句的规范,导致在打包时因为 import 语句中因为包含了一个无效的引用。导致打包出错,从而不得不重新打包。这严重影响了打包发版效率,因此希望能在开发时 eslint 能自动移除未用到的引用,并且所有 import 语句能按自定义的规则排序而不是随便追加排列
提出问腿
- 如何自定义 import 排序?
- 如何自动删除未用到的引用?
解决办法
方法一: 修改 vscode 配置
"editor.codeActionsOnSave": {
"source.organizeImports": true,
"source.fixAll": true
},
用上面的配置可以在保存时自动排序 import 语句,而且能移除未用到的引用,可以解决当前问题。
但是我们发现 vscode 默认的 import 语句排序规则不友好,
外部模块的引用放在中间了,我们项目小伙伴对这样都不太习惯,因此想按照自己的习惯自定义排序,于是有了方法二
方法二:用方法一的配置再加上 eslint-plugin-simple-import-sort插件
使用方法:
- 安装插件
yarn add eslint-plugin-simple-import-sort -D
- 在.eslintrc.js 文件中增加配置
module.export = {
// ...
plugins: ["simple-import-sort"],
rules: {
"sort-imports": "off",
"import/order": "off",
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error",
},
};
配置好后重启 vscode 后,保存后可以发现 import 语句排序变了
这次 import 语句自动排序后基本达到我们的要求,并且排序规则也比较合适。
优点: 配置简单 使用方便 缺点: 不支持更加详细的自定义排序
我个人觉得这也不算是插件的缺点吧,毕竟在 README 上也说明了这插件不是适合所有人Not for everyone,只是作者个人在小项目中用
This plugin is not for everyone. I made this plugin for myself. I use it in many little projects and I like it.
由于我们是多人开发项目,且希望 import 语句能按照自定义规则排序,因此有了方法三
方法三:用方法一的配置再加上eslint-plugin-import
插件
- 安装插件
yarn add eslint-plugin-import -D
- 在.eslintrc.js 文件中增加配置
module.export = {
// ...
extends: [
// ...
"plugin:import/recommended",
],
rules: {
//...
"import/order": [
"error",
{
// 对导入模块进行分组,分组排序规则如下
groups: [
"builtin", // 内置模块
"external", // 外部模块
[
"parent", //父节点依赖
"sibling", //兄弟依赖
],
"internal", //内部引用
"index", // index文件
"type", //类型文件
"unknown",
],
//通过路径自定义分组
pathGroups: [
{
pattern: "@/**", // 把@开头的应用放在internal分组后面
group: "external",
position: "after",
},
],
// 是否开启独特组,用于区分自定义规则分组和其他规则分组
distinctGroup: true,
// 每个分组之间换行
"newlines-between": "always",
// 相同分组排列规则 按字母升序排序
alphabetize: { order: "asc" },
},
],
},
};
这个插件的配置就比较全面一点,在 import/order 中增加自己需要的排序规则,具体的排序规则可以参考import/order
上面的配置中也解释了各种排序规则的意义和作用
因为我们是使用 Typescript,配置完后发现含有别名的路径不能被解析
查询资料后发现要增加@typescript-eslint/parser
和 eslint-import-resolver-typescript
插件和以下配置
module.export = {
extends: [
// ...
"plugin:import/typescript",
],
settings: {
"import/resolver": {
typescript: true,
node: true,
},
},
};
这样用 vscode 的配置加上方法三中的插件可以完美解决前文中提到的两个问题
参考文章:
转载自:https://juejin.cn/post/7239725302014836796