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

寻求可统计导出标识符数量的ESLint规则或工具包

统计导出标识符数量的ESLint方案

现有实现思路

目前没有开箱即用的ESLint规则能精确统计所有导出标识符总数,但可以通过两种方式实现近似的需求:

1. 自定义ESLint规则

你可以自己编写一个ESLint规则,核心逻辑分为两部分处理:

  • 针对export {x,y} from '...'或直接导出的export const x = ...:直接统计声明里的标识符数量。
  • 针对export * from '...':可以通过规则配置预先映射路径对应的导出数量,或者给一个符合你项目情况的固定估算值(比如默认按4个算)。
  • 最后把所有统计到的数量相加,和配置的最大值对比,超过则抛出错误。

核心代码片段示例:

module.exports = {
  create(context) {
    const maxExports = context.options[0]?.max || 5;
    let totalExports = 0;

    // 处理具名导出(含重导出)
    context.on('ExportNamedDeclaration', node => {
      totalExports += node.specifiers.length;
    });

    // 处理export *,支持配置路径对应导出数,默认用估算值
    context.on('ExportAllDeclaration', node => {
      const estimated = context.options[0]?.exportAllEstimates?.[node.source.value] || 4;
      totalExports += estimated;
    });

    // 文件解析完成后检查总数
    context.on('Program:exit', () => {
      if (totalExports > maxExports) {
        context.report({
          message: `导出数量超限:${totalExports}/${maxExports}`,
          loc: { start: { line: 1, column: 0 } }
        });
      }
    });
  }
};

2. 结合TypeScript的精确统计工具

如果你的项目用TypeScript,可以用ts-morph写个简单脚本,借助TS类型系统精确统计导出数量:

  • 遍历每个lib的入口文件
  • 用ts-morph获取所有导出符号(包括重导出的)
  • 统计总数,超过阈值则报错

核心脚本片段示例:

import { Project } from 'ts-morph';

const project = new Project();
const maxExports = 5;

// 加载所有lib入口文件
const entryFiles = project.addSourceFilesAtPaths('packages/*/src/index.ts');

entryFiles.forEach(file => {
  const exportCount = file.getExports().length;
  if (exportCount > maxExports) {
    console.error(`文件 ${file.getFilePath()} 导出数量超限:${exportCount}/${maxExports}`);
    process.exitCode = 1;
  }
});

局限性说明

  • 对于第三方包的export *,自定义ESLint规则的估算值可能不准,但可以通过配置手动指定第三方包的导出数;ts-morph能准确解析,但依赖TS类型系统。
  • 动态导出(比如export const [x,y] = ...)需要额外处理,但这类场景在lib入口中通常较少。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:53:12