vue3+vite+pnpm项目 使用monaco-editor常见问题

文章目录

    • 一、使用步骤
      • [1.1 安装插件](#1.1 安装插件)
      • [1.2 配置 vite.config.js](#1.2 配置 vite.config.js)
      • [1.3 封装 json-editor 组件](#1.3 封装 json-editor 组件)
      • [1.4 使用 json-editor 组件](#1.4 使用 json-editor 组件)
    • 二、遇到报错
      • [2.1 `TypeError: Cannot read properties of undefined (reading 'toUrl')`](#2.1 TypeError: Cannot read properties of undefined (reading 'toUrl'))
      • [2.2 `Cannot read properties of undefined (reading 'languageWorkers')`](#2.2 Cannot read properties of undefined (reading 'languageWorkers'))
    • 参考地址

一、使用步骤

Monaco Editor API

1.1 安装插件

shell 复制代码
pnpm install monaco-editor --save
pnpm install monaco-editor-webpack-plugin --save 
pnpm install --save-dev vite-plugin-monaco-editor

1.2 配置 vite.config.js

js 复制代码
import monacoEditorPlugin from 'vite-plugin-monaco-editor';

export default defineConfig({
	...
	 plugins: [
        monacoEditorPlugin({}),
    ],
	...
})

1.3 封装 json-editor 组件

html 复制代码
/* 模块名称:json-editor */
<template>
  <div ref="monacoDom" class="json-editor"></div>
</template>
<script lang="ts" setup>
import beautify from 'js-beautify'
import * as monaco from 'monaco-editor';

const props = defineProps({
  modelValue: {
    type: String,
    default: ''
  },
  readOnly: {
    type: Boolean,
    default: false,
  },
  config: {
    type: Object,
    default() {
      return {};
    }
  }
});
const emits = defineEmits(['update:modelValue', 'change', 'ready'])
const monacoDom: Ref<HTMLElement | null> = ref(null);
let monacoInstance: monaco.editor.IStandaloneCodeEditor | null = null;

watch(() => props.modelValue, (newValue) => {
  const value = monacoInstance?.getValue();
  if (newValue !== value) {
    monacoInstance?.setValue(props.modelValue)
  }
})
watch(() => props.readOnly, (readOnly) => {
  monacoInstance?.updateOptions({
    readOnly,
  });
})
onMounted(() => {
  monaco.languages.json.jsonDefaults.setDiagnosticsOptions({
    allowComments: true,
    validate: true,
    trailingCommas: 'ignore',
    schemaValidation: 'warning'
  })
  monaco.languages.json.jsonDefaults.setModeConfiguration({
    completionItems: false,
    tokens: true,
    colors: true,
    foldingRanges: true,
    diagnostics: true,
  })
  monacoInstance = monaco.editor.create(monacoDom.value as HTMLElement, {
    value: props.modelValue,
    language: 'json',
    automaticLayout: true,
    parameterHints: {
      enabled: true
    },
    minimap: {
      enabled: false,
    },
    wrappingStrategy: 'advanced',
    scrollBeyondLastLine: false,
    overviewRulerLanes: 0,
    scrollbar: {
      alwaysConsumeMouseWheel: false
    },
    hover: {
      enabled: true,
      above: false,
    },
    renderLineHighlight: 'none',
    fontSize: 14,
    readOnly: props.readOnly,
    ...props.config
  })
  monacoInstance.onDidChangeModelContent(() => {
    emits('update:modelValue', monacoInstance?.getValue())
    emits('change', monacoInstance?.getValue())
  })
  emits('ready')
})
onActivated(() => {
  monacoInstance?.focus()
})
onBeforeUnmount(() => {
  monacoInstance?.dispose();
})
const format = () => {
  const formatStr = beautify(props.modelValue, { indent_size: 4 });
  monacoInstance?.setValue(formatStr)
}
const focus = () => {
  monacoInstance?.focus()
}
defineExpose({
  format,
  focus
});
</script>
<style lang="scss">
.json-editor {
  width: 100%;
  height: 100%;
}
</style>

1.4 使用 json-editor 组件

html 复制代码
<template>
  <json-editor
    ref="jsonComponents"
    :model-value="strJson"
    @update:model-value="handleChangeResponseJson"
  />
</template>
<script lang="ts" setup>
import JsonEditor from '../common/json-editor.vue'

const jsonComponents: Ref<null | { format: () => void }[]> = ref(null)
const strJson = ref('')

//更改返回json数据
const handleChangeResponseJson = (value: string) => {
 // 返回内容值,根据业务增加后面的逻辑
}
</script>

二、遇到报错

2.1 TypeError: Cannot read properties of undefined (reading 'toUrl')

出现上面的报错的原因是只安装了 monaco-editor 插件,未对模块加载配置,需安装对应的解析器 monaco-editor-webpack-pluginvite-plugin-monaco-editor

2.2 Cannot read properties of undefined (reading 'languageWorkers')

出现上面的报错的原因是 在 vite.config.js 配置 monacoEditorPlugin() 时,需要传默认值,monacoEditorPlugin({})

参考地址

https://blog.csdn.net/qq_37772059/article/details/125404159

相关推荐
爱上好庆祝16 小时前
学习js的第五天
前端·css·学习·html·css3·js
C澒16 小时前
IntelliPro 产研协作平台:基于 AI Agent 的低代码智能化配置方案设计与实现
前端·低代码·ai编程
一袋米扛几楼9816 小时前
【Git】规范化协作:详解 GitHub 工作流中的 Issue、Branch 与 Pull Request 最佳实践
前端·git·github·issue
网络点点滴17 小时前
前端与后端的区别与联系
前端
EnCi Zheng17 小时前
M5-markconv自定义CSS样式指南 [特殊字符]
前端·css·python
kyriewen17 小时前
你的网页慢,用户不说直接走——前端性能监控教你“读心术”
前端·性能优化·监控
广州华水科技17 小时前
北斗GNSS变形监测在大坝安全监测中的应用与优势分析
前端
前端老石人17 小时前
前端开发中的 URL 完全指南
开发语言·前端·javascript·css·html
CAE虚拟与现实17 小时前
五一假期闲来无事,来个前段、后端的说明吧
前端·后端·vtk·three.js·前后端
Sarvartha18 小时前
三目运算符
linux·服务器·前端