vconsole助力实现在线代码编辑调试

概述

前面有文章monaco-editor做自己的代码测试工具 ,本文书接前文,在代码中加入vconsole工具,可以进行代码调试、查看网络、查看元素等。

效果

demo.png

vconsole简介

vconsole是一个轻量、可拓展、针对手机网页的前端开发者调试面板。跟框架无关的,可以在 Vue、React 或其他任何框架中使用。具有如下功能特性:

  • 日志(Logs): console.log|info|error|…
  • 网络(Network): XMLHttpRequest, Fetch, sendBeacon
  • 节点(Element): HTML 节点树
  • 存储(Storage): Cookies, LocalStorage, SessionStorage
  • 手动执行 JS 命令行
  • 自定义插件

实现

1. 编辑器组件

编辑器的实现前面的文章有介绍过,本文在此基础上做了优化,实现代码如下:

<template>
  <div class="editor-title">
    {{ editorTitle }}
  </div>
  <div class="editor-content" :id="`${language}Editor`"></div>
</template>

<script>
import * as monaco from "monaco-editor";
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';
import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';
import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';

self.MonacoEnvironment = {
  getWorker(_, label) {
    if (label === 'json') {
      return new jsonWorker();
    }
    if (label === 'css' || label === 'scss' || label === 'less') {
      return new cssWorker();
    }
    if (label === 'html' || label === 'handlebars' || label === 'razor') {
      return new htmlWorker();
    }
    if (label === 'typescript' || label === 'javascript') {
      return new tsWorker();
    }
    return new editorWorker();
  },
};

let editorInstance = {}

export default {
  computed: {
    editorTitle() {
      return this.title || this.language
    }
  },
  mounted() {
    this.initEditor()
  },
  props: {
    title: {
      type: String,
      default: ''
    },
    language: {
      type: String,
      default: ''
    },
    value: {
      type: String,
      default: ''
    }
  },
  methods: {
    initEditor() {
      const dom = document.getElementById(`${this.language}Editor`)
      editorInstance[this.language] = monaco.editor.create(dom, {
        value: this.value,
        theme: "vs-dark",
        language: this.language,
        fontSize: 14
      });
    },
    getCode() {
      return editorInstance[this.language]?.getValue() || ''
    },
  }
}
</script>

<style scoped lang="scss">
$height: 2rem;

.editor-title {
  height: $height;
  line-height: $height;
  background-color: #003f8f;
  color: #fff;
  padding: 0 0.5rem;
  font-size: 1rem;
  font-weight: bold;
}

.editor-content {
  height: calc(100% - #{$height});
  width: 100%;
}
</style>

注意:在实现编辑器组件的时候,发现在data中定义编辑器实例在调用getValue()的时候会出现卡死的现象,但是如果定义一个变量的话,获取到的值是最后一个编辑器的值。

2. 引用组件,实现

代码的运行预览通过iframe实现,引用组件实现的完整代码如下:

<template>
  <div class="editor-content">
    <button class="tools-button" @click="runCode">运行</button>
    <div class="editor">
      <Editor language="html" ref="htmlEditor"></Editor>
    </div>
    <div class="editor">
      <Editor language="css" ref="cssEditor"></Editor>
    </div>
    <div class="editor">
      <Editor language="javascript" ref="jsEditor"></Editor>
    </div>
  </div>
  <iframe id="preview" frameborder="0" class="preview-content"></iframe>
</template>

<script>
import Editor from './components/Editor.vue'

export default {
  components: {
    Editor
  },
  mounted() {
    this.runCode()
  },
  methods: {
    runCode() {
      const htmlCode = this.$refs.htmlEditor.getCode()
      const cssCode = this.$refs.cssEditor.getCode()
      const jsCode = this.$refs.jsEditor.getCode()

      const srcdoc = `
        <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <title>Document</title>
              <style>
                  html,
                  body {
                      height: 100%;
                      margin: 0;
                      padding: 0;
                  }
                  .container {
                      height: calc(100% - 15rem);
                  }
                  .console {
                      height: 15rem;
                  }
                  .vc-mask {
                      display: none !important;
                  }
                  .vc-panel {
                      left: auto;
                      bottom: auto !important;
                      height: 100%;
                      width: 100%;
                  }
                  ${cssCode}
              </style>
              <script src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"><\/script>
          </head>
          <body>
              <div class="container">
                ${htmlCode}
              </div>
              <div class="console" id="console"></div>
              <script>
                  // 创建调试器
                  const target = document.getElementById('console')
                  const vConsole = new window.VConsole({
                      defaultPlugins: ['network', 'element', 'storage'],
                      target
                  });
                  setTimeout(() => {
                      vConsole.hideSwitch();
                      vConsole.show()
                  }, 100) 
                  ${jsCode}
              <\/script>
          </body>
        </html>`
      console.log({
        htmlCode,
        cssCode,
        jsCode
      })
      const preview = document.getElementById('preview')
      preview.setAttribute("srcdoc", srcdoc);
    }
  }
}
</script>

<style lang="scss">
.editor-content, .preview-content {
  height: 100%;
  width: 50%;
  float: left;
  position: relative;
  .editor {
    height: calc(100% / 3)
  }
  .tools-button {
    position: absolute;
    right: 5px;
    top: 3px;
    z-index: 100;
  }
}
</style>

参考引用

  • monaco-editor做自己的代码测试工具 (文章地址:http://t.csdnimg.cn/R0Qyo)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/516031.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

轮播图实现

基于html、js实现网页中常见的轮播图 html: <div id"box"><img src"./images/1.jpg" alt""><img src"./images/2.jpg" alt""><img src"./images/3.jpg" alt""><img src&q…

Minikube本地搭建单节点Kubernetes集群

1、什么是 Minikube Minikube 是一个开源工具&#xff0c;旨在为开发者提供一种便捷的方式在本地环境中搭建单节点的 Kubernetes 集群。它主要用于开发、测试和学习 Kubernetes 应用程序&#xff0c;无需依赖大型的硬件资源或复杂的多节点集群配置。minikube 使用轻量级虚拟化技…

CountDownTimer 倒计时不准确问题解决

前言 最近笔者在实现一共和倒计时有关的功能&#xff0c;使用CountDownTimer实现。然而&#xff0c;在测试的时候发现&#xff0c;倒计时经常发现跳秒、不出现1的情况&#xff0c;因此对这方面进行了一些了解。本文准备介绍一下CountDownTimer倒计时不准确的原因&#xff0c;以…

【进阶六】Python实现SDVRPTW常见求解算法——遗传算法(GA)

基于python语言&#xff0c;采用经典遗传算法&#xff08;GA&#xff09;对 带硬时间窗的需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. 代码片段参…

【哈希表专题】(1. 两数之和 面试题 01.02. 判定是否互为字符重排 217. 存在重复元素 219. 存在重复元素 II 49. 字母异位词分组)

文章目录 哈希表1. 两数之和面试题 01.02. 判定是否互为字符重排217. 存在重复元素219. 存在重复元素 II49. 字母异位词分组 哈希表 哈希表是什么&#xff1a;存储数据的容器 作用&#xff1a;快速查找某个元素。O(1) 当我们需要频繁的查找某一个数的时候&#xff0c;可以使…

YOLO火灾烟雾检测数据集:20000多张,yolo标注完整

YOLO火灾烟雾检测数据集&#xff1a;一共20859张图像&#xff0c;yolo标注完整&#xff0c;部分图像应用增强 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c;实验等 需要此数据集或其他任何数据集请私信

蓝桥杯备考2

P8839 [传智杯 #4 初赛] 组原成绩 题目描述 花栗鼠科技大学&#xff08;Hualishu University of Science and Technology, HUST&#xff09;的计算机组成原理快要出分了。你现在需要计算你的组原成绩如何构成。 具体来说&#xff0c;组原成绩分为三部分&#xff0c;分别是平…

算法学习系列(四十六):迭代加深、双向DFS

目录 引言概念一、加成序列二、送礼物 引言 本文主要讲了&#xff0c; D F S DFS DFS 的另外两种优化&#xff0c;分别是迭代加深和双向 D F S DFS DFS &#xff0c;思路还是非常清晰明了的&#xff0c;只要会写 D F S DFS DFS 那么这些剪枝和优化其实还是非常的容易的&…

多线程学习-线程安全

目录 1.多线程可能会造成的安全问题 2. static共享变量 3.同步代码块 4.同步方法 5.使用Lock手动加锁和解锁 6.死锁 1.多线程可能会造成的安全问题 场景&#xff1a;三个窗口同时售卖100张电影票&#xff0c;使用线程模拟。 public class MyThread extends Thread{//tic…

AI结合机器人的入门级仿真环境有哪些?

由于使用真实的机器人开发和测试应用程序既昂贵又费时&#xff0c;因此仿真已成为机器人应用程序开发中越来越重要的部分。在部署到机器人之前在仿真中验证应用程序可以通过尽早发现潜在问题来缩短迭代时间。通过模拟&#xff0c;还可以更轻松地测试在现实世界中可能过于危险的…

Linux文件搜索工具(gnome-search-tool)

opensuse下安装: sudo zypper install gnome-search-tool 操作界面:

【剑指offr--C/C++】JZ59 滑动窗口的最大值

一、题目 二、思路及代码 暴力解法是依次往后滑动一位&#xff0c;然后比较窗口内的值。 我这里考虑&#xff1a;窗口每次往后移动一位&#xff0c;那么如果当前窗口的最大值max在窗口内部&#xff0c;那么再滑动到下一个窗口的时候&#xff0c;窗口内只有最新进来的一个元素没…

解决:CloudCompare中display选择Full screen后无法恢复且无法关闭

问题 在CloudCompare中display选择Full screen进行全屏显示时&#xff0c;软件各按钮失效且软件无法关闭 解决 按下F9键退出全屏模式&#xff0c;笔记本电脑可能需要FnF9同时按下。

算法 - 符号表-下

&#x1f600;前言 推荐从上看到下 算法 - 符号表-上 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 算法 - 符号表查找树1. 插入操作2. 性质 红黑树1. 左旋转2. 右旋转3. 颜色转换4. 插入5. 分析 散列表1. 散列函数2. 拉链法3. 线性探测法3.1 查找3.2 插入3.3 删除3.5 …

中兴天机A31 A31PRO 5G zte A2122H te A2022H 解锁BootLoader root权限 教程magisk,原厂刷机包

zte A2122H P768A02 zte A2022H P875A02 中兴天机A31 A31PRO 5G zte A2122H te A2022H 解锁BootLoader root教程magisk&#xff0c;原厂刷机包 感谢 某大神支持&#xff0c;已经解锁root 刷了面具&#xff1b; 中兴天机A31 A31PRO 5G zte A2122H te A2022H 解锁BootLoad…

Oracle 数据库中的全文搜索

Oracle 数据库中的全文搜索 0. 引言1. 整体流程2. 创建索引2-1. 创建一个简单的表2-2. 创建文本索引2-3. 查看创建的基础表 3. 运行查询3-1. 运行文本查询3-2. CONTAINS 运算符3-3. 混合查询3-4. OR 查询3-5. 通配符3-6. 短语搜索3-7. 模糊搜索&#xff08;Fuzzy searches&…

Francek Chen 的128天创作纪念日

目录 Francek Chen 的128天创作纪念日机缘收获日常成就憧憬 Francek Chen 的128天创作纪念日 Francek Chen 的个人主页 机缘 不知不觉的加入CSDN已有两年时间了&#xff0c;最初我第一次接触CSDN技术社区是在2022年4月的时候&#xff0c;通过学长给我们推荐了几个IT社区平台&a…

代码随想录-力扣刷题-总结笔记02

代码随想录&#xff1a;代码随想录力扣&#xff1a;力扣 (LeetCode) 全球极客挚爱的技术成长平台 代码随想录-力扣刷题-总结笔记01代码随想录-力扣刷题-总结笔记02 目录 01、代码随想录 00、其他 ArrayList转数组 07、二叉树 7.0、递归法 7.1、二叉树的层序遍历模板 7.2…

Lan仿朋友圈系统开源源码 表白墙 打造朋友圈工具 仿朋友圈界面 朋友圈模拟器在线

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买!购买本专栏住如有什么源码需要,可向博主私信,第二天即可发布!博主有几万资源) Lan仿朋友圈系统开源,可用于表白墙等…

STL中各类容器详细介绍

STL介绍 STL&#xff08;Standard Template Library&#xff09;&#xff0c;即标准模板库&#xff0c;是一个具有工业强度的&#xff0c;高效的C程序库。它被容纳于C标准程序库&#xff08;C Standard Library&#xff09;中&#xff0c;是ANSI/ISO C标准中最新的也是极具革命…