index.hook.ts 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { ref, onBeforeUnmount, nextTick } from 'vue'
  2. import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'
  3. import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'
  4. import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'
  5. // import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'
  6. // import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'
  7. import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'
  8. export const useMonacoEditor = (language = 'javascript') => {
  9. let monacoEditor: monaco.editor.IStandaloneCodeEditor | null = null
  10. let initReadOnly = false
  11. const el = ref<HTMLElement | null>(null)
  12. // @ts-ignore
  13. self.MonacoEnvironment = {
  14. getWorker(_: any, label: string) {
  15. if (label === 'json') {
  16. return new jsonWorker()
  17. }
  18. // if (label === 'css' || label === 'scss' || label === 'less') {
  19. // return new cssWorker()
  20. // }
  21. // if (label === 'html' || label === 'handlebars' || label === 'razor') {
  22. // return new htmlWorker()
  23. // }
  24. if (label === 'typescript' || label === 'javascript') {
  25. return new tsWorker()
  26. }
  27. return new editorWorker()
  28. }
  29. }
  30. // 格式化
  31. const onFormatDoc = async () => {
  32. await monacoEditor?.getAction('monacoEditor.action.formatDocument')?.run()
  33. }
  34. // 更新
  35. const updateVal = (val: string) => {
  36. nextTick(async () => {
  37. monacoEditor?.setValue(val)
  38. initReadOnly && monacoEditor?.updateOptions({ readOnly: false })
  39. await onFormatDoc()
  40. initReadOnly && monacoEditor?.updateOptions({ readOnly: true })
  41. })
  42. }
  43. // 创建实例
  44. const createEditor = (editorOption: monaco.editor.IStandaloneEditorConstructionOptions = {}) => {
  45. if (!el.value) return
  46. const javascriptModel = monaco.editor.createModel('', language)
  47. initReadOnly = !!editorOption.readOnly
  48. // 创建
  49. monacoEditor = monaco.editor.create(el.value, {
  50. model: javascriptModel,
  51. minimap: { enabled: true },
  52. roundedSelection: false,
  53. theme: 'vs-dark',
  54. multiCursorModifier: 'ctrlCmd',
  55. scrollbar: {
  56. verticalScrollbarSize: 8,
  57. horizontalScrollbarSize: 8
  58. },
  59. tabSize: 2,
  60. fontSize: 16, //字体大小
  61. autoIndent: 'advanced', //自动布局
  62. automaticLayout: true, // 自适应宽高
  63. ...editorOption
  64. })
  65. return monacoEditor
  66. }
  67. // 卸载
  68. onBeforeUnmount(() => {
  69. if (monacoEditor) monacoEditor.dispose()
  70. })
  71. return {
  72. el,
  73. updateVal,
  74. getEditor: () => monacoEditor,
  75. createEditor,
  76. onFormatDoc
  77. }
  78. }