CodeMirror 是一個(gè)強(qiáng)大的代碼編輯器,它支持語(yǔ)法高亮、代碼折疊、自動(dòng)完成等功能。它廣泛用于在線編輯器和開(kāi)發(fā)工具中,支持多種語(yǔ)言和功能。CodeMirror V6 是其全新版本,采用了更加模塊化和可擴(kuò)展的架構(gòu)。在本教程中,我們將展示如何在 Vue 3 中集成 CodeMirror V6,創(chuàng)建一個(gè)簡(jiǎn)單的 XML 編輯器。

步驟 1: 安裝所需依賴(lài)
首先,我們需要安裝一些 CodeMirror V6 的核心依賴(lài)。由于 CodeMirror V6 拆分成了多個(gè)小模塊,所以我們需要單獨(dú)安裝每個(gè)需要的包。
在項(xiàng)目目錄中運(yùn)行以下命令來(lái)安裝 CodeMirror 所需的模塊:
pnpm i @codemirror/lang-xml@6.0.1 @codemirror/state@6.0.1 @codemirror/view@^6.0.1 codemirror@6.0.1
這個(gè)命令會(huì)安裝以下幾個(gè)模塊:
-
@codemirror/lang-xml:提供 XML 語(yǔ)言支持。 -
@codemirror/state:管理編輯器的狀態(tài)。 -
@codemirror/view:處理編輯器的視圖和 UI。 -
codemirror:基礎(chǔ)包,包含一些常見(jiàn)功能(例如基礎(chǔ)的編輯器設(shè)置)。
步驟 2: 創(chuàng)建 Vue 3 組件
在 Vue 3 中集成 CodeMirror V6 相對(duì)簡(jiǎn)單。我們需要使用 Vue 的 ref 和生命周期鉤子來(lái)初始化編輯器,并將其渲染到頁(yè)面上。
Vue 3 代碼示例
以下是一個(gè)簡(jiǎn)單的 Vue 3 組件,它展示了如何將 CodeMirror V6 集成到 Vue 項(xiàng)目中:
<script setup lang="ts">
// 引入所需的 CodeMirror 模塊
import { basicSetup } from 'codemirror'
import { EditorView } from '@codemirror/view'
import { Compartment, EditorState } from '@codemirror/state'
import { xml } from '@codemirror/lang-xml'
// 初始化編輯器內(nèi)容
const contentStr = ref<string>(`<div>hello world!</div>`)
const view = ref()
const viewRef = ref<Element>()
// 初始化編輯器實(shí)例
const init = () => {
if (view.value) return // 確保只初始化一次
const language = new Compartment() // 語(yǔ)言設(shè)置
const tabSize = new Compartment() // 縮進(jìn)設(shè)置
// 創(chuàng)建 CodeMirror 編輯器狀態(tài)
const state = EditorState.create({
doc: contentStr.value, // 設(shè)置文檔內(nèi)容
extensions: [
basicSetup, // 使用 CodeMirror 的基礎(chǔ)設(shè)置
language.of(xml()), // 設(shè)置語(yǔ)言為 XML
tabSize.of(EditorState.tabSize.of(8)), // 設(shè)置 tab 縮進(jìn)大小
// 注冊(cè)一個(gè)更新監(jiān)聽(tīng)器,捕捉編輯器內(nèi)容變化
EditorView.updateListener.of(v => {
contentStr.value = v.state.doc.toString() // 更新內(nèi)容
}),
],
})
// 創(chuàng)建并渲染編輯器視圖
view.value = new EditorView({
state,
parent: viewRef.value, // 將編輯器附加到 DOM 元素
})
}
// 在組件掛載時(shí)初始化編輯器
onMounted(() => {
init()
})
</script>
<template>
<div class="app-container">
<div ref="viewRef" style="height: 600px"></div> <!-- 編輯器容器 -->
</div>
</template>
<style lang="scss" scoped>
/* 樣式可以根據(jù)需要調(diào)整 */
</style>
代碼解析
-
引入 CodeMirror 模塊:
-
basicSetup: 這是一個(gè) CodeMirror 提供的預(yù)設(shè)配置,包含了很多常用功能(如行號(hào)顯示、語(yǔ)法高亮、編輯功能等)。 -
EditorView和EditorState: 用于管理編輯器視圖和狀態(tài)。 -
xml: 這是我們使用的語(yǔ)言支持包,在這里我們使用 XML 語(yǔ)法高亮。
-
-
創(chuàng)建編輯器實(shí)例:
-
EditorState.create: 創(chuàng)建一個(gè)新的編輯器狀態(tài)對(duì)象,它保存著編輯器的文檔內(nèi)容、光標(biāo)位置等信息。 -
extensions: 這是 CodeMirror 中用于擴(kuò)展編輯器功能的配置數(shù)組。我們使用了basicSetup(啟用一些常見(jiàn)的編輯功能)、XML 語(yǔ)言支持以及 Tab 大小設(shè)置等。 -
EditorView.updateListener: 用于監(jiān)聽(tīng)編輯器內(nèi)容的變化,每當(dāng)內(nèi)容更新時(shí),都會(huì)觸發(fā)該回調(diào),我們將文檔內(nèi)容同步到 Vue 的響應(yīng)式contentStr變量中。
-
-
掛載編輯器視圖:
-
EditorView用于創(chuàng)建實(shí)際的編輯器實(shí)例,我們將其掛載到 DOM 中的viewRef元素上。
-
步驟 3: 運(yùn)行項(xiàng)目
完成以上步驟后,你就可以啟動(dòng) Vue 項(xiàng)目并查看 CodeMirror 編輯器在瀏覽器中的顯示效果。在瀏覽器中,你應(yīng)該能夠看到一個(gè)帶有 XML 語(yǔ)法高亮的編輯器,并且可以進(jìn)行文本編輯。編輯器的內(nèi)容會(huì)自動(dòng)同步到 Vue 的響應(yīng)式變量中。
你可以查看 CodeMirror 6 的文檔 來(lái)了解更多可用的擴(kuò)展和配置選項(xiàng)。
總結(jié)
在本教程中,我們展示了如何在 Vue 3 中集成 CodeMirror V6,并創(chuàng)建了一個(gè)簡(jiǎn)單的 XML 編輯器。通過(guò)安裝所需的依賴(lài)并配置 EditorState 和 EditorView,我們能夠輕松地將 CodeMirror 編輯器嵌入到 Vue 應(yīng)用中。接下來(lái),你可以根據(jù)需要擴(kuò)展和定制編輯器功能,以滿足特定的業(yè)務(wù)需求。
希望這篇教程對(duì)你有所幫助,如果你有任何問(wèn)題,歡迎在評(píng)論區(qū)留言!