Skip to content

Commit 63fb428

Browse files
author
winjo
committed
fix: 修复组件非首次加载变慢的问题
1 parent e409642 commit 63fb428

3 files changed

Lines changed: 37 additions & 5 deletions

File tree

packages/alex/src/api/createApp.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,10 @@ export function createApp({ appConfig, runtimeConfig }: IConfig): IAppInstance {
144144
if (codeEditorService) {
145145
codeEditorService._value = null;
146146
}
147-
(monaco as any).services.StaticServices.modeService._value = null;
147+
const modeService = (monaco as any).services.StaticServices.modeService;
148+
// 需要把 LanguageRegistry dispose,否则二次加载会重复触发事件,导致加载越来越慢
149+
modeService._value._registry.dispose();
150+
modeService._value = null;
148151
// @ts-ignore
149152
// common-di 通过参数实例化无法自动 dispose
150153
app.injector.get(WorkerExtensionService)?.protocol?._locals?.forEach((instance) => {

packages/alex/src/api/createEditor.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,10 @@ export function createEditor({ appConfig, runtimeConfig }: IConfig): IAppInstanc
128128
if (codeEditorService) {
129129
codeEditorService._value = null;
130130
}
131-
(monaco as any).services.StaticServices.modeService._value = null;
131+
const modeService = (monaco as any).services.StaticServices.modeService;
132+
// 需要把 LanguageRegistry dispose,否则二次加载会重复触发事件,导致加载越来越慢
133+
modeService._value._registry.dispose();
134+
modeService._value = null;
132135
app.injector.disposeAll();
133136
};
134137

packages/core/src/client/textmate-language-grammar/language-grammar.service.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Autowired, Injectable } from '@ali/common-di';
2-
import { Disposable, Deferred, Emitter, Event, URI } from '@ali/ide-core-common';
2+
import { MonacoContribution, ClientAppContribution } from '@ali/ide-core-browser';
3+
import { Disposable, Deferred, Emitter, Event, URI, Domain } from '@ali/ide-core-common';
34
import { TextmateService } from '@ali/ide-monaco/lib/browser/textmate.service';
45
import { LanguagesContribution, GrammarsContribution } from '@ali/ide-monaco';
56

@@ -12,11 +13,17 @@ class SingleEventEmitter<T> extends Emitter<T> {
1213
}
1314
}
1415

15-
@Injectable()
16-
export class LanguageGrammarRegistrationService extends Disposable {
16+
@Domain(ClientAppContribution, MonacoContribution)
17+
export class LanguageGrammarRegistrationService
18+
extends Disposable
19+
implements ClientAppContribution, MonacoContribution {
1720
static languageEmitter = new SingleEventEmitter<LanguagesContribution>();
1821
static grammarEmitter = new SingleEventEmitter<GrammarsContribution>();
1922

23+
private _monacoLoaded = new Deferred<void>();
24+
25+
private _ModesRegistry: { _languages: any[] } | null = null;
26+
2027
@Autowired(TextmateService)
2128
private readonly textMateService: TextmateService;
2229

@@ -25,6 +32,21 @@ export class LanguageGrammarRegistrationService extends Disposable {
2532
return this.languageDidRegisterDeferred.promise;
2633
}
2734

35+
async initialize() {
36+
await this._monacoLoaded.promise;
37+
const vsRequire: any = (window as any).amdLoader.require;
38+
return new Promise<void>((resolve) => {
39+
vsRequire(['vs/editor/common/modes/modesRegistry'], ({ ModesRegistry }) => {
40+
this._ModesRegistry = ModesRegistry;
41+
resolve();
42+
});
43+
});
44+
}
45+
46+
onMonacoLoaded() {
47+
this._monacoLoaded.resolve();
48+
}
49+
2850
async initRegisterLanguageAndGrammar() {
2951
// 没啥作用,只是确保传参类型正确
3052
const uri = new URI();
@@ -51,6 +73,10 @@ export class LanguageGrammarRegistrationService extends Disposable {
5173

5274
dispose() {
5375
this.clear();
76+
// 清除缓存的语言,减少 monaco 内部的遍历
77+
if (this._ModesRegistry) {
78+
this._ModesRegistry._languages = [];
79+
}
5480
}
5581
}
5682

0 commit comments

Comments
 (0)