匿名用户

这个人很神秘,什么信息也没有

关闭
Cherry
2025-09-02
点 赞
0
热 度
7
评 论
0

Monaca Editor 不使用默认 CDN

背景

在 nextjs 开发中使用 @monaco-editor/react 实现 编辑器功能

但是它默认使用 cdn 加载 monaco-editor 依赖,这显然不符合生产稳定性的需求

解决方法

官网有介绍到 4.4.x 版本之后版本使用以下方式

官方文档传送

import * as monaco from 'monaco-editor';
import { loader } from '@monaco-editor/react';

loader.config({ monaco });

遇到的问题

在 nextjs 中虽然使用了 use client 但是运行依然会报错 window 对象不存在,因为在服务端运行依然会默认加载一次此组件

解决方法

  • 将 Editor 封装为单组组件

  • 使用 nextjs 的动态导入,同时禁用 ssr

具体实现

Editor 组件封装

"use client";
import { Editor, loader, type EditorProps } from "@monaco-editor/react";
import * as monaco from "monaco-editor";
loader.config({ monaco: monaco });

/**
 * !!!必须使用动态导入禁用 ssr 引入组件。
 * Example:
 * import dynamic from "next/dynamic";
 * const Editor = dynamic(() => import("@/components/MEditor"), { ssr: false });
 */

export default function MonacoEditor({ ...props }: EditorProps) {
  return (
    <Editor
      height="100%"
      language="yaml"
      theme="vs-dark"
      options={{
        minimap: { enabled: false },
        fontSize: 13,
        lineHeight: 1.4,
        tabSize: 2,
        insertSpaces: true,
        wordWrap: "on",
        automaticLayout: true,
        scrollBeyondLastLine: false,
        renderWhitespace: "selection",
        folding: true,
        foldingStrategy: "indentation",
        showFoldingControls: "always",
      }}
      {...props}
    />
  );
}

组件使用

import dynamic from "next/dynamic";
const Editor = dynamic(() => import("@/components/MEditor"), { ssr: false });

export default function Home() {
  return <Editor />;
}

踩坑记录

monaco-editor-webpack-plugin 使用此插件,配置后加载文件名称似乎有问题,而且也并没有完全解决 cdn 问题

虽然文档有说可能需要此插件的配置,但实际使用并不需要此插件依然可以解决。


人心中的成见就像一座大山,任你怎么努力,也休想搬动! 我单枪匹马的走到现在,任何人都不是我的靠山,苦我吃了,委屈我咽了,伤痕累累走到现在,流言蜚语又能奈我何?

Cherry

intj 建筑师

站长

不具版权性
不具时效性

文章内容不具时效性。若文章内容有错误之处,请您批评指正。

目录

欢迎来到 Cherry 的站点,为您导航全站动态

4 文章数
4 分类数
1 评论数
6标签数
最近评论