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插件整合配置:
- 安装插件:
npm install @angular-builders/custom-webpack --save-dev - 修改
angular.json,将构建器替换为custom-webpack并指定自定义Webpack配置文件路径
内容的提问来源于stack exchange,提问作者Hanna
相关产品推荐
相关产品推荐

