寻求可统计导出标识符数量的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
相关产品推荐
相关产品推荐

