<template> <div> <textarea ref="textarea"> 白日依山尽,黄河入海流。 欲穷千里目,更上一层楼。 </textarea > </div> </template> <script lang="ts"> import { defineComponent, onMounted, ref, reactive } from 'vue'; // 引入全局实例 import _CodeMirror from 'codemirror'; // 核心样式 import 'codemirror/lib/codemirror.css'; // 引入主题后还需要在 options 中指定主题才会生效 import 'codemirror/theme/cobalt.css'; // 需要引入具体的语法高亮库才会有对应的语法高亮效果 // codemirror 官方其实支持通过 /addon/mode/loadmode.js 和 /mode/meta.js 来实现动态加载对应语法高亮库 // 但 vue 貌似没有无法在实例初始化后再动态加载对应 JS ,所以此处才把对应的 JS 提前引入 import 'codemirror/mode/javascript/javascript.js'; import 'codemirror/mode/css/css.js'; import 'codemirror/mode/xml/xml.js'; import 'codemirror/mode/clike/clike.js'; import 'codemirror/mode/markdown/markdown.js'; import 'codemirror/mode/python/python.js'; import 'codemirror/mode/r/r.js'; import 'codemirror/mode/shell/shell.js'; import 'codemirror/mode/sql/sql.js'; import 'codemirror/mode/swift/swift.js'; import 'codemirror/mode/vue/vue.js'; // 尝试获取全局实例 export default defineComponent({ components: {}, setup() { const CodeMirror = window.CodeMirror || _CodeMirror; const textarea = ref(null); const options = reactive({ // 缩进格式 tabSize: 2, // 主题,对应主题库 JS 需要提前引入 theme: 'cobalt', // 显示行号 lineNumbers: true, line: true, }); onMounted(() => { init(); }); function init() { CodeMirror.fromTextArea(textarea.value, options); } return { textarea, }; }, }); </script> <style lang="css" scoped></style>