@tuoyuan/code-editor 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +505 -0
  2. package/dist/CodeEditor.vue.d.ts +335 -0
  3. package/dist/abap-Ck4GwL0j.js +1404 -0
  4. package/dist/abap-Dm-grL-k.cjs +6 -0
  5. package/dist/apex-BcgYgERc.cjs +6 -0
  6. package/dist/apex-ODA7HKAJ.js +332 -0
  7. package/dist/azcli-CTIyen0u.cjs +6 -0
  8. package/dist/azcli-Cb6cb8s9.js +74 -0
  9. package/dist/bat-DNcko697.cjs +6 -0
  10. package/dist/bat-DTzY2NZq.js +106 -0
  11. package/dist/bicep-BMFU7f1t.js +108 -0
  12. package/dist/bicep-CaTas9h4.cjs +7 -0
  13. package/dist/cameligo-CI3fenw2.cjs +6 -0
  14. package/dist/cameligo-NLSSnjLV.js +180 -0
  15. package/dist/clojure-BGGaGC_c.cjs +6 -0
  16. package/dist/clojure-Du0upEOV.js +767 -0
  17. package/dist/coffee-ClJtyy1o.cjs +6 -0
  18. package/dist/coffee-v4uQlkM7.js +238 -0
  19. package/dist/cpp-C8lRvf76.cjs +6 -0
  20. package/dist/cpp-D8cWT5D_.js +395 -0
  21. package/dist/csharp-Czug7i7m.js +332 -0
  22. package/dist/csharp-DWhydAB-.cjs +6 -0
  23. package/dist/csp-BWvo8sOh.cjs +6 -0
  24. package/dist/csp-C8fx6eO8.js +59 -0
  25. package/dist/css-BpNIi06k.js +193 -0
  26. package/dist/css-CFi1nolN.cjs +8 -0
  27. package/dist/cssMode-BfZeZ0sl.js +1577 -0
  28. package/dist/cssMode-CroponXs.cjs +9 -0
  29. package/dist/cypher-C17znEzs.js +269 -0
  30. package/dist/cypher-CeoUqDHe.cjs +6 -0
  31. package/dist/dart-BmDOWGHn.cjs +6 -0
  32. package/dist/dart-CYyrqmCr.js +287 -0
  33. package/dist/dockerfile-BQUsBUh7.js +136 -0
  34. package/dist/dockerfile-CughGaD6.cjs +6 -0
  35. package/dist/ecl-BDDxLC55.cjs +6 -0
  36. package/dist/ecl-CJB68izO.js +462 -0
  37. package/dist/elixir-BPaYnkX2.cjs +6 -0
  38. package/dist/elixir-DljgmHqx.js +575 -0
  39. package/dist/flow9-0BfLJTIY.js +148 -0
  40. package/dist/flow9-BYsSavfX.cjs +6 -0
  41. package/dist/formatter.d.ts +16 -0
  42. package/dist/freemarker2-CpMdvAfd.cjs +8 -0
  43. package/dist/freemarker2-DVRVJu0B.js +995 -0
  44. package/dist/fsharp-SmZEcjiu.cjs +6 -0
  45. package/dist/fsharp-lmsaS1LJ.js +223 -0
  46. package/dist/go-Tv83ayL9.js +224 -0
  47. package/dist/go-xVW5xrOi.cjs +6 -0
  48. package/dist/graphql-BH1G4Uv8.js +157 -0
  49. package/dist/graphql-BaJ0LkdR.cjs +6 -0
  50. package/dist/handlebars-8AMUT0_r.cjs +6 -0
  51. package/dist/handlebars-cspegSxe.js +425 -0
  52. package/dist/hcl-9tXVo0Oo.js +189 -0
  53. package/dist/hcl-BTIq68i_.cjs +6 -0
  54. package/dist/html-Bvlf1Z20.cjs +6 -0
  55. package/dist/html-zabMn0fr.js +314 -0
  56. package/dist/htmlMode-B3y58LIC.cjs +9 -0
  57. package/dist/htmlMode-jXZ-OnTX.js +1587 -0
  58. package/dist/index-BvnET_j2.js +132407 -0
  59. package/dist/index-CjGIE44E.cjs +1197 -0
  60. package/dist/index.d.ts +5 -0
  61. package/dist/index.js +1 -0
  62. package/dist/index.mjs +5 -0
  63. package/dist/ini-CJdCU2Im.cjs +6 -0
  64. package/dist/ini-DZX3aW6M.js +77 -0
  65. package/dist/java-Day25zBa.cjs +6 -0
  66. package/dist/java-Q9NjwWso.js +238 -0
  67. package/dist/javascript-BF91TgD3.js +76 -0
  68. package/dist/javascript-QgWqIxzo.cjs +6 -0
  69. package/dist/jsonMode-Chpjh-RM.cjs +15 -0
  70. package/dist/jsonMode-DD3uMliY.js +2002 -0
  71. package/dist/julia-BqwBsF5P.cjs +6 -0
  72. package/dist/julia-QQBeypPo.js +517 -0
  73. package/dist/kotlin-2AnhId0p.js +259 -0
  74. package/dist/kotlin-B4u9iQDL.cjs +6 -0
  75. package/dist/less-CWxTTuX7.cjs +7 -0
  76. package/dist/less-Daawp9Qu.js +168 -0
  77. package/dist/lexon-B1xVKv1m.cjs +6 -0
  78. package/dist/lexon-CqxA-4g1.js +163 -0
  79. package/dist/liquid-CsQKIvsE.cjs +6 -0
  80. package/dist/liquid-DxypC1q6.js +246 -0
  81. package/dist/lua-C9DR8JqQ.js +168 -0
  82. package/dist/lua-GQ1AlIpR.cjs +6 -0
  83. package/dist/m3-ChnU6a_2.cjs +6 -0
  84. package/dist/m3-ChoO2Aeo.js +216 -0
  85. package/dist/markdown-vGe7N__p.js +235 -0
  86. package/dist/markdown-yRKnCzup.cjs +6 -0
  87. package/dist/mdx-BvsKvd6j.cjs +6 -0
  88. package/dist/mdx-DZRrNJcb.js +171 -0
  89. package/dist/mips-B35Tctk9.js +204 -0
  90. package/dist/mips-DE1-KCxg.cjs +6 -0
  91. package/dist/monaco-worker.d.ts +2 -0
  92. package/dist/msdax-CKduWRE-.js +381 -0
  93. package/dist/msdax-D0cml5wZ.cjs +6 -0
  94. package/dist/mysql-D4V3ltpC.js +884 -0
  95. package/dist/mysql-DLWkbGoZ.cjs +6 -0
  96. package/dist/objective-c-CaS419yz.js +189 -0
  97. package/dist/objective-c-aq90HTjV.cjs +6 -0
  98. package/dist/pascal-CzzqMa-q.js +257 -0
  99. package/dist/pascal-Tx_vZ5dG.cjs +6 -0
  100. package/dist/pascaligo-DPbJfhBm.js +170 -0
  101. package/dist/pascaligo-D_Ri2CTv.cjs +6 -0
  102. package/dist/perl-CswrnJgZ.cjs +6 -0
  103. package/dist/perl-DiakDHGa.js +632 -0
  104. package/dist/pgsql-CCS271_e.cjs +6 -0
  105. package/dist/pgsql-FgzHGfbe.js +857 -0
  106. package/dist/php-BtenrrrR.cjs +6 -0
  107. package/dist/php-DeEgUIDo.js +506 -0
  108. package/dist/pla-BtA__bSx.js +143 -0
  109. package/dist/pla-DqtRVxAK.cjs +6 -0
  110. package/dist/postiats-CDpKZOjz.js +913 -0
  111. package/dist/postiats-CMjeSPtv.cjs +6 -0
  112. package/dist/powerquery-C4wMFtve.js +896 -0
  113. package/dist/powerquery-DMrlf6nl.cjs +6 -0
  114. package/dist/powershell-BIXcUAIq.js +245 -0
  115. package/dist/powershell-BzvWvXBW.cjs +6 -0
  116. package/dist/protobuf-BHrBiKx5.js +426 -0
  117. package/dist/protobuf-BkfVMs3q.cjs +7 -0
  118. package/dist/pug-BgHHt25K.cjs +6 -0
  119. package/dist/pug-D_c6Bxex.js +408 -0
  120. package/dist/python-CDI0D2Kf.cjs +6 -0
  121. package/dist/python-CXOcTmBp.js +307 -0
  122. package/dist/qsharp-BS_wm4zq.cjs +6 -0
  123. package/dist/qsharp-Bmp6Uoth.js +291 -0
  124. package/dist/r-Cw-pZRR6.js +249 -0
  125. package/dist/r-XsO4bdi0.cjs +6 -0
  126. package/dist/razor-CAIWGDkN.cjs +6 -0
  127. package/dist/razor-Do5Lpn1p.js +556 -0
  128. package/dist/redis-D5elYsZS.cjs +6 -0
  129. package/dist/redis-DSkWtKTU.js +308 -0
  130. package/dist/redshift-BrAReR9w.cjs +6 -0
  131. package/dist/redshift-G3V-UH7H.js +815 -0
  132. package/dist/restructuredtext-C3HS0Vuf.js +180 -0
  133. package/dist/restructuredtext-CzNfc37y.cjs +6 -0
  134. package/dist/ruby-CFRrX6F7.cjs +6 -0
  135. package/dist/ruby-DdxOY_t-.js +517 -0
  136. package/dist/rust-BgYTY-pT.cjs +6 -0
  137. package/dist/rust-CHLNe-uh.js +349 -0
  138. package/dist/sb-DjdwHjNi.cjs +6 -0
  139. package/dist/sb-VgZvRVjv.js +121 -0
  140. package/dist/scala-BEo281v6.js +376 -0
  141. package/dist/scala-C9e5dt2E.cjs +6 -0
  142. package/dist/scheme-BPzKEKRg.cjs +6 -0
  143. package/dist/scheme-BwtlTEx9.js +114 -0
  144. package/dist/scss-B_KRI23k.cjs +8 -0
  145. package/dist/scss-DNHJcE5b.js +268 -0
  146. package/dist/shell-961u9U9E.cjs +6 -0
  147. package/dist/shell-CYXbUHt6.js +227 -0
  148. package/dist/solidity-B94td9D0.js +1373 -0
  149. package/dist/solidity-DyAQZQb-.cjs +6 -0
  150. package/dist/sophia-C67C1dNJ.cjs +6 -0
  151. package/dist/sophia-CgOMMImk.js +205 -0
  152. package/dist/sparql-CmRbqkGW.js +207 -0
  153. package/dist/sparql-DTHixtMm.cjs +6 -0
  154. package/dist/sql-CX8rIh5F.cjs +6 -0
  155. package/dist/sql-DVsVTphc.js +859 -0
  156. package/dist/st-ATFa4Vu3.js +422 -0
  157. package/dist/st-CBQkFfzG.cjs +6 -0
  158. package/dist/style.css +1 -0
  159. package/dist/swift-K4rp2L0u.js +318 -0
  160. package/dist/swift-XvmCMD7s.cjs +8 -0
  161. package/dist/systemverilog-D0lDJRC5.cjs +6 -0
  162. package/dist/systemverilog-YgLuECrg.js +582 -0
  163. package/dist/tcl-BHcJGOmo.js +238 -0
  164. package/dist/tcl-Ju0vlxf3.cjs +6 -0
  165. package/dist/tsMode-D7bHvHeH.cjs +16 -0
  166. package/dist/tsMode-DiYbk3vf.js +895 -0
  167. package/dist/twig-B1JhL8Uy.cjs +6 -0
  168. package/dist/twig-sVb_x968.js +398 -0
  169. package/dist/types.d.ts +16 -0
  170. package/dist/typescript-CI6w3N2S.cjs +6 -0
  171. package/dist/typescript-DFdjl8Xj.js +349 -0
  172. package/dist/typespec-BSdcQAUL.js +123 -0
  173. package/dist/typespec-u6UGyzVa.cjs +6 -0
  174. package/dist/vb-BZywMj6s.js +378 -0
  175. package/dist/vb-CB1voSvV.cjs +6 -0
  176. package/dist/wgsl-eG2bS915.js +445 -0
  177. package/dist/wgsl-eXQZam6Q.cjs +303 -0
  178. package/dist/xml-CJndgX4z.js +101 -0
  179. package/dist/xml-CO5xAOVk.cjs +6 -0
  180. package/dist/yaml--krIkoJ8.js +212 -0
  181. package/dist/yaml-BYk2IWKs.cjs +6 -0
  182. package/package.json +73 -0
package/README.md ADDED
@@ -0,0 +1,505 @@
1
+ # @tuoyuan/code-editor
2
+
3
+ 基于 Monaco Editor 的 Vue3 代码编辑器组件,支持多种编程语言的代码高亮、格式化和压缩功能。
4
+
5
+ ## ✨ 特性
6
+
7
+ - 🎨 **多语言支持**:JavaScript、JSON、SQL
8
+ - 🌈 **语法高亮**:Monaco Editor 内置语法高亮
9
+ - 📝 **代码格式化**:使用 js-beautify 和 sql-formatter
10
+ - 🗜️ **代码压缩**:一键压缩代码
11
+ - 🎯 **TypeScript 支持**:完整的类型定义
12
+ - 🌓 **主题切换**:浅色、深色、高对比度主题
13
+ - 💾 **保存功能**:支持保存事件和 Ctrl+S 快捷键
14
+ - 📊 **状态栏**:显示光标位置、行数、字符数等统计信息
15
+ - 📋 **复制代码**:一键复制编辑器内容
16
+ - 💿 **下载代码**:导出为文件
17
+ - 🖥️ **全屏模式**:支持全屏编辑,ESC 退出
18
+ - 🔧 **零配置**:内置 Worker 配置,无需额外设置
19
+ - 📦 **轻量级封装**:参考了 devops-platform 和 dashboard-manage.web 的最佳实践
20
+
21
+ ## 安装
22
+
23
+ ```bash
24
+ npm install @tuoyuan/code-editor monaco-editor
25
+ # or
26
+ pnpm add @tuoyuan/code-editor monaco-editor
27
+ # or
28
+ yarn add @tuoyuan/code-editor monaco-editor
29
+ ```
30
+
31
+ ## 📖 使用
32
+
33
+ ### 基本用法
34
+
35
+ ```vue
36
+ <template>
37
+ <CodeEditor
38
+ v-model="code"
39
+ language="javascript"
40
+ height="400px"
41
+ />
42
+ </template>
43
+
44
+ <script setup lang="ts">
45
+ import { ref } from 'vue'
46
+ import { CodeEditor } from '@tuoyuan/code-editor'
47
+ import '@tuoyuan/code-editor/dist/style.css'
48
+
49
+ const code = ref('console.log("Hello World")')
50
+ </script>
51
+ ```
52
+
53
+ ### 完整示例(带所有功能)
54
+
55
+ ```vue
56
+ <template>
57
+ <div>
58
+ <!-- 外部操作按钮 -->
59
+ <div style="margin-bottom: 10px;">
60
+ <button @click="copyCode">复制代码</button>
61
+ <button @click="downloadCode">下载代码</button>
62
+ <button @click="toggleFullscreen">全屏</button>
63
+ </div>
64
+
65
+ <!-- 代码编辑器 -->
66
+ <CodeEditor
67
+ ref="editorRef"
68
+ v-model="code"
69
+ v-model:language="language"
70
+ v-model:theme="theme"
71
+ height="500px"
72
+ :show-toolbar="true"
73
+ @change="onChange"
74
+ @save="onSave"
75
+ @format="onFormat"
76
+ @minify="onMinify"
77
+ @copy="onCopy"
78
+ @download="onDownload"
79
+ @fullscreen="onFullscreenChange"
80
+ />
81
+ </div>
82
+ </template>
83
+
84
+ <script setup lang="ts">
85
+ import { ref } from 'vue'
86
+ import { CodeEditor } from '@tuoyuan/code-editor'
87
+ import type { CodeEditorInstance } from '@tuoyuan/code-editor'
88
+ import '@tuoyuan/code-editor/dist/style.css'
89
+
90
+ const editorRef = ref<CodeEditorInstance>()
91
+ const code = ref('console.log("Hello World")')
92
+ const language = ref<'javascript' | 'json' | 'sql'>('javascript')
93
+ const theme = ref<'vs' | 'vs-dark' | 'hc-black'>('vs')
94
+
95
+ // 复制代码
96
+ const copyCode = async () => {
97
+ const success = await editorRef.value?.copyCode()
98
+ if (success) {
99
+ alert('代码已复制')
100
+ }
101
+ }
102
+
103
+ // 下载代码
104
+ const downloadCode = () => {
105
+ editorRef.value?.downloadCode('my-code.js')
106
+ }
107
+
108
+ // 切换全屏
109
+ const toggleFullscreen = () => {
110
+ editorRef.value?.toggleFullscreen()
111
+ }
112
+
113
+ // 事件处理
114
+ const onChange = (value: string) => {
115
+ console.log('代码变化:', value)
116
+ }
117
+
118
+ const onSave = (value: string) => {
119
+ console.log('保存代码:', value)
120
+ // 在这里处理保存逻辑,如保存到服务器
121
+ }
122
+
123
+ const onFormat = (value: string) => {
124
+ console.log('格式化完成')
125
+ }
126
+
127
+ const onMinify = (value: string) => {
128
+ console.log('压缩完成')
129
+ }
130
+
131
+ const onCopy = (value: string) => {
132
+ console.log('代码已复制')
133
+ }
134
+
135
+ const onDownload = (value: string) => {
136
+ console.log('代码已下载')
137
+ }
138
+
139
+ const onFullscreenChange = (isFullscreen: boolean) => {
140
+ console.log('全屏状态:', isFullscreen)
141
+ }
142
+ </script>
143
+ ```
144
+
145
+ ### 语言和主题切换
146
+
147
+ ```vue
148
+ <template>
149
+ <CodeEditor
150
+ v-model="code"
151
+ v-model:language="currentLanguage"
152
+ v-model:theme="currentTheme"
153
+ height="400px"
154
+ />
155
+ </template>
156
+
157
+ <script setup lang="ts">
158
+ import { ref, watch } from 'vue'
159
+ import { CodeEditor } from '@tuoyuan/code-editor'
160
+ import '@tuoyuan/code-editor/dist/style.css'
161
+
162
+ const code = ref('')
163
+ const currentLanguage = ref<'javascript' | 'json' | 'sql'>('javascript')
164
+ const currentTheme = ref<'vs' | 'vs-dark' | 'hc-black'>('vs-dark')
165
+
166
+ // 监听语言变化
167
+ watch(currentLanguage, (newLang) => {
168
+ console.log('语言已切换为:', newLang)
169
+ // 可以根据语言加载不同的代码模板
170
+ })
171
+
172
+ // 监听主题变化
173
+ watch(currentTheme, (newTheme) => {
174
+ console.log('主题已切换为:', newTheme)
175
+ })
176
+ </script>
177
+ ```
178
+
179
+ ### 只读模式
180
+
181
+ ```vue
182
+ <template>
183
+ <CodeEditor
184
+ v-model="code"
185
+ language="javascript"
186
+ :readonly="true"
187
+ :show-toolbar="false"
188
+ />
189
+ </template>
190
+
191
+ <script setup lang="ts">
192
+ import { ref } from 'vue'
193
+ import { CodeEditor } from '@tuoyuan/code-editor'
194
+ import '@tuoyuan/code-editor/dist/style.css'
195
+
196
+ const code = ref('console.log("只读模式")')
197
+ </script>
198
+ ```
199
+
200
+ ## 📋 API
201
+
202
+ ### Props
203
+
204
+ | 参数 | 说明 | 类型 | 默认值 |
205
+ | --- | --- | --- | --- |
206
+ | modelValue | 代码内容(支持 v-model) | `string` | `''` |
207
+ | language | 编程语言(支持 v-model:language) | `'javascript' \| 'json' \| 'sql'` | `'javascript'` |
208
+ | theme | 编辑器主题(支持 v-model:theme) | `'vs' \| 'vs-dark' \| 'hc-black'` | `'vs'` |
209
+ | height | 编辑器高度 | `string` | `'400px'` |
210
+ | readonly | 只读模式 | `boolean` | `false` |
211
+ | showToolbar | 显示工具栏(包含语言/主题选择器、格式化、压缩按钮) | `boolean` | `true` |
212
+ | options | Monaco Editor 原生配置项 | `editor.IStandaloneEditorConstructionOptions` | `{}` |
213
+
214
+ **主题说明:**
215
+ - `vs`:浅色主题(白色背景)
216
+ - `vs-dark`:深色主题(黑色背景)
217
+ - `hc-black`:高对比度主题(无障碍模式)
218
+
219
+ ### Events
220
+
221
+ | 事件名 | 说明 | 回调参数 | 触发时机 |
222
+ | --- | --- | --- | --- |
223
+ | update:modelValue | 代码内容变化(v-model) | `(value: string) => void` | 每次编辑时 |
224
+ | update:language | 语言变化(v-model:language) | `(language: string) => void` | 切换语言时 |
225
+ | update:theme | 主题变化(v-model:theme) | `(theme: string) => void` | 切换主题时 |
226
+ | change | 代码内容变化 | `(value: string) => void` | 每次编辑时 |
227
+ | blur | 编辑器失焦 | `(value: string) => void` | 失去焦点时 |
228
+ | save | 保存代码 | `(value: string) => void` | 点击保存按钮或按下 Ctrl+S |
229
+ | format | 格式化完成 | `(value: string) => void` | 点击格式化按钮后 |
230
+ | minify | 压缩完成 | `(value: string) => void` | 点击压缩按钮后 |
231
+ | copy | 复制代码 | `(value: string) => void` | 调用 copyCode 方法时 |
232
+ | download | 下载代码 | `(value: string) => void` | 调用 downloadCode 方法时 |
233
+ | fullscreen | 全屏状态变化 | `(isFullscreen: boolean) => void` | 进入/退出全屏时 |
234
+
235
+ ### Methods(实例方法)
236
+
237
+ 通过 ref 可以调用组件的实例方法:
238
+
239
+ ```vue
240
+ <template>
241
+ <CodeEditor ref="editorRef" v-model="code" />
242
+ </template>
243
+
244
+ <script setup lang="ts">
245
+ import { ref } from 'vue'
246
+ import { CodeEditor } from '@tuoyuan/code-editor'
247
+ import type { CodeEditorInstance } from '@tuoyuan/code-editor'
248
+ import '@tuoyuan/code-editor/dist/style.css'
249
+
250
+ const editorRef = ref<CodeEditorInstance>()
251
+ </script>
252
+ ```
253
+
254
+ **可用方法列表:**
255
+
256
+ | 方法名 | 说明 | 参数 | 返回值 |
257
+ | --- | --- | --- | --- |
258
+ | `format()` | 格式化代码 | - | `void` |
259
+ | `minify()` | 压缩代码 | - | `void` |
260
+ | `getValue()` | 获取编辑器内容 | - | `string` |
261
+ | `setValue(value)` | 设置编辑器内容 | `value: string` | `void` |
262
+ | `refresh()` | 刷新编辑器布局 | - | `void` |
263
+ | `copyCode()` | 复制代码到剪贴板 | - | `Promise<boolean>` |
264
+ | `downloadCode(filename?)` | 下载代码为文件 | `filename?: string` | `void` |
265
+ | `toggleFullscreen()` | 切换全屏状态 | - | `void` |
266
+ | `enterFullscreen()` | 进入全屏模式 | - | `void` |
267
+ | `exitFullscreen()` | 退出全屏模式 | - | `void` |
268
+ | `editor` | 获取 Monaco Editor 实例 | - | `editor.IStandaloneCodeEditor` |
269
+
270
+ **方法示例:**
271
+
272
+ ```typescript
273
+ // 格式化代码
274
+ editorRef.value?.format()
275
+
276
+ // 压缩代码
277
+ editorRef.value?.minify()
278
+
279
+ // 获取代码内容
280
+ const code = editorRef.value?.getValue()
281
+
282
+ // 设置代码内容
283
+ editorRef.value?.setValue('console.log("new code")')
284
+
285
+ // 复制代码
286
+ const success = await editorRef.value?.copyCode()
287
+
288
+ // 下载代码(自动根据语言生成文件名)
289
+ editorRef.value?.downloadCode()
290
+
291
+ // 下载代码(指定文件名)
292
+ editorRef.value?.downloadCode('my-script.js')
293
+
294
+ // 全屏相关
295
+ editorRef.value?.toggleFullscreen() // 切换全屏
296
+ editorRef.value?.enterFullscreen() // 进入全屏
297
+ editorRef.value?.exitFullscreen() // 退出全屏
298
+
299
+ // 刷新布局(在容器大小变化时使用)
300
+ editorRef.value?.refresh()
301
+
302
+ // 获取原生 Monaco Editor 实例
303
+ const monacoEditor = editorRef.value?.editor
304
+ ```
305
+
306
+ ## ⚙️ 配置
307
+
308
+ ### 样式导入
309
+
310
+ **必须**导入组件样式才能正常显示:
311
+
312
+ ```typescript
313
+ import '@tuoyuan/code-editor/dist/style.css'
314
+ ```
315
+
316
+ ### Vite 配置(可选)
317
+
318
+ 如果在使用 Vite 时遇到构建问题,可以在 `vite.config.ts` 中添加以下配置:
319
+
320
+ ```typescript
321
+ import { defineConfig } from 'vite'
322
+ import vue from '@vitejs/plugin-vue'
323
+
324
+ export default defineConfig({
325
+ plugins: [vue()],
326
+ optimizeDeps: {
327
+ exclude: ['monaco-editor'], // 排除 Monaco Editor 的预构建
328
+ },
329
+ })
330
+ ```
331
+
332
+ **注意:** 本组件已经内置了 Monaco Editor 的 Worker 配置,**无需额外配置**,开箱即用!
333
+
334
+ ## 🎨 功能详解
335
+
336
+ ### 工具栏
337
+
338
+ 组件内置工具栏包含以下功能:
339
+
340
+ **左侧:**
341
+ - **语言选择器**:下拉框切换 JavaScript / JSON / SQL
342
+ - **主题选择器**:下拉框切换 浅色 / 深色 / 高对比度
343
+
344
+ **右侧:**
345
+ - **美化代码按钮**:格式化当前代码
346
+ - **压缩代码按钮**:压缩当前代码(移除空格和换行)
347
+
348
+ ### 状态栏
349
+
350
+ 编辑器底部状态栏显示以下信息:
351
+
352
+ **左侧:**
353
+ - 当前光标位置(行号、列号)
354
+ - 总行数
355
+ - 总字符数
356
+
357
+ **右侧:**
358
+ - 保存按钮(支持 Ctrl+S 快捷键)
359
+ - 当前语言
360
+ - 编码格式(UTF-8)
361
+
362
+ ### 代码格式化
363
+
364
+ 支持以下语言的代码格式化:
365
+
366
+ - **JavaScript**:使用 `js-beautify`,支持缩进、换行等配置
367
+ - **JSON**:使用 `js-beautify`,自动格式化 JSON 结构
368
+ - **SQL**:使用 `sql-formatter`,格式化 SQL 语句
369
+
370
+ ### 快捷键
371
+
372
+ | 快捷键 | 功能 |
373
+ | --- | --- |
374
+ | `Ctrl + S` / `Cmd + S` | 保存代码(触发 save 事件) |
375
+ | `ESC` | 退出全屏模式 |
376
+
377
+ ### 全屏模式
378
+
379
+ - 调用 `toggleFullscreen()` 或 `enterFullscreen()` 进入全屏
380
+ - 全屏时编辑器会覆盖整个屏幕(`position: fixed`, `z-index: 9999`)
381
+ - 按 `ESC` 键或调用 `exitFullscreen()` 退出全屏
382
+ - 进入/退出全屏时会自动刷新编辑器布局
383
+
384
+ ## 💡 常见问题
385
+
386
+ ### 1. Monaco Editor Worker 错误?
387
+
388
+ 本组件已经内置了 Worker 配置,**无需额外配置**。如果仍然看到 worker 相关警告,可以忽略,不影响功能使用。
389
+
390
+ ### 2. 如何自定义编辑器配置?
391
+
392
+ 可以通过 `options` 属性传入 Monaco Editor 的原生配置:
393
+
394
+ ```vue
395
+ <CodeEditor
396
+ v-model="code"
397
+ :options="{
398
+ fontSize: 16,
399
+ lineHeight: 24,
400
+ minimap: { enabled: true },
401
+ wordWrap: 'on'
402
+ }"
403
+ />
404
+ ```
405
+
406
+ 完整配置项参考:[Monaco Editor API](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IStandaloneEditorConstructionOptions.html)
407
+
408
+ ### 3. 如何监听代码变化?
409
+
410
+ 有两种方式:
411
+
412
+ ```vue
413
+ <!-- 方式1: v-model -->
414
+ <CodeEditor v-model="code" />
415
+
416
+ <!-- 方式2: @change 事件 -->
417
+ <CodeEditor @change="handleChange" />
418
+ ```
419
+
420
+ ### 4. 如何实现代码保存功能?
421
+
422
+ 监听 `save` 事件,在回调中实现保存逻辑:
423
+
424
+ ```vue
425
+ <CodeEditor @save="handleSave" />
426
+
427
+ <script setup>
428
+ const handleSave = async (code) => {
429
+ // 保存到服务器
430
+ await api.saveCode(code)
431
+ message.success('保存成功')
432
+ }
433
+ </script>
434
+ ```
435
+
436
+ ### 5. 如何设置编辑器的初始语言和主题?
437
+
438
+ ```vue
439
+ <CodeEditor
440
+ v-model="code"
441
+ language="sql"
442
+ theme="vs-dark"
443
+ />
444
+ ```
445
+
446
+ ### 6. 复制和下载功能如何使用?
447
+
448
+ 这些功能需要通过 ref 调用:
449
+
450
+ ```vue
451
+ <template>
452
+ <CodeEditor ref="editorRef" v-model="code" />
453
+ <button @click="editorRef?.copyCode()">复制</button>
454
+ <button @click="editorRef?.downloadCode('script.js')">下载</button>
455
+ </template>
456
+ ```
457
+
458
+ ### 7. 如何隐藏工具栏?
459
+
460
+ 设置 `show-toolbar` 为 `false`:
461
+
462
+ ```vue
463
+ <CodeEditor :show-toolbar="false" />
464
+ ```
465
+
466
+ ## 🏗️ 设计参考
467
+
468
+ 本组件参考了以下项目的实现:
469
+
470
+ 1. **devops-platform** (`/src/components/code-editor/`) - Monaco Editor 基础实现
471
+ 2. **dashboard-manage.web** (`/src/components/common/Codemirror*`) - UI 设计和功能交互
472
+
473
+ 结合了两者的优点:
474
+ - 使用 Monaco Editor 提供强大的编辑器功能和更好的性能
475
+ - 参考 Codemirror 组件的 UI 设计和用户交互体验
476
+ - 内置 Worker 配置,零配置即可使用
477
+
478
+ ## 📝 版本历史
479
+
480
+ ### 1.0.0 (2024-12)
481
+ - ✅ 初始版本发布
482
+ - ✅ 支持 JavaScript、JSON、SQL 语言
483
+ - ✅ 支持代码高亮、格式化、压缩
484
+ - ✅ 内置工具栏(语言/主题选择器、格式化、压缩)
485
+ - ✅ 底部状态栏(光标位置、统计信息、保存按钮)
486
+ - ✅ 支持主题切换(浅色、深色、高对比度)
487
+ - ✅ 支持复制、下载、全屏功能
488
+ - ✅ 支持 Ctrl+S 保存快捷键
489
+ - ✅ 完整的 TypeScript 类型定义
490
+ - ✅ 内置 Monaco Editor Worker 配置
491
+
492
+ ## 📄 License
493
+
494
+ ISC
495
+
496
+ ## 🤝 贡献
497
+
498
+ 欢迎提交 Issue 和 Pull Request!
499
+
500
+ ## 🔗 相关链接
501
+
502
+ - [Monaco Editor 官方文档](https://microsoft.github.io/monaco-editor/)
503
+ - [Monaco Editor API](https://microsoft.github.io/monaco-editor/api/index.html)
504
+ - [js-beautify](https://github.com/beautify-web/js-beautify)
505
+ - [sql-formatter](https://github.com/sql-formatter-org/sql-formatter)