资讯详情

资讯详情

eslint-plugin-import 规则实战:用 import/no-absolute-path 禁止绝对路径导入

开发工具代码质量静态分析【免费下载链接】eslint-plugin-importESLint plugin with rules that help validate proper imports.项目地址https://gitcode.com/gh_mirrors/es/eslint-plugin-import点击查看免费下载本文围绕 eslint-plugin-import 提供的import/no-absolute-path规则展开介绍它为什么存在、会拦截哪些写法、如何通过esmodule/commonjs/amd三个选项精确控制检查范围并深入源码src/rules/no-absolute-path.js、src/core/importType.js、utils/moduleVisitor.js说明判定与自动修复的底层原理。读完本文你可以独立完成该规则的配置、理解其 fix 行为并借助仓库测试用例验证自己的理解。一、规则背景绝对路径导入为什么是坏味道Node.js 本身允许用绝对路径导入模块例如require(/home/xyz/file.js);这种写法把代码与某台具体的电脑绑定在一起只要换一台机器、换一个部署目录这段代码就会立刻失效。对于要发布到npm的包而言消费者在完全不同的目录结构下安装使用绝对路径导入几乎必然导致运行时崩溃。import/no-absolute-path规则的职责就是禁止使用绝对路径导入模块。它在仓库中的注册位置是 src/index.js元信息中标记为type: suggestion、fixable: code因此它既是一类静态分析建议又是一条可以自动修复的规则——配合 ESLint 的--fix命令行选项即可一键改写。二、规则行为Fail 与 Pass 对照该规则的核心判定很简单只要模块说明符module specifier是一个以/开头的绝对路径就会报告错误。原文档给出了完整的正反例Fail会被报告import f from /foo; import f from /some/path; var f require(/foo); var f require(/some/path);以上 4 种写法分别覆盖了 ES6import和 CommonJSrequire两种模块系统都属于绝对路径导入。Pass不会被报告import _ from lodash; import foo from foo; import foo from ./foo; var _ require(lodash); var foo require(foo); var foo require(./foo);注意这里的语义边界裸模块名lodash、foo走的是node_modules解析合法相对路径./foo依赖当前文件位置合法Node 内置模块events、path等同样不受影响。仓库测试 tests/src/rules/no-absolute-path.js 的 valid 用例中还额外验证了../foo、./、scope/fooscoped 包、内置模块events/path等写法均不会被报告。三、Options 配置详解esmodule / commonjs / amd该规则的检查范围由三个布尔选项控制默认值如下选项默认值含义esmoduletrue检查 ES6import/export ... from及动态import()commonjstrue检查 CommonJSrequire(...)调用amdfalse检查 AMD 风格define([...])/require([...])的依赖数组也就是说默认情况下规则只对 ES6 import 和 CommonJS require 生效AMD 依赖路径默认不检查。启用 AMD 检查后define与require的依赖数组中的绝对路径同样会被报告/*eslint import/no-absolute-path: [2, { commonjs: false, amd: true }]*/ define([/foo], function (foo) { /*...*/ }) // reported require([/foo], function (foo) { /*...*/ }) // reported const foo require(/foo) // ignored because of explicit commonjs: false这里三种模块系统可以任意组合例如{ commonjs: false, amd: true }意味着只检查 AMDCommonJS 写法被显式豁免。配置写法示例传统.eslintrc风格2表示error级别也可写作字符串error{ rules: { import/no-absolute-path: [error, { commonjs: false, amd: true }] } }Flat configeslint.config.js/.mjs风格可参考仓库中的 examples/flat/eslint.config.mjsimport importPlugin from eslint-plugin-import; export default [ { plugins: { import: importPlugin }, rules: { import/no-absolute-path: [error, { amd: true }], }, }, ];需要特别说明的是该规则默认不在推荐配置中。查看 config/recommended.js 可以发现import/no-absolute-path并未被列入import:recommended预设因此如果你想启用它必须在自己的配置里显式声明而不是依赖extends: [plugin:import/recommended]。另外从 utils/moduleVisitor.js 中的makeOptionsSchema可以看出选项对象还额外支持一个ignore数组字符串正则列表命中正则的模块路径会被跳过不检查可用于对个别路径做豁免。四、自动修复--fix 的行为与边界规则声明了fixable: code因此可以直接运行eslint --fix src/**/*.js修复逻辑位于 src/rules/no-absolute-path.jsfix(fixer) { // node.js and web imports work with posix style paths (/) let relativePath path.posix.relative(path.dirname(getPhysicalFilename(context)), source.value); if (!relativePath.startsWith(.)) { relativePath ./${relativePath}; } return fixer.replaceText(source, JSON.stringify(relativePath)); }其原理是通过getPhysicalFilename(context)实现在 utils/contextCompat.js兼容新旧 ESLint 上下文 API拿到当前被检查文件的真实磁盘路径取该文件所在目录path.dirname再调用 Node 的path.posix.relative计算出从该目录到目标绝对路径的相对路径如果结果不以.开头例如计算出的是..之外的裸名称自动补上./前缀用JSON.stringify序列化后替换原模块说明符。测试用例 tests/src/rules/no-absolute-path.js 的 invalid 部分给出了非常直观的修复结果假设被检查文件位于/foo/bar/index.js原代码导入路径修复后输出import f from /fooimport f from ..import f from /foo/bar/baz.jsimport f from ./baz.jsimport f from /foo/pathimport f from ../pathimport f from /some/pathimport f from ../../some/pathrequire([/some/path], ...)amd: truerequire([../../some/path], ...)可见修复逻辑遵循 POSIX 路径语义统一使用/分隔在跨平台场景下也能产出稳定的相对路径这正是注释中node.js and web imports work with posix style paths的含义。五、源码级原理判定入口与访问者机制判定入口isAbsolute规则对每个模块说明符的判定委托给了 src/core/importType.js 导出的isAbsoluteexport function isAbsolute(name) { return typeof name string nodeIsAbsolute(name); }这里直接复用了 Node 内置path.isAbsolute先确保是字符串再判断是否为绝对路径。importType.js是 eslint-plugin-import 的导入类型分类器isAbsolute也是其中absolute类型的判定依据见typeTest函数其他规则如import/no-internal-modules等也共享同一套分类逻辑。访问者机制moduleVisitor规则的create函数在 src/rules/no-absolute-path.js 中做了选项合并后把reportIfAbsolute交给通用的moduleVisitorconst options { esmodule: true, commonjs: true, ...context.options[0] }; return moduleVisitor(reportIfAbsolute, options);moduleVisitorutils/moduleVisitor.js是 eslint-plugin-import 的公共模块遍历器它根据选项注册不同的 AST 访问器esmodule为真时访问ImportDeclaration、ExportNamedDeclaration、ExportAllDeclaration以及动态import()表达式ImportExpression或CallExpression中 callee 为Import的节点commonjs为真时访问单参数require(...)调用且同时支持字符串字面量与不含插值的单段模板字符串amd为真时访问require([...], cb)与define([...], ...)逐个检查依赖数组中的字符串元素并跳过require、exports这两个 AMD 魔法模块。因此虽然原文档的 Fail 示例只列了静态import和require两种形式但从源码看启用esmodule后动态import(/foo)同样会进入判定流程。每个被发现的模块路径最终都会回调reportIfAbsolute命中绝对路径即以固定消息Do not import modules using an absolute path上报。六、测试印证与最佳实践小结仓库测试 tests/src/rules/no-absolute-path.js 用RuleTester完整覆盖了三类模块系统valid 用例裸包名、相对路径、scoped 包、内置模块、amd: true下相对路径依赖数组等均不报错未开启amd时require([...])/define([...])默认不检查invalid 用例ES6 import、CommonJS require、AMD 依赖数组中的绝对路径均报错并逐一断言了--fix的修复输出。最后给出三条实用建议默认开启即可{ import/no-absolute-path: error }覆盖绝大多数场景防止代码库混入机器相关的硬编码路径按模块系统裁剪范围老项目若保留 AMD 加载器但希望清理 ES6/CommonJS 路径可用{ commonjs: false, amd: true }这类组合逐步治理善用 --fix规则自带确定性修复先跑一遍eslint --fix批量改写再人工审查修复后的相对路径是否符合项目目录规划。赞分享开发工具代码质量静态分析【免费下载链接】eslint-plugin-importESLint plugin with rules that help validate proper imports.项目地址https://gitcode.com/gh_mirrors/es/eslint-plugin-import点击查看免费下载相关推荐eslint-plugin-import 规则详解no-relative-packages —— 禁止通过相对路径导入包eslint plugin import 规则详解no relative packages —— 禁止通过相对路径导入包 导读 本文聚焦 eslint pl开发工具代码质量静态分析SandDance 可视化组件指南单元可视化架构、模块划分与自定义应用集成实战SandDance 可视化组件指南单元可视化架构、模块划分与自定义应用集成实战 SandDance 是微软研究院Microsoft Research VID开发工具代码质量静态分析eslint-plugin-import 规则深入import/no-empty-named-blocks 禁止空命名导入块eslint plugin import 规则深入import/no empty named blocks 禁止空命名导入块 import/no empty开发工具代码质量静态分析上一篇NS-USBLoader终极指南Switch游戏安装与文件管理一站式解决方案下一篇Netcatty 终端 Provider 插件体系深度解析从命令补全到特权数据拦截创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →