vue2项目引入代码编辑器插件小记

背景

为什么要用vue2呢?都2023年了,还在用vue2?没办法,公司老项目需要维护迭代,一直也没有升级vue3,只能在上面继续维护了。最近项目里需要用到一个代码编辑器,可以实现输入js、json、sql等,并且需要格式校验,当格式不正确的时候并给出错误提示。

实现过程

之前在使用react的过程中,使用了react-codemirror,所以应该也会有vue版本的code-mirror,google一下,果然不出所料,然而网上的文章千奇百怪,有的时候按照文章步骤,总会出现各种各样的问题,在整合多方资料,自己不断尝试,终于搞定了!!!特此记录,以防后来掉坑!

安装依赖

因为是vue2项目,不能使用最新的codemirror6版本,需要使用codemirror v5版本,安装如下依赖

js 复制代码
yarn add codemirror@5
yarn add vue-codemirror@4.0.6

使用方法

创建一个vue组件

vue 复制代码
<template>
  <codemirror v-model="code" :options="cmOptions"></codemirror>
</template>

<script>
import  { codemirror } from 'vue-codemirror'
import 'codemirror/lib/codemirror.css'
// language js
import 'codemirror/mode/javascript/javascript.js'
// theme css
import 'codemirror/theme/base16-dark.css'

export const jsonData = {
  name:'tome',
  age:16
}
export default {
  name:'code-display',
  components:{
    codemirror
  },
  data() {
    return {
      code: JSON.stringify(jsonData,null,2),
      cmOptions: {
        // codemirror options
        // tabSize: 2,
        // mode: 'text/javascript',
        mode:'application/json',
        gutters: ['CodeMirror-lint-markers',"CodeMirror-linenumbers","CodeMirror-foldgutter"],
        theme: 'base16-dark',
        lineNumbers: true,
        line: true,
        lineWrapping: true,
        // more codemirror options, 更多 codemirror 的高级配置...
      }
    };
  },
  methods: {
  }
};
</script>

此时就可以正常输入json、js等代码,但是我们的需求需要校验代码的格式,v5 版本给提供一个lint配置,相关介绍可查看lint,此处只演示json格式校验,为了实现json格式校验,需要增加一个配置,打开lint

js 复制代码
cmOptions: {
        mode:'application/json',
        gutters: ['CodeMirror-lint-markers',"CodeMirror-linenumbers","CodeMirror-foldgutter"],
        theme: 'base16-dark',
        lineNumbers: true,
        line: true,
        lint:true, // 格式校验开关
        lineWrapping: true,
      }

按照网上的文章,打开这个开关后即可,在做的过程中发现,单纯打开这个开关,并不能实现格式校验,console控制台还会报错:

根据报错内容,查看源码,发现在源码中会判断window.jsonlint是否存在

查找了好多资料后,需要安装如下几个npm包,安装jshint是为了后面校验js格式(按需安装)

js 复制代码
yarn add jsonlint file system
yarn add jshint 

代码增加如下

js 复制代码
import jsonlint from 'jsonlint';
import { JSHINT } from 'jshint';

import 'codemirror/addon/lint/lint'
import 'codemirror/addon/lint/lint.css'
import 'codemirror/addon/lint/json-lint'
import 'codemirror/addon/lint/javascript-lint'

window.JSHINT = JSHINT;
window.jsonlint = jsonlint;

完整代码

vue 复制代码
<template>
  <codemirror v-model="code" :options="cmOptions"></codemirror>
</template>

<script>
import  { codemirror } from 'vue-codemirror'
import jsonlint from 'jsonlint';
import { JSHINT } from 'jshint';
import 'codemirror/lib/codemirror.css'
import 'codemirror/addon/lint/lint'
import 'codemirror/addon/lint/lint.css'
import 'codemirror/addon/lint/json-lint'
import 'codemirror/addon/lint/javascript-lint'
// language js
import 'codemirror/mode/javascript/javascript.js'
// theme css
import 'codemirror/theme/base16-dark.css'

window.JSHINT = JSHINT;
window.jsonlint = jsonlint;

export const jsonData = {
  name:'tome',
  age:16
}
export default {
  name:'code-display',
  components:{
    codemirror
  },
  data() {
    return {
      code: JSON.stringify(jsonData,null,2),
      cmOptions: {
        // codemirror options
        // tabSize: 2,
        // mode: 'text/javascript',
        mode:'application/json',
        gutters: ['CodeMirror-lint-markers',"CodeMirror-linenumbers","CodeMirror-foldgutter"],
        theme: 'base16-dark',
        lineNumbers: true,
        line: true,
        lint:true,
        lineWrapping: true,
        // more codemirror options, 更多 codemirror 的高级配置...
      }
    };
  },
  methods: {
  }
};
</script>

完整的package.json

json 复制代码
{
  "name": "test-vue2",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "@codemirror/lang-html": "^6.4.5",
    "@codemirror/lang-javascript": "^6.1.9",
    "@codemirror/lang-json": "^6.0.1",
    "@codemirror/theme-one-dark": "^6.1.2",
    "codemirror": "5",
    "core-js": "^3.6.5",
    "file": "^0.2.2",
    "jshint": "^2.13.6",
    "jsonlint": "^1.6.3",
    "system": "^2.0.1",
    "vue": "^2.6.11",
    "vue-codemirror": "4.0.6"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~4.5.7",
    "@vue/cli-plugin-eslint": "~4.5.7",
    "@vue/cli-service": "~4.5.7",
    "babel-eslint": "^10.1.0",
    "eslint": "^6.7.2",
    "eslint-plugin-vue": "^6.2.2",
    "vue-template-compiler": "^2.6.11"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],
    "parserOptions": {
      "parser": "babel-eslint"
    },
    "rules": {}
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}

当前格式是json格式,就可以输入json内容了,错误的时候会给出提示。

json格式错误如下:

json格式正确如下:

如果想输入其它格式内容,比如输入js代码,需要将配置项中的mode改为对应语言格式text/javascript,并引入对应语言校验的包才行。

参考资料

相关推荐
祈澈菇凉2 小时前
Webpack的基本功能有哪些
前端·javascript·vue.js
小纯洁w2 小时前
Webpack 的 require.context 和 Vite 的 import.meta.glob 的详细介绍和使用
前端·webpack·node.js
想睡好3 小时前
css文本属性
前端·css
qianmoQ3 小时前
第三章:组件开发实战 - 第五节 - Tailwind CSS 响应式导航栏实现
前端·css
zhoupenghui1683 小时前
golang时间相关函数总结
服务器·前端·golang·time
White graces3 小时前
正则表达式效验邮箱格式, 手机号格式, 密码长度
前端·spring boot·spring·正则表达式·java-ee·maven·intellij-idea
庸俗今天不摸鱼3 小时前
Canvas进阶-4、边界检测(流光,鼠标拖尾)
开发语言·前端·javascript·计算机外设
bubusa~>_<3 小时前
解决npm install 出现error,比如:ERR_SSL_CIPHER_OPERATION_FAILED
前端·npm·node.js
yanglamei19624 小时前
基于Python+Django+Vue的旅游景区推荐系统系统设计与实现源代码+数据库+使用说明
vue.js·python·django
流烟默4 小时前
vue和微信小程序处理markdown格式数据
前端·vue.js·微信小程序