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

配置无多余语言支持的轻量Monaco Editor Web组件问题

解决Monaco Editor构建时包含多余语言文件的问题

问题背景

基于Vite的Lit-TS模板配置Monaco Editor为Web组件,要求仅支持一种自定义语言、去除Monaco多余功能,产物通过script标签引入主项目index.html。当前代码结构如下:

主文件 src/rmx-monaco.ts

import {monaco} from "./customMonaco";
// 引入自定义语言支持
import "./mix.contribution.js";

src/customMonaco.ts

import "monaco-editor/esm/vs/editor/browser/viewParts/contentWidgets/contentWidgets.js";
import "monaco-editor/esm/vs/editor/browser/viewParts/lineNumbers/lineNumbers.js";
import "monaco-editor/esm/vs/editor/browser/viewParts/lineNumbers/lineNumbers.css";
import "monaco-editor/esm/vs/editor/browser/viewParts/linesDecorations/linesDecorations.js";
import "monaco-editor/esm/vs/editor/browser/viewParts/linesDecorations/linesDecorations.css";
import * as monaco from "monaco-editor/esm/vs/editor/editor.api.js";
export {monaco};

当前Vite配置

export default defineConfig({
    build: {
        lib: {
            entry: 'src/rmx-monaco.ts',
            formats: ['es']
        },
        rollupOptions: {
            external: /^lit/,
            // output: {
            //     manualChunks: undefined,
            //     inlineDynamicImports: true,
            //     entryFileNames: "[name].js",
            //     // 避免生成vendor.js,禁用缓存哈希
            //     chunkFileNames: "assets/[name].js",
            //     assetFileNames: "rmx-monaco.[ext]",
            // },
        }
    },
    server: {port: 5000}
})

目前构建产物仍包含所有Monaco内置语言文件,计划取消注释output部分生成单个JS文件,需彻底移除多余语言支持。


解决方案

1. 配置Rollup排除内置语言模块

在Vite的rollupOptions中添加external规则,直接排除所有Monaco内置语言相关模块,避免被打包进产物:

export default defineConfig({
    build: {
        lib: {
            entry: 'src/rmx-monaco.ts',
            formats: ['es']
        },
        rollupOptions: {
            external: [/^lit/, /monaco-editor\/esm\/vs\/language\/.*/],
            resolve: {
                // 指定加载条件,优先浏览器ESM模块,避免加载冗余代码
                conditions: ['browser', 'esm']
            },
            output: {
                manualChunks: undefined,
                inlineDynamicImports: true,
                entryFileNames: "[name].js",
                chunkFileNames: "assets/[name].js",
                assetFileNames: "rmx-monaco.[ext]",
            }
        }
    },
    server: {port: 5000}
})

2. 编辑器初始化时禁用默认语言库

在创建Monaco编辑器实例时,添加noLib: true配置,彻底关闭默认语言支持:

// 示例:编辑器初始化代码
monaco.editor.create(document.getElementById('editor-container'), {
    value: '',
    language: 'your-custom-language', // 替换为你的自定义语言ID
    noLib: true // 禁用默认语言库加载
});

3. 检查自定义语言贡献代码

确保mix.contribution.js中没有引入任何Monaco内置语言模块(如vs/language/json/json.contribution等),仅保留自定义语言的注册逻辑,比如:

// 自定义语言注册示例
monaco.languages.register({ id: 'your-custom-language' });
monaco.languages.setMonarchTokensProvider('your-custom-language', {
    // 自定义语言的token规则
});
// 其他自定义语言配置...

4. 优化Tree-Shaking效果

开启Vite生产环境的Tree-Shaking,确保未使用的代码被彻底移除:

export default defineConfig({
    build: {
        // ...其他配置
        minify: 'terser', // Terser提供更彻底的Tree-Shaking支持
        rollupOptions: {
            treeshake: {
                moduleSideEffects: 'no-external',
                propertyReadSideEffects: false,
                tryCatchDeoptimization: false
            }
        }
    }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:24:31