配置无多余语言支持的轻量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
相关产品推荐
相关产品推荐

