vue2+MonacoEditor实现在线运行js

介绍

MonacoEditor 是微软出品的一个代码编辑器,像vscode、codesandbox等等都是基于实现的。它能做很多事情,例如:

  • 代码高亮

  • 格式化

  • 定制主题

  • 多语言支持

  • 代码比对

Monaco Editor

目标功能

  • 点击编辑器外部可以向内部插入指定代码块

  • 注册自己的js函数到编辑器

  • 在线运行js,打印输出结果

  • 捕获执行js产生的错误并提示(未实现)

  • 增加自定义的类型声明(未实现)

在这里插入图片描述

样式比较简单,有兴趣的可以自己clone代码研究一下

安装monaco-editor

基于Vue2.x的版本集成monaco-editor,因为是基于webpack打包的,所以还需要安装**monaco-editor-webpack-plugin,**这里需要注意版本,两个包版本不对对应会出现很多问题。👇

monaco-editor-webpack-plugin

建议和我版本保持统一:

在这里插入图片描述

npm install --save-dev monaco-editor monaco-editor-webpack-plugin

引入

配置webpack插件

在这里插入图片描述

这里将它封装到一个组件中,方便复用

<template>
  <div id="container"></div>
</template>

<script>
import * as monaco from 'monaco-editor'
export default {
  name: "MonacoEditor",
  props: {
    option: {
      type: Object,
      default: () => {},
    },
    value: {
      type: String,
      default: "",
    },
  },
  data() {
    return {
      editor: null,
    };
  },
  mounted() {
    this.initEditor();
  },
  methods: {
    // 初始化
    initEditor() {
      this.editor = monaco.editor.create(document.getElementById("container"), {
        value: this.value, // 内容
        language: "javascript", // 使用的语言
        ...this.option,
      });
      // 将编辑器的内容双向绑定到父组件中
      this.editor.onDidChangeModelContent((event) => {
        this.$emit("input", this.editor.getValue(), event);
      });
    }, 
  }
};
</script>

接下来我们将它引入到App中使用一下

<template>
  <div id="app">
    <div class="box">
      <div class="code_block">
        <h3>代码块(点击插入代码块)</h3>
        <div class="list">
          <div class="item" v-for="item in codeList" :key="item.id" @click="insertCode(item.id)">
            {{ item.id }}
          </div>
        </div>
      </div>
      <div class="editor">
        <MonacoEditor ref="editor" style="height: 500px" :option="options" v-model="code"></MonacoEditor>
      </div>
      <div class="debugegr">
        <button @click="execute">执行</button>
        <textarea class="console" :value="output"></textarea>
      </div>
    </div>
  </div>
</template>
<script>
import MonacoEditor from "./components/MonacoEditor.vue";
export default {
  name: "App",
  data() {
    return {
      options: {
        theme: "vs-dark", // 主题
      },
      code: ""
    };
  },
  components: {
    MonacoEditor,
  },
};
</script>

打开界面就可以看到开头如下的效果

在这里插入图片描述

实现功能

插入指定代码块

首先我们再data中加一组数据(这块如果函数较多可写到配置文件中):
在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后增加一个方法,这里其实就是使用自带的api,不用死记硬背

在这里插入图片描述

注册自己的方法到编辑器

这个功能官网有对应的示例,就是调用编辑器的方法monaco.languages.registerCompletionItemProvider, 它接受两个参数,第一个参数是你的语言模型(例如javascript),第二个参数是个对象,具体代码如下

在这里插入图片描述

我这边的业务是这样的,存在一个全局对象global ,数据结构是树形,使用的方式就是

global.xxx.xxx 这样,所以当输入 . 时,就会触发方法,根据输入内容动态获取目标层级的方法

在这里插入图片描述

每一项的结构必须存在 label、kind、insertText

先更新到这,抽空写完。

总结

其实都是api的调用,有其他需求可留言。

  • 25
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
前后端分离是一种开发模式,它将前端和后端的开发分离,前端主要负责用户界面的展示和交互,后端主要负责数据的处理和存储。Vue2、Node.js和MySQL可以结合使用来实现前后端分离。 首先,我们可以使用Vue2作为前端框架,通过它来开发用户界面。Vue2提供了一套响应式的数据绑定和组件化的架构,使得前端开发更加高效和灵活。我们可以使用Vue的官方脚手架工具vue-cli来快速搭建项目的基础结构。 其次,Node.js可以用作后端技术,作为一个基于事件驱动的服务器端JavaScript运行环境,它提供了丰富的模块和工具,使得后端开发更加便捷。我们可以使用Express框架来构建Node.js的后端应用,通过定义路由和处理请求,与前端进行数据的交互。 最后,MySQL是一个开源的关系型数据库管理系统,它可以存储和管理数据。我们可以使用Node.js的mysql库来连接和操作MySQL数据库,通过编写SQL语句来实现数据的增删改查。 在实际开发中,前端通过Ajax或者Axios等工具向后端发送请求,后端接收请求后,通过与MySQL数据库的交互来获取或处理数据,并将结果返回给前端。前端通过Vue2的数据绑定和渲染机制,将后端返回的数据展示在用户界面上。 通过Vue2、Node.js和MySQL的组合,我们可以实现一个完整的前后端分离的应用程序。Vue2提供了优秀的用户界面,Node.js作为后端技术提供了强大的功能和灵活性,MySQL作为数据库管理系统提供了数据的存储和管理。这样的开发模式可以提高开发效率和代码的维护性,同时也能够实现更好的用户体验和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值