是否存在Lint规则可强制按目录层级规范导出方式?
适配你需求的ESLint规则方案
目前没有完全匹配你需求的现成ESLint规则,但可以通过自定义规则或者组合现有规则的方式实现,以下是具体可行的方案:
一、现有规则的部分适配(仅作辅助)
现有ESLint插件里没有能精准区分「同目录文件显式导出」和「嵌套文件夹批量导出」的规则,但可以用以下规则做基础约束:
import/no-default-export:强制不使用默认导出,避免非预期的导出内容import/export:检查导出语法的合法性,避免无效导出
但这些规则无法满足你核心的场景区分需求,还是得靠自定义规则实现精准管控。
二、自定义ESLint规则(精准匹配需求)
这是最贴合你要求的方式,规则核心逻辑针对index.js/index.ts文件,区分两种导出场景做约束:
- 针对同目录文件的导出:必须用
export { xxx } from './xxx'的显式命名导出,禁止export * - 针对嵌套文件夹的导出:必须用
export * from './xxx/xxx'的批量导出,禁止显式命名导出
简化的自定义规则代码示例
module.exports = { create(context) { const filename = context.getFilename(); // 仅对index文件生效 if (!/\/index\.(js|ts)$/.test(filename)) return {}; return { // 检查export *声明 ExportAllDeclaration(node) { const sourcePath = node.source.value; // 同目录文件(不含路径分隔符)不能用export * if (!sourcePath.includes('/')) { context.report({ node, message: '同目录文件需使用显式命名导出,禁止使用export *' }); } }, // 检查命名导出声明 ExportNamedDeclaration(node) { if (!node.source) return; // 跳过本地导出的情况,可按需调整 const sourcePath = node.source.value; // 嵌套文件夹(含路径分隔符)必须用export * if (sourcePath.includes('/')) { context.report({ node, message: '嵌套文件夹需使用export *导出,禁止使用显式命名导出' }); } } }; } };
三、在monorepo中落地执行
- 可以把这个自定义规则封装成内部ESLint插件,或者用
eslint-plugin-local这类工具直接在项目中引入 - 在monorepo的根ESLint配置或各个包的配置中启用该规则,确保所有包的index文件都被检查
内容的提问来源于stack exchange,提问作者Tuti
相关产品推荐
相关产品推荐

