You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Monaco Editor@0.55.1在Angular项目中配置node_modules类型智能提示的方案咨询

Monaco Editor@0.55.1在Angular项目中配置node_modules类型智能提示的方案咨询

嗨,我来帮你搞定这个Monaco升级后的类型提示配置问题~

问题原因

你提到的addExtraLib方法在v0.55.1失效,核心原因是这个版本开始把TypeScript的语言服务移到了Web Worker进程中,主线程直接调用的配置不会自动同步到独立的worker里,所以之前的写法就不生效了。

解决方案步骤

结合你现有的Angular代码,我们可以通过以下步骤配置node_modules的智能提示:

1. 准备类型定义文件

把需要的node_modules类型文件(比如rxjs/index.d.ts)复制到Angular项目的assets目录下,比如创建assets/typings/rxjs/文件夹存放相关d.ts文件。

2. 加载并添加额外类型库

在组件中通过Angular的HttpClient加载类型文件,然后调用addExtraLib注册到Monaco的TypeScript配置中(一定要在创建编辑器之前执行,确保配置同步到worker):

修改你的app.ts

import { HttpClient } from '@angular/common/http';
import { Component, ElementRef, OnInit, ViewChild, ChangeDetectionStrategy } from '@angular/core';
import * as monaco from 'monaco-editor';

@Component({
  selector: 'app-root',
  template: `<div #editor class="editor"></div>`,
  styles: [`.editor{width:100%;height:100vh}`],
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AppComponent implements OnInit {
  @ViewChild('editor', { static: true }) editorEl!: ElementRef<HTMLDivElement>

  constructor(private http: HttpClient) {}

  async ngOnInit(): Promise<void> {
    // 1. 加载rxjs的类型定义文件
    const rxjsIndexContent = await this.http.get(
      '/assets/typings/rxjs/index.d.ts',
      { responseType: 'text' }
    ).toPromise();

    // 2. 注册额外类型库,URI要和node_modules的路径对应,确保导入解析正常
    monaco.languages.typescript.typescriptDefaults.addExtraLib(
      rxjsIndexContent,
      'file:///node_modules/rxjs/index.d.ts'
    );

    // 3. 配置TypeScript编译选项,帮助Monaco定位模块
    monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
      target: monaco.languages.typescript.ScriptTarget.ES2020,
      module: monaco.languages.typescript.ModuleKind.CommonJS,
      baseUrl: 'file:///',
      paths: {
        'rxjs': ['node_modules/rxjs/index.d.ts'],
        'rxjs/*': ['node_modules/rxjs/*']
      }
    });

    // 4. 创建编辑器模型和实例
    const editorModel = monaco.editor.createModel(
      `import { Observable } from 'rxjs';\nconst testObs: Observable<string> = new Observable();`,
      'typescript',
      monaco.Uri.parse('file:///main.ts')
    );

    const editor = monaco.editor.create(this.editorEl.nativeElement, {
      model: editorModel,
      language: 'typescript',
      theme: 'vs-dark',
    });
  }
}

3. 确保Worker配置正确

你现有的main.ts中的MonacoEnvironment配置是正确的,只要确保worker文件的路径和实际部署的一致即可,无需修改。

批量添加类型的优化

如果需要添加多个node_modules的类型,手动加载每个文件会很繁琐,你可以:

  • 在Angular构建时,通过angular.jsonassets配置,批量复制需要的d.ts文件到输出目录
  • 编写一个工具函数,批量加载目录下的所有类型文件并调用addExtraLib

这样就能让Monaco编辑器正确识别你指定的node_modules模块,提供完整的智能提示啦~

备注:内容来源于stack exchange,提问作者Muhamed Karajic

火山引擎 最新活动