目录
1. CodeMirror 是什么?能做什么?
2. CodeMirror 使用特点?项目解构?
3. CodeMirror 常用配置?
4. React 中如何使用 CodeMirror?
5. CodeMirror 的 lint 特性是靠什么实现的?
6. 综合示例
1. CodeMirror 是什么?能做什么?
CodeMirror is a versatile text editor implemented in JavaScript for the browser.
2. CodeMirror 使用特点?项目解构?
通常使用 CodeMirror 的地方,都会看到一大堆模块导入 import 语句,例如:
CodeMirror 的模块化特征非常强,基本上所有特性,都需要独立引入:
3. CodeMirror 常用配置?
CodeMirror 有 n 多配置,常用的有:
4. React 中如何使用 CodeMirror?
React 环境下可以使用 CodeMirror 的包装项目:react-codemirror2
安装:
npm install react-codemirror2 codemirror --save
受控 & 非受控:
import {UnControlled as CodeMirror} from 'react-codemirror2'
<CodeMirror
value='<h1>I ♥ react-codemirror2</h1>'
options={{
mode: 'xml',
theme: 'material',
lineNumbers: true
}}
onChange={(editor, data, value) => {
}}
/>
import {Controlled as CodeMirror} from 'react-codemirror2'
<CodeMirror
value={this.state.value}
options={options}
onBeforeChange={(editor, data, value) => {
this.setState({value});
}}
onChange={(editor, data, value) => {
}}
/>
注意:
5. CodeMirror 的 lint 特性是靠什么实现的?
vue-element-admin 中使用 CodeMirror 实现了一个带校验功能的 JsonEditor。
通过查看 codemirror/addon/lint/json-lint.js 的源码得知,json-lint.js 是在内部直接检测、使用全局(window)中注册的 jsonlint 对象,完成校验。
CodeMirror 的其他格式 lint,也采用了类似原理:
6. 综合示例
import React from "react";
import { Controlled as CodeMirror } from "react-codemirror2";
import "codemirror/lib/codemirror.css";
import "codemirror/theme/darcula.css";
import "codemirror/mode/javascript/javascript";
import "codemirror/addon/edit/closebrackets";
import "codemirror/addon/edit/closetag";
import "codemirror/addon/edit/matchbrackets";
import "codemirror/addon/edit/matchtags";
import "codemirror/addon/fold/foldcode";
import "codemirror/addon/fold/foldgutter";
import "codemirror/addon/fold/brace-fold";
import "codemirror/addon/fold/foldgutter.css";
import "codemirror/addon/lint/lint"
import "codemirror/addon/lint/javascript-lint"
import "codemirror/addon/lint/lint.css"
// @ts-ignore
import jshint from 'jshint'
// @ts-ignore
window.JSHINT = jshint.JSHINT;
interface JavascriptEditorProps {
value: string;
onChange: (value: string) => void;
}
export default function JavascriptEditor(props: JavascriptEditorProps) {
const { value, onChange } = props;
return (
<CodeMirror
value={value}
options={{
foldGutter: true,
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter", "CodeMirror-lint-markers"],
mode: { name: 'javascript', json: true },
lineNumbers: true,
lineWrapping: false,
theme: "darcula",
autoCloseTags: true,
autoCloseBrackets: true,
lint: true,
matchBrackets: true,
matchTags: true,
indentUnit: 2,
tabSize: 2,
}}
onBeforeChange={(editor, data, value) => {
if (onChange) {
onChange(value);
}
}}
onChange={(editor, data, value) => { }}
/>
);
}
参考:
CodeMirror 官网: http://codemirror.net/ CodeMirror 配置手册: https://codemirror.net/doc/manual.html react-codemirror2: https://github.com/scniro/react-codemirror2 vue-element-admin 的 JsonEditor 组件: https://github.com/PanJiaChen/vue-element-admin/blob/master/src/components/JsonEditor/index.vue