首页 > 其他分享 >基于CodeMirror开发在线编辑器时遇到的问题及解决方案

基于CodeMirror开发在线编辑器时遇到的问题及解决方案

时间:2024-05-02 17:33:21浏览次数:29  
标签:codemirror 解决方案 lint json 编辑器 import jsonEditor CodeMirror

需求:实现json在线编辑并支持校验,基于此使用了 CodeMirror在线编辑,jsonlint校验输入数据

// package.json:
  "dependencies": {
    "codemirror": "^5.53.2",
    "core-js": "^3.8.3",
    "jsonlint": "^1.6.3",
    "vue": "^2.6.14"
  },

基础代码:

<template>
  <div class="json-editor">
    <textarea ref="textarea" />
  </div>
</template>

<script>
import CodeMirror from "codemirror";
import "codemirror/addon/lint/lint.css";
import "codemirror/lib/codemirror.css";
import "codemirror/theme/rubyblue.css";
import "codemirror/mode/javascript/javascript";
import "codemirror/addon/lint/lint";
import "codemirror/addon/lint/json-lint";
require('script-loader!jsonlint')
export default {
  name: "JsonEditor", 
  props: ["value"],
  data() {
    return {
      jsonEditor: false,
    };
  },
  watch: {
    value(value) {
      const editorValue = this.jsonEditor.getValue();
      if (value !== editorValue) {
        this.jsonEditor.setValue(JSON.stringify(this.value, null, 2));
      }
    },
  },
  mounted() {
    // CodeMirror.fromTextArea()中第一个参数是DOM元素,而且必须是textarea元素;第二个参数是可选配置项
    this.jsonEditor = CodeMirror.fromTextArea(this.$refs.textarea, {
      lineNumbers: true,
      mode: "application/json",
      gutters: ["CodeMirror-lint-markers"],
      theme: "rubyblue",
      lint: true,
      lineWrapping: true, // 自动换行
      scrollPastEnd: true, // 允许用户将一个编辑器高度的空白区域滚动到编辑器底部的视图
      lineNumbers: true, // 显示左边行号(默认false,即不显示)
      styleActiveLine: true, // 当前行背景高亮
    });

    this.jsonEditor.setValue(JSON.stringify(this.value, null, 2));
    this.jsonEditor.on("change", (cm) => {
      console.log("cm.getValue() :>> ", cm.getValue());
      this.$emit("changed", cm.getValue());
      this.$emit("input", cm.getValue());
    });
  },
  methods: {
    getValue() {
      return this.jsonEditor.getValue();
    },
  },
};
</script>

<style scoped>
.json-editor {
  height: 100%;
  position: relative;
}
.json-editor >>> .CodeMirror {
  height: auto;
  min-height: 300px;
}
.json-editor >>> .CodeMirror-scroll {
  min-height: 300px;
}
.json-editor >>> .cm-s-rubyblue span.cm-string {
  color: #f08047;
}
.addbtn {
  margin-bottom: 15px;
  margin-left: 30px;
}
</style>

这样,他就成功的报错了!
报错原因是因为这一行:require('script-loader!jsonlint')
项目找不到script-loader,因而下了一个:

npm install script-loader

下载完毕,项目就有了雏形:

但是估计错误输入后发现,并没有实现错误校验功能,很纳闷,明明写了lint:true
然后尝试打开控制台看了下:

json-lint.js:22  Error: window.jsonlint not defined, CodeMirror JSON linting cannot run.

不懂为什么,于是尝试使用import替换require
依旧如此
后来去github翻了下issue, 发现此条可用:
https://github.com/scniro/react-codemirror2/issues/21

须下载jsonlint-mod:

npm install jsonlint-mod

于是便实现了:

完整代码(无坑版):

<template>
  <div class="json-editor">
    <textarea ref="textarea" />
  </div>
</template>

<script>
import CodeMirror from "codemirror";
import "codemirror/addon/lint/lint.css";
import "codemirror/lib/codemirror.css";
import "codemirror/theme/rubyblue.css";
import "codemirror/mode/javascript/javascript";
import "codemirror/addon/lint/lint";
import "codemirror/addon/lint/json-lint";
const jsonlint = require("jsonlint-mod");
console.log('jsonlint :>> ', jsonlint);
window.jsonlint = jsonlint;
export default {
  name: "JsonEditor", 
  props: ["value"],
  data() {
    return {
      jsonEditor: false,
    };
  },
  watch: {
    value(value) {
      const editorValue = this.jsonEditor.getValue();
      if (value !== editorValue) {
        this.jsonEditor.setValue(JSON.stringify(this.value, null, 2));
      }
    },
  },
  mounted() {
    // CodeMirror.fromTextArea()中第一个参数是DOM元素,而且必须是textarea元素;第二个参数是可选配置项
    this.jsonEditor = CodeMirror.fromTextArea(this.$refs.textarea, {
      lineNumbers: true,
      mode: "application/json",
      gutters: ["CodeMirror-lint-markers"],
      theme: "rubyblue",
      lint: true,
      lineWrapping: true, // 自动换行
      scrollPastEnd: true, // 允许用户将一个编辑器高度的空白区域滚动到编辑器底部的视图
      lineNumbers: true, // 显示左边行号(默认false,即不显示)
      styleActiveLine: true, // 当前行背景高亮
    });

    this.jsonEditor.setValue(JSON.stringify(this.value, null, 2));
    this.jsonEditor.on("change", (cm) => {
      console.log("cm.getValue() :>> ", cm.getValue());
      this.$emit("changed", cm.getValue());
      this.$emit("input", cm.getValue());
    });
  },
  methods: {
    getValue() {
      return this.jsonEditor.getValue();
    },
  },
};
</script>

<style scoped>
.json-editor {
  height: 100%;
  position: relative;
}
.json-editor >>> .CodeMirror {
  height: auto;
  min-height: 300px;
}
.json-editor >>> .CodeMirror-scroll {
  min-height: 300px;
}
.json-editor >>> .cm-s-rubyblue span.cm-string {
  color: #f08047;
}
.addbtn {
  margin-bottom: 15px;
  margin-left: 30px;
}
</style>

以上。

标签:codemirror,解决方案,lint,json,编辑器,import,jsonEditor,CodeMirror
From: https://www.cnblogs.com/hjk1124/p/18170363

相关文章

  • 人机验证 reCaptcha 无法解锁 使用 Gooreplacer 的解决方案
    解决方案浏览器搜索并安装插件Gooreplacer(参考下方链接),新增设置:匹配模式google.com/recaptcha匹配类型通配符目标地址recaptcha.net/recaptcha如下图:并开启,刷新页面,即可。故障分析及解决思路常见的人机验证(reCaptcha)网址是google.com/recaptcha,而Google由于一些......
  • EPAI手绘建模APP动画编辑器、信息、工程图
    ④ 动画:打开关闭动画编辑器。APP中动画包含两个部分,动画编辑器和动画控制器。动画编辑器用来编辑动画。具体来说,选中一个模型后,给模型添加移动、旋转、缩放三种关键帧,不同的模型添加不同的关键帧,实现动画效果。通过动画编辑器完成动画编辑后,通过动画控制器播放动画,动画控制器参见......
  • 在静态网络环境中快速修改网络配置信息的解决方案
    V1.02024年5月1日发布于博客园序言当网络配置设置为静态IP时,切换不同的位置意味着要不断的修改IP配置信息,每次修改都较为麻烦,在试过多种方案后,找到了“IPNetSetManPro”这款软件,可以实现网段设备的扫描和IP信息一键修改获取软件官网下载,个人使用免费WindowsIPFreeware......
  • 区块链和物联网解决方案实用指南(全)
    原文:zh.annas-archive.org/md5/9b82e4292467bac72ed9aef40681c09a译者:飞龙协议:CCBY-NC-SA4.0前言区块链和物联网(IoT)已被证明是目前最受欢迎的技术,并且只是开始应用它们的曲线。多家大公司的首要任务之一是整合区块链和物联网,其中一些公司已经开始在几个项目中使用其实施、......
  • vi编辑器有几种模式?vi编辑器常用命令详解
    vi/vim是工作在字符终端环境下的全屏幕编辑器,因为编辑界面相对比较简单,并没有为用户提供鼠标操作和菜单系统,而是通过按键命令实现相应的编辑和操作功能。在vi编辑界面中可以使用三种不同的工作模式。分别是命令模式(Command mode),编辑模式(Insert mode)和末行模式(Last line mode)。......
  • 如何防止源代码泄露?6种企业防泄密解决方案
    在数字化转型浪潮中,源代码成为企业宝贵的核心资产,其安全性直接关系到企业的生存和发展。源代码泄露不仅会导致商业秘密外泄,还可能造成严重的经济损失和品牌信誉下降。为此,采用高效的防泄密措施,如华企盾DSC数据防泄密系统,成为企业保护源代码不可或缺的策略。以下是结合华企盾DSC系......
  • 24.什么是跨域?解决方案有哪些?
    为什么会出现跨域问题存在浏览器同源策略,所以才会有跨域问题。那么浏览器是出于何种原因会有跨域的限制呢。其实不难想到,跨域限制主要的目的就是为了用户的上网安全。同源策略导致的跨域是浏览器单方面拒绝响应数据,服务器端是处理完毕并做出了响应的。什么是同源策略一个url由......
  • 信译Tinkeditor论新一代BS电子病历编辑器需要具备哪些能力
    笔者从事医疗信息化行业10多年,从事电子病历编辑器的编写工作10余年,对当前热门的B/S架构有一些心得发出来和大家讨论,笔者信译,讨论微信thinkeditor1。1. 是否需要结构化陈旧的自定义字符串格式,虽格式灵活,但需自己编写病历格式解析器,工作量大,容易出错,没有结构化,第三方无法提取数据......
  • 多人同时导出 Excel 干崩服务器!新来的阿里大佬给出的解决方案太优雅了!
    来源:juejin.cn/post/7259249904777838629前言业务诉求:考虑到数据库数据日渐增多,导出会有全量数据的导出,多人同时导出可以会对服务性能造成影响,导出涉及到mysql查询的io操作,还涉及文件输入、输出流的io操作,所以对服务器的性能会影响的比较大;结合以上原因,对导出操作进行排队;刚开......
  • 还在为邮件大附件发送困扰?企业邮件大文件解决方案来了!
    邮箱是企业最基础也是最常用的信息传递和业务往来方式,一般而言,对于文字及图片的业务沟通,邮箱完全可以胜任,但当涉及附件,特别是超大的附件,如影视频资料、大的工程文件、应用程序等,此时,邮件的大文件就会是很大的困扰。通常来说,企业解决邮件大文件的方式一般如下:分批发送:如果文件不......