@monaco-editor/loader实现Monaco Editor编辑器

背景

在此前项目中使用monaco editor是直接安装依赖,由于项目起的比较早使用的是vue2,能升级的已经全部升级。 在此情况下monaco只能安装到0.30.1的版本,此版本还是有一些特殊字符(U+00a0,他是一个无间断空格)不能够显示,而要求应显示如下截图(有一个小矩形框,鼠标悬浮时显示详细信息)

我查阅版本后,发现在0.31之后的版本有完善,于是我更新了monaco,更新完成之后也有了兼容性的问题。具体情况如下截图

这个主要是新的包里用了可选链操作符( ?. )空值合并操作符( ?? )空赋值运算符(??=)等新的语法,这个问题也好解决,我使用了如下bable转了一下

less 复制代码
@babel/plugin-proposal-nullish-coalescing-operator
@babel/plugin-proposal-optional-chaining

使用插件时则在vue.config.js中配置一下即可

js 复制代码
// 添加 monaco-editor 的 babel 配置
config.module
  .rule('monaco')
  .test(/\.m?js$/)
  .include
  .add(/node_modules\/monaco-editor/)
  .end()
  .use('babel-loader')
  .loader('babel-loader')
  .options({
    plugins: [
      '@babel/plugin-proposal-nullish-coalescing-operator',
      '@babel/plugin-proposal-optional-chaining'
    ]
  })
  .end()

到此时我的问题已经全部解决完成,我在stage环境也完成了开发自测,非常丝滑没有任何问题,然后走了提交流程,测试同事开始进行测试,在qa环境以及uat环境都没有任何问题,坏就是坏在了上到生产环境的时候报错。

由于是生产环境,所以不能长时间的在上面观察分析,只能紧急把这个monaco版本降下来,我后续猜测可能是因为生产做了混淆或者是多个包打在一起可能导致打包文件出错,想着把这个monaco单独分块进行打包会不会能行,当然我也没有验证,而是用了@monaco-editor/loader来解决。

介绍

首先是文档,我这里放了两个一个是 github,另一个是 npmjs,可直接查看文档,我整理了一下意思大概如下

通过其加载器脚本配置和下载 monaco 源,无需使用 webpack(或任何其他模块捆绑器)的配置文件,他的工作原理也非常的直接,就是 Monaco 编辑器提供了一个名为loader的脚本,该脚本本身提供了下载 monaco 源的工具。该库在底层处理配置和加载部分,并为我们提供了一个易于使用的 API 来与之交互。

使用

文档中也有非常详细的说明,首先就是进行安装

sql 复制代码
npm install @monaco-editor/loader
或者使用
yarn add @monaco-editor/loader

用法

js 复制代码
import loader from '@monaco-editor/loader';

loader.init().then(monaco => {
  monaco.editor.create(/* editor container, e.g. document.body */, {
    value: '// some comment',
    language: 'javascript',
  });
});

上面是官方提供的方法直接使用,一般情况下我们都需要做一些自己的配置,因为默认情况下monaco的所有资源都是从cdn上下载,可能在使用当中会有卡顿加载超时等情况从而导致失败

js 复制代码
import loader from '@monaco-editor/loader';

// you can change the source of the monaco files
loader.config({ paths: { vs: '...' } });

// you can configure the locales
loader.config({ 'vs/nls': { availableLanguages: { '*': 'de' } } });

// or
loader.config({
  paths: {
    vs: '...',
  },
  'vs/nls' : {
    availableLanguages: {
      '*': 'de',
    },
  },
});

loader.init().then(monaco => { /* ... */ });

官方提供的配置是这两个方法,在上面的配置中我们主要使用的是配置paths,即我的项目中使用如下,因为我之前的项目的已经写了了之前的所有功能,目前我只需要把实例加载好就可以了

js 复制代码
import loader from '@monaco-editor/loader'
export default {
    data() {
        return {
          monacoInstance: null
        }
    },
    async mounted() {
        loader.config({
          paths: {
            vs: '/static/monaco-editor/min/vs'
          }
        })
        this.monacoInstance = await loader.init()
   }
}

如上我是把monaco-editor下载下来直接放到项目中,并对loader的源进行指向。可以到官网下载自己喜欢的版本,通过loader初始化实例后就可能通过monacoInstance进行创建编辑器,具体方法我之前有写了一篇关于vue2使用moncao editor的文章

相关推荐
【赫兹威客】浩哥12 小时前
【赫兹威客】框架模板-前端bat脚本部署教程
前端·vue.js
爱上妖精的尾巴12 小时前
7-13 WPS JS宏 this 用构造函数自定义类-2,调用内部对象必须用this
开发语言·javascript·wps·jsa
一 乐12 小时前
学生宿舍管理|基于springboot + vue学生宿舍管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·助农电商系统
bin915312 小时前
(文后附完整代码)html+css+javascript 弓箭射击游戏项目分析
前端·javascript·css·游戏·html·前端开发
qq_4061761413 小时前
深入剖析JS中的XSS与CSRF漏洞:原理、攻击与防御全指南
服务器·开发语言·前端·javascript
yanyu-yaya13 小时前
速学兼复习之vue3章节4
前端·vue.js·前端框架
Mr-Wanter13 小时前
vue 数据反显时数字/字母不换行导致的样式问题
前端·javascript·vue.js
qq_124987075313 小时前
基于Java的心理测试系统的设计与实现(源码+论文+部署+安装)
java·开发语言·vue.js·spring boot·计算机毕设·计算机毕业设计
daols8814 小时前
vue表格 vxe-table 如何实现键盘导航时,按回车健向右移动,并到最后一行时按回车自动新增一行
vue.js·vxe-table
m0_7408596214 小时前
解决uniapp跳转页面警告:Extraneous non-props attributes ...
前端·javascript·uni-app