MonacoEditor CDN错误记录

2,127 阅读1分钟

背景

引入 @monaco-editor/react来实现大文本输入和代码编辑。

起因

在银行内网部署页面报错。

问题追踪

看到有一个网络请求失败,想到可能是 monaco-editor用到了某些网络资源,然后就去找node_modules,发现 monaco-editor本体实际是使用 loader.js加载的,然后 loader.js又默认使用了 CDN,所以导致整个组件都不好用。

解决过程

既然知道是资源请求出错了,那么就自己将资源放置到本地,然后请求就行了呗。

但是如何请求本地资源比较棘手,最简单的是直接去node_modules去修改地址,但是没办法同步到同事那里,一点都不优雅。

如果需要修改依赖的话,patch-packages刚好可以干这个事情,相对于直接修改,这个方法更好点。

然后通过翻官方文档找到其实插件支持修改路径的。

为啥官方要使用CDN:

解决方法

方法一

让部署的地方将CDN地址加入白名单(不现实)。

方法二

将资源放到本地,插件支持覆盖 loader 资源地址,去请求本地。我是直接放到了public下。

// 切换插件使用本地资源
loader.config({
  paths: { vs: `${PATH_PERFIX}/MonacoEditorSource/vs` }
});
// 附赠 MonacoEditor 封装
import React from 'react';
import type {EditorProps} from '@monaco-editor/react';
import Editor from '@monaco-editor/react';
import { loader } from '@monaco-editor/react';
import styles from './index.less'
import { PATH_PERFIX } from '@/utils/default';

// 切换插件使用本地资源
loader.config({
  paths: { vs: `${PATH_PERFIX}/MonacoEditorSource/vs` }
});


export type MonacoEditorProps = EditorProps

const MonacoEditor: React.FC<MonacoEditorProps> = (props) => (
  <div className={styles.container} style={{height: props.height ?? '300px'}}>
    <Editor
      theme="vs-dark"
      {...props}
      height="100%"
    />
  </div>
)

export default MonacoEditor;