You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 15集成Monaco-Editor:SQL Worker与自动补全问题求助

解决Angular 15中Monaco Editor SQL Worker与自动补全问题

1. 补充Webpack配置中的SQL Worker入口

在你的Webpack配置的entry对象中添加SQL Worker的入口项:

const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
entry: {
    app: './index.js',
    'editor.worker': 'monaco-editor/esm/vs/editor/editor.worker.js',
    'json.worker': 'monaco-editor/esm/vs/language/json/json.worker',
    'css.worker': 'monaco-editor/esm/vs/language/css/css.worker',
    'html.worker': 'monaco-editor/esm/vs/language/html/html.worker',
    'ts.worker': 'monaco-editor/esm/vs/language/typescript/ts.worker',
    // 新增SQL Worker入口
    'sql.worker': 'monaco-editor/esm/vs/language/sql/sql.worker'
},
output: {
    globalObject: 'self',
    filename: '[name].bundle.js',
    path: path.resolve(__dirname, 'dist')
},
module: {
    rules: [
        {
            test: /\.css$/,
            use: [
                MiniCssExtractPlugin.loader,
                "css-loader"
            ]
        },
        {
            test: /\.ttf$/,
            use: ['file-loader']
        }
    ]
}
};

2. 配置Monaco环境的SQL Worker路径

修改index.js中的MonacoEnvironment,添加SQL标签的Worker路径映射:

self.MonacoEnvironment = {
    getWorkerUrl: function (moduleId, label) {
        if (label === 'json') {
            return './json.worker.bundle.js';
        }
        if (label === 'css' || label === 'scss' || label === 'less') {
            return './css.worker.bundle.js';
        }
        if (label === 'html' || label === 'handlebars' || label === 'razor') {
            return './html.worker.bundle.js';
        }
        if (label === 'typescript' || label === 'javascript') {
            return './ts.worker.bundle.js';
        }
        // 新增SQL Worker路径匹配
        if (label === 'sql') {
            return './sql.worker.bundle.js';
        }
        return './editor.worker.bundle.js';
    }
};

3. 确保Angular组件中SQL语言正确初始化

在Angular组件的导入部分,显式引入Monaco的SQL语言贡献模块:

import { AfterViewInit, Component } from '@angular/core';
import * as monaco from 'monaco-editor';
// 引入SQL语言支持模块
import 'monaco-editor/esm/vs/language/sql/sql.contribution';
import { SqlAutocompleteService } from './services/autocomplete/autocomplete.service';

editor: monaco.editor.IStandaloneCodeEditor;

constructor(
private autocompleteService: SqlAutocompleteService
) {}

ngAfterViewInit() {
const element = document.getElementById('editor');

this.editor = monaco.editor.create(element, {
  value: '',
  language: 'sql',
  theme: 'vs'
});

monaco.languages.registerCompletionItemProvider('sql', {
  provideCompletionItems: (model, position) => {
    return this.autocompleteService.provideCompletionItems(model, position);
     }
    });
  }
}

4. 验证自动补全与SQL Worker协同

自定义自动补全服务可与SQL Worker的语法能力共存,需确保:

  • 补全逻辑返回的CompletionItem符合Monaco规范
  • 若需结合语法上下文,可通过model对象获取编辑器当前语法状态

额外说明(Angular CLI场景)

若使用Angular CLI而非自定义Webpack,需通过@angular-builders/custom-webpack插件整合配置:

  1. 安装插件:npm install @angular-builders/custom-webpack --save-dev
  2. 修改angular.json,将构建器替换为custom-webpack并指定自定义Webpack配置文件路径

内容的提问来源于stack exchange,提问作者Hanna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 10:20:39