Làm cách nào tôi có thể tích hợp Monaco với Vue.js?


8

Tôi đã tạo một ứng dụng vue mới và chạy npm install -s monaco-editor, sau đó tôi đã thay đổi App.vue của mình thành như sau:

<template>
    <div id="app" style="width: 500px; height: 500px;">
        <div ref="editor" style="width: 500px; height: 500px;"></div>
  </div>
</template>

<script>
import * as monaco from 'monaco-editor';

export default {
  name: 'app',
  async mounted() {
    const el = this.$refs.editor;
    this.editor = monaco.editor.create(el, {
      value: "console.log('hello world');",
      language: 'javascript',
    });
  },
};
</script>

Khi tôi chạy ứng dụng, tôi thấy các mục sau trong bảng điều khiển JavaScript:

Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/Microsoft/monaco-editor#faq simpleWorker.js:31
You must define a function MonacoEnvironment.getWorkerUrl or MonacoEnvironment.getWorker 2 simpleWorker.js:33
Error: "Unexpected usage"
    loadForeignModule editorSimpleWorker.js:494
    _foreignProxy webWorker.js:54
languageFeatures.js:209
    _doValidate languageFeatures.js:209

Tôi đã thử tìm kiếm lỗi nhưng hầu hết các luồng dường như tập trung vào việc truy cập tệp qua tệp: /// mà tôi không làm (Tôi đang truy cập máy chủ web nút).

Ngoài ra, trình chỉnh sửa không hiển thị chính xác trừ khi chiều cao được chỉ định rõ ràng - Tôi không nghĩ đó là hành vi dự kiến.

Làm cách nào để làm cho trình soạn thảo monaco hoạt động chính xác trong Vue? Tôi muốn tránh các trình bao bọc của bên thứ ba không chính thức như https://github.com/egoist/vue-monaco nếu có thể vì lý do hỗ trợ.

Node / Vue newbie, vì vậy hãy tốt đẹp!


Bạn đã tìm thấy một giải pháp cho điều này? Tìm kiếm một ví dụ bản thân mình.
Marin

Không, tôi chỉ thêm một tiền thưởng cho câu hỏi :)
testUser12

Câu trả lời:



2

Hãy thử chỉ định webpackplugin monaco trong cấu hình webpack của bạn:

const monacoWebpackPlugin = require('monaco-editor/webpack')

...

plugins: [
  new monacoWebpackPlugin()
]

Hoặc cài đặt monaco-Editor-webpack-plugin và thử sử dụng thay thế:

const monacoWebpackPlugin = require('monaco-editor-webpack-plugin')

...

plugins: [
  new monacoWebpackPlugin()
]

Đối với heightwidth, bạn có thể nghe cửa sổ thay đổi kích thước và gọi editor.layout()hoặc tính toán kích thước vùng chứa và chuyển kích thước cho editor.layout()phương thức (1) .

Hoặc bạn có thể thử một cái gì đó từ các câu trả lời được đăng khác trong các chủ đề tương tự, ví dụ:

<div ref="editor" class="monaco-editor"></div>
.monaco-editor {
  height: 100vh;
  overflow: hidden;
}

body {
  margin: 0;
  padding: 0;
}

Hoặc thứ gì đó giống thế này:

.monaco-editor {
  position: absolute; 
  left: 0; 
  top: 0;
  width: 100%; 
  height: 100%; 
  max-height: 100% !important;
  margin: 0; 
  padding: 0;
  overflow: hidden;
}

monaco-biên tập webpack-plugin (từ Microsoft) chắc chắn công trình, nhưng tùy chọn đầu tiên require('monaco-editor/webpack')không, trên cài đặt của tôi - không có là /webpacktrên node_modules/monaco-editor. Làm thế nào / những gì bạn đã cài đặt?
eric99

@ eric99 thành thật, tôi không thể nhớ liệu phương pháp đầu tiên có hiệu quả với tôi hay không, nhưng vì một số lý do tôi đã có nó trong một trong các dự án của mình. Tôi không biết, tôi chỉ đưa nó vào đây
Alex Hoffman

Ok - package.jsontrong số các dự án có thể thông báo.
eric99

Tôi tìm thấy một gotcha khác (có thể là nhỏ). Kích thước trình soạn thảo không đáp ứng. Nếu nói mở devtools sau khi tải ban đầu và thay đổi độ rộng, trình chỉnh sửa không thay đổi kích thước. Tôi đã đọc ở đâu đó rằng trong quá monaco.editor.create()trình soạn thảo có kích thước từ phần tử container. Sẽ rất tuyệt nếu có hành vi tương tự như Mã VS.
eric99

@ eric99 bạn chỉ có thể nghe cửa sổ thay đổi kích thước và gọi editor.layout()hoặc tính kích thước vùng chứa và chuyển kích thước cho editor.layout()phương thức
Alex Hoffman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.