如何高效加载2000+TS文件到Monaco Editor实现快速智能提示?
Monaco Editor 加载2000+ TS文件时智能提示性能优化问题
我尝试在Monaco Editor中从2000+个.ts文件获取智能提示,目前加载模型需要4-5秒,但自动补全提示要10-15秒才会出现,界面持续显示‘Loading...’。

以下是可在Monaco Playground运行的简化代码:
monaco.languages.typescript.javascriptDefaults.setEagerModelSync(true); monaco.languages.typescript.typescriptDefaults.setEagerModelSync(true); monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({ noSemanticValidation: true, noSyntaxValidation: true, noSuggestionDiagnostics: true }); monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({ noSemanticValidation: true, noSyntaxValidation: true, noSuggestionDiagnostics: true }); editor = monaco.editor.create( document.getElementById('container'), { minimap: { enabled: true }, scrollBeyondLastLine: true, // model: null, language: 'typescript', theme: 'vs-dark', value: 'function () {}\n\n' } ); // 模拟2000个.ts文件 for (var fileIdx = 0; fileIdx < 2000; fileIdx++) { for (var fnIdx = 0; fnIdx < 1; fnIdx++) { monaco.editor.createModel(` function test_${fileIdx}_${fnIdx}() {} function fn_${fileIdx}_${fnIdx}() {} function foo_${fileIdx}_${fnIdx}() {} function bar_${fileIdx}_${fnIdx}() {} function out_${fileIdx}_${fnIdx}() {} `, 'typescript' ); } }
我已参考过相关社区讨论,但问题仍未解决,现寻求高效实现该需求的方法。
修改方案1:加载.d.ts文件替代.ts文件
monaco.languages.typescript.javascriptDefaults.setEagerModelSync(false); monaco.languages.typescript.typescriptDefaults.setEagerModelSync(false); monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({ noSemanticValidation: true, noSyntaxValidation: true, noSuggestionDiagnostics: true }); monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({ noSemanticValidation: true, noSyntaxValidation: true, noSuggestionDiagnostics: true }); monaco.languages.typescript.typescriptDefaults.setCompilerOptions({ target: monaco.languages.typescript.ScriptTarget.ES2016, allowNonTsExtensions: true, moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs, module: monaco.languages.typescript.ModuleKind.CommonJS, noEmit: true, typeRoots: ["node_modules/@types"] }); // 场景1:加载2000个各含1个函数声明的.d.ts文件 let extraLibs = [] for (let i = 0; i < 2000; i++) { extraLibs.push( { content: `export declare function next${i}() : string`, filePath: monaco.Uri.file(`/node_modules/@types/external${i}/index.d.ts`).toString(true) } ); } // 场景2:加载1个含2000个函数声明的.d.ts文件 /*let def = '' for (let i = 0; i < 2000; i++) { def = def.concat(`export declare function next${i}() : string\n`); } let extraLibs = [] extraLibs.push( { content: def, filePath: monaco.Uri.file(`/node_modules/@types/external1/index.d.ts`).toString(true) } );*/ monaco.languages.typescript.typescriptDefaults.setExtraLibs(extraLibs); extraLibs.forEach((lib) => monaco.editor.createModel(lib.content, "typescript", monaco.Uri.parse(lib.filePath))) var jsCode = `import * as x from "external1" const tt : string = x.next1();`; monaco.editor.create(document.getElementById("container"), { model: monaco.editor.createModel(jsCode, "typescript", monaco.Uri.file("main.tsx")), });
观察结果
- 加载2000个各含1个函数声明的.d.ts文件时,性能不佳;
- 加载1个包含2000个函数声明的.d.ts文件时,智能提示瞬间出现,即使扩展到20000个函数,性能依然良好。
但我的实际场景中有3000+个TS文件,需要适配该场景的优化方案。
补充:已跟进相关Monaco社区issue讨论。
内容的提问来源于stack exchange,提问作者manikanta
相关产品推荐
相关产品推荐

