能否在ESLint中使用ts-morph并共享其project对象?
在ESLint中共享ts-morph Project对象的实现方案
可以实现,核心思路是利用ESLint的共享上下文机制或自定义插件的初始化逻辑,全局复用ts-morph的Project实例,避免重复加载项目。以下是具体实现步骤:
1. 自定义插件内全局初始化复用
在你的ESLint插件入口文件中,提前初始化ts-morph的Project对象,然后将其挂载到规则的上下文对象中,供所有规则直接使用:
// eslint-plugin-your-plugin/index.js const { Project } = require('ts-morph'); // 全局初始化ts-morph项目,仅执行一次 const tsMorphProject = new Project({ tsConfigFilePath: './tsconfig.json', // 根据项目需求配置其他参数 }); module.exports = { rules: { 'custom-rule-1': { create(context) { // 将实例挂载到context自定义属性 context.tsMorphProject = tsMorphProject; return { Program(node) { // 直接复用全局实例 const sourceFile = tsMorphProject.getSourceFile(context.getFilename()); // 执行全项目类型检查或函数调用分析 } }; } }, 'custom-rule-2': { create(context) { // 同样可访问全局实例 const project = context.tsMorphProject; return { // 规则逻辑 }; } } } };
2. 跨插件共享实例(通过ESLint配置)
如果需要在多个独立插件间共享ts-morph实例,可以通过ESLint配置文件的settings字段传递初始化好的Project对象:
// .eslintrc.js const { Project } = require('ts-morph'); const tsMorphProject = new Project({ tsConfigFilePath: './tsconfig.json' }); module.exports = { settings: { tsMorphProject: tsMorphProject }, plugins: ['your-plugin', 'third-party-plugin'], rules: { 'your-plugin/custom-rule-1': 'error', 'third-party-plugin/some-rule': 'error' } };
之后在任意插件的规则中,通过context.settings.tsMorphProject访问实例:
// 第三方插件的规则实现 create(context) { const project = context.settings.tsMorphProject; // 使用实例完成分析操作 }
3. 关键注意事项
- 避免重复初始化:务必保证ts-morph的Project实例只创建一次,不要在规则的
create函数内重复初始化,否则会失去性能优势。 - 文件同步:ESLint执行过程中若有文件修改,需调用
tsMorphProject.refresh()同步文件状态,确保分析结果准确。 - 类型支持:用TypeScript开发插件时,可扩展ESLint的
RuleContext类型,添加tsMorphProject属性以获得类型提示。
内容的提问来源于stack exchange,提问作者Jon Sud
相关产品推荐
相关产品推荐

