electron-vite vue3离线使用monaco-editor

embedded/2024/9/20 1:30:01/ 标签: electron, vue.js, 前端

目录

electron-vite%20%E9%A1%B9%E7%9B%AE-toc" style="margin-left:0px;">1.搭建一个 electron-vite 项目

2.安装monaco-editor和vite-plugin-monaco-editor

electron.vite.config.mjs%E9%85%8D%E7%BD%AE-toc" style="margin-left:0px;">3.electron.vite.config.mjs配置

4.创建 worker.js并在main.js 引入

5.创建组件 MonacoVite.vue 组件

6. App.vue中引入组件

7.运行测试


electron-vite%20%E9%A1%B9%E7%9B%AE">1.搭建一个 electron-vite 项目

pnpm create @quick-start/electron

参考链接:

1.Getting Started | electron-vite

2. Electron⚡️Vite | Electron⚡️Vite

2.Electron⚡️Vite

然后按照提示操作即可!

✔ Project name: … <electron-app>
✔ Select a framework: › vue
✔ Add TypeScript? … No / Yes
✔ Add Electron updater plugin? … No / Yes
✔ Enable Electron download mirror proxy? … No / YesScaffolding project in ./<electron-app>...
Done.

2.安装monaco-editor和vite-plugin-monaco-editor

pnpm install monaco-editor
pnpm i vite-plugin-monaco-editor

electron.vite.config.mjs%E9%85%8D%E7%BD%AE">3.electron.vite.config.mjs配置

import monacoEditorPlugin from 'vite-plugin-monaco-editor';
plugins: [vue(),monacoEditorPlugin ]

electron.vite.config.mjs

import { resolve } from 'path'
import { defineConfig, externalizeDepsPlugin } from 'electron-vite'
import vue from '@vitejs/plugin-vue'
import monacoEditorPlugin from 'vite-plugin-monaco-editor';
export default defineConfig({main: {plugins: [externalizeDepsPlugin()]},preload: {plugins: [externalizeDepsPlugin()]},renderer: {resolve: {alias: {'@renderer': resolve('src/renderer/src')}},plugins: [vue(),monacoEditorPlugin ]}
})

4.创建 worker.js并在main.js 引入

worker.js

import * as monaco from 'monaco-editor';
import EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
import JsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
import CssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';
import HtmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';
import TsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';self.MonacoEnvironment = {getWorker(_, label) {if (label === 'json') {return new JsonWorker();}if (label === 'css' || label === 'scss' || label === 'less') {return new CssWorker();}if (label === 'html' || label === 'handlebars' || label === 'razor') {return new HtmlWorker();}if (label === 'typescript' || label === 'javascript') {return new TsWorker();}return new EditorWorker();}
};monaco.languages.typescript.typescriptDefaults.setEagerModelSync(true);

main.js  

import './worker.js'
import './assets/main.css'import { createApp } from 'vue'
import App from './App.vue'
//引入worker.js
import './worker.js'
createApp(App).mount('#app')

5.创建组件 MonacoVite.vue 组件

<template><div :style="{height: height+'px',width: width+'px'}" ref="editorRef"></div></template><script setup>import {defineEmits, defineProps, onMounted, ref, toRaw, watch} from 'vue';import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';const emits = defineEmits(['update:modelValue']);const props = defineProps({height: {type: Number,default: 500,},width: {type: Number,default: 500,},modelValue: {type: String,default: '',},language: {type: String,default: 'json',},theme: {type: String,default: 'vs-dark',}});const editorRef = ref(null);const editorInstance = ref(null);onMounted(() => {if (editorRef.value && !editorInstance.value) {editorInstance.value = monaco.editor.create(editorRef.value, {value: props.modelValue,language: props.language,theme: props.theme,scrollBeyondLastLine: false,});editorInstance.value.onDidChangeModelContent((event) => {emits('update:modelValue', toRaw(editorInstance.value).getValue());});}});// 监听外部code变化,更新内部状态watch(() => props.modelValue, (newVal, oldVal) => {let currValue = toRaw(editorInstance.value).getValue();if (newVal!==currValue){toRaw(editorInstance.value).setValue(newVal)}}, {deep: true});</script>

6. App.vue中引入组件

import MonacoVite from './components/MonacoVite.vue'
 <monaco-vite :width="500" :height="500" v-model:="codedata" language="json"></monaco-vite>

App.vue

<script setup>
import {ref} from 'vue'
import Versions from './components/Versions.vue'
const ipcHandle = () => window.electron.ipcRenderer.send('ping')import MonacoVite from './components/MonacoVite.vue'
const codedata=ref("123")</script><template><monaco-vite :width="800" :height="800" v-model:="codedata" language="json"></monaco-vite><div class="actions"><div class="action"><a href="https://electron-vite.org/" target="_blank" rel="noreferrer">Documentation</a></div><div class="action"><a target="_blank" rel="noreferrer" @click="ipcHandle">Send IPC</a></div></div><Versions />
</template>

7.运行测试

参考链接:

1.GitHub - microsoft/monaco-editor: A browser based code editor

2.https://www.npmjs.com/package/vite-plugin-monaco-editor

3.Vue3 Vite Monaco Editor - boommanpro

4.在 vite-vue3.x 中的使用 vscode monaco-editor 方法 | NoteZ_技术博客


http://www.ppmy.cn/embedded/111732.html

相关文章

011复杂度06斐波那契数复杂度

视频地址:011复杂度06斐波那契数复杂度_哔哩哔哩_bilibili 菲波纳粹数列的一个方法&#xff0c;一个是这个&#xff0c;一个是这个&#xff0c;一个是递归版本&#xff0c;一个是非递归版本&#xff0c;我们来估算一下它们的复杂度啊&#xff0c;首先我们先算一下这个那这个复…

记录近期iOS开发几个报错及解决方案

记录近期iOS开发几个报错&#xff5e; 1、报错&#xff1a;SDK does not contain ‘libarclite’ at the path ‘/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a’; try increasing the minimum …

几何概率模型

一、几何概率模型 ① 样本空间的样本点为无限个 ② 每个样本点发生的可能性是均等的 ③ P(A)事件A的几何度量值/样本空间的几何度量值 说明&#xff1a;如果样本空间的样本点为有限个&#xff0c;则为古典概型 通过2个例子&#xff0c;来感受下两者的区别 ① 例&#xff1…

心觉:以终为始,帮你精准实现目标

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作169/1000天 假设你的目标是 一年内赚到150万。我们可以通过“以终为始”和“以始为终”的结合来帮助你实现这个目标 以下是完整的…

[论文笔记]ChatQA: Surpassing GPT-4 on Conversational QA and RAG

引言 今天来看一下上篇论文笔记中反复介绍的 ChatQA: Surpassing GPT-4 on Conversational QA and RAG。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 我们介绍了 ChatQA&#xff0c;这是一个模型套件&#xff0c;一…

Java集合接口List

ArrrayList集合 底层数据结构是数组 构造方法 ArrayList()无参构造&#xff0c;构造一个初始容量为10的空列表 ArrayList(int initialCapacity) 构建具有指定初始容量的空列表 ArrayList并不是一new就会创建初始容量为10的空列表&#xff0c;而是调用add方法后创建 A…

架构设计 - 常用日志收集方案选型对比与推荐

目录 1. 常用组合1.1 ELK Stack -> Elastic Stack1.2 EFK Stack1.3 Graylog1.4 PLG 日志系统1.5 Splunk1.6 Filebeat ELK1.7 AWS CloudWatch Logs1.8 阿里云日志服务1.9 腾讯云 CLS&#xff08;日志服务&#xff09; 2. 推荐 日志收集是系统监控和调试中的关键环节。常见的…

二维码的原理以及Java生成二维码【中间带图片】

一、什么是二维码&#xff1a; 二维码 &#xff08;2-dimensional bar code&#xff09;&#xff0c;是用某种特定的几何图形按一定规律在平面&#xff08;二维方向上&#xff09; 分布的黑白相间的图形记录数据符号信息的。 二、常用的码制 Data Matrix, Maxi Code, Aztec,…

linux命令用于删除文本文件中的重复行的命令uniq详解

目录 一、概述 二、基本用法 1、uniq 命令的基本语法 2、常用选项 3、获取帮助 三、主要功能 1. 识别并删除相邻重复行 2. 保留重复行的第一个实例 3. 统计重复次数 4. 忽略指定列的比较 四、示例 1. 删除相邻重复行 2. 显示每一行及其重复次数 3. 只显示重复行 4. …

yolov8 rect batch_shapes 672 图像大小变化

遇到这样一种情况&#xff1a;img_sz640,但在val时&#xff0c;输入网络的张量h和w是672 为什么输入图像会从640变大到672&#xff1f; 这是因为一种rectangle增强方法&#xff0c;“同个batch里做rectangle宽高等比变换&#xff0c; 加快训练 &#xff0c;对于多余的黑边做到…

亚马逊IP关联及其解决方案

在电子商务领域&#xff0c;亚马逊作为全球领先的在线购物平台&#xff0c;吸引了众多商家和个人的参与。然而&#xff0c;随着业务规模的扩大&#xff0c;商家在使用亚马逊服务时可能会遇到IP关联的问题&#xff0c;这不仅影响账户的正常运营&#xff0c;还可能带来一系列不利…

解决idea git比对 contents have differences only in line separators

问题 使用git比对文件时&#xff0c;提示contents have differences only in line separators 解决 rm .git/index git reset

kafka之视频和图片文件

在 Kafka 中存储视频或图片的格式通常取决于应用场景和传输的需求。Kafka 是一种分布式的流处理平台&#xff0c;设计用来处理事件流或消息流&#xff0c;因此在存储和传输视频或图片时&#xff0c;必须将这些二进制数据序列化为合适的格式。以下是视频和图片在 Kafka 中常见的…

Rocky Linux9下安装Docker和卸载Docker

前提条件 安装好Rocky Linux9&#xff0c;可参考 Vmware下安装Rocky Linux9.4 安装Docker 精简版命令 yum install -y yum-utilsyum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum install -y docker-cemkdir -p /etc/do…

数据库设计中的需求分析

在数据库设计中&#xff0c;需求分析 是至关重要的一步。它不仅是设计过程的起点&#xff0c;也是后续步骤的基础。如果需求分析出现问题&#xff0c;那么后续所有设计阶段的结果都会受到影响&#xff0c;最终可能导致整个设计返工&#xff0c;耗费大量时间和资源。因此&#x…

教育培训小程序开发,简单实用的入门指南

教育培训小程序可以帮助教育机构和个人老师提供更灵活的在线教学服务&#xff0c;满足学生的学习需求。对于初学者来说&#xff0c;开发一个功能齐全的教育培训小程序并不复杂&#xff0c;只需掌握一些基础的开发知识和工具即可。本文将带你了解如何使用微信小程序开发工具&…

在云服务器上安装 RabbitMQ:从零到一的最佳实践

&#x1f6e0; 1. RabbitMQ 简介 RabbitMQ 是一个开源的消息代理中间件&#xff0c;广泛应用于高并发、异步任务队列的场景中。在分布式系统架构中&#xff0c;RabbitMQ 可以充当消息的中转站&#xff0c;帮助不同服务之间进行高效的消息通信。 在这篇文章中&#xff0c;我们…

电脑里删除的视频还能恢复吗?不用担心!视频删除后可恢复

在日常生活和工作中&#xff0c;电脑已成为我们不可或缺的工具&#xff0c;其中存储了大量的视频文件。然而&#xff0c;不少人都曾遭遇过这样的困境&#xff1a;由于各种原因&#xff0c;电脑里的视频文件被误删了。 面对这种情况&#xff0c;人们往往会感到焦虑和困惑&#x…

算法day09 二叉树

class Node<V>{V value;Node left;Node right; } 一、用递归和非递归分别实现二叉树的前序&#xff0c;中序&#xff0c;后序遍历 非递归方式&#xff1a; 前序遍历 根左右 0&#xff09;利用stack后进先出的特点 要输出根左右的顺序&#xff0c;将元素右边先放入栈中…

网络层_计算机网络

文章目录 网络层数据平面路由器工作原理网际协议&#xff08;*IP*&#xff09;IPv4IPv6DHCP NAT 控制平面路由选择算法因特网中自治系统内部的路由选择&#xff1a;OSPFISP 之间的路由选择&#xff1a;BGP ICMPSNMP 网络层 尽力而为服务&#xff08;best-effort services&…