You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在Lint规则可强制按目录层级规范导出方式?

适配你需求的ESLint规则方案

目前没有完全匹配你需求的现成ESLint规则,但可以通过自定义规则或者组合现有规则的方式实现,以下是具体可行的方案:

一、现有规则的部分适配(仅作辅助)

现有ESLint插件里没有能精准区分「同目录文件显式导出」和「嵌套文件夹批量导出」的规则,但可以用以下规则做基础约束:

  • import/no-default-export:强制不使用默认导出,避免非预期的导出内容
  • import/export:检查导出语法的合法性,避免无效导出

但这些规则无法满足你核心的场景区分需求,还是得靠自定义规则实现精准管控。

二、自定义ESLint规则(精准匹配需求)

这是最贴合你要求的方式,规则核心逻辑针对index.js/index.ts文件,区分两种导出场景做约束:

  1. 针对同目录文件的导出:必须用export { xxx } from './xxx'的显式命名导出,禁止export *
  2. 针对嵌套文件夹的导出:必须用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中落地执行

  1. 可以把这个自定义规则封装成内部ESLint插件,或者用eslint-plugin-local这类工具直接在项目中引入
  2. 在monorepo的根ESLint配置或各个包的配置中启用该规则,确保所有包的index文件都被检查

内容的提问来源于stack exchange,提问作者Tuti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:54:27