Um einige persönliche Essays aufzuzeichnen, habe ich vor Kurzem mit
Als Nächstes werde ich Sie Schritt für Schritt durch die Implementierung dieser Funktion führen. Vue CLI erstellt ein Vue-Projekt Führen Sie Wählen Sie eine benutzerdefinierte Vorlage (Sie können die Standardvorlage von Vue 3 wählen) Wählen Sie Vue3 und TypeScript und wählen Sie weitere Optionen basierend auf Ihrem eigenen Projekt Führen Sie Vue-Projekt in Markdown -Editor umgewandelt Führen Sie TypeScript-Typdefinitionsdatei hinzufügen
Deklariere das Modul "*.vue" { Importtyp {DefineComponent} von „vue“; const-Komponente: DefineComponent<{}, {}, any>; Standardkomponente exportieren; } <!-- Hinzugefügter Inhalt --> Deklarieren Sie das Modul „@kangc/v-md-editor/lib/theme/vuepress.js“; Deklarieren Sie das Modul „@kangc/v-md-editor/lib/plugins/copy-code/index“; Deklarieren Sie das Modul „@kangc/v-md-editor/lib/plugins/line-number/index“; Deklariere das Modul „@kangc/v-md-editor“; Deklarieren Sie das Modul „prismjs“. Transformieren Sie App.vue <Vorlage> <div> <v-md-editor v-model="Inhalt" Höhe="100vh"></v-md-editor> </div> </Vorlage> <script lang="ts"> // Editor importiere VMdEditor von "@kangc/v-md-editor"; importiere "@kangc/v-md-editor/lib/style/base-editor.css"; importiere vuepress von "@kangc/v-md-editor/lib/theme/vuepress.js"; importiere "@kangc/v-md-editor/lib/theme/style/vuepress.css"; // Markieren Sie „import Prism from „prismjs““; importiere "prismjs/components/prism-json"; importiere "prismjs/components/prism-dart"; importiere "prismjs/components/prism-c"; importiere "prismjs/components/prism-swift"; importiere "prismjs/components/prism-kotlin"; importiere "prismjs/components/prism-java"; // Code schnell kopieren importiere createCopyCodePlugin von "@kangc/v-md-editor/lib/plugins/copy-code/index"; importiere "@kangc/v-md-editor/lib/plugins/copy-code/copy-code.css"; // Zeilennummer importiere createLineNumbertPlugin von "@kangc/v-md-editor/lib/plugins/line-number/index"; VMdEditor.use(vuepress, { Prisma, }) .use(createCopyCodePlugin()) .use(createLineNumbertPlugin()); importiere { defineComponent, ref } von "vue"; exportiere StandarddefiniereKomponente({ Name: "App", Komponenten: { VMdEditor }, aufstellen() { const Inhalt = ref(""); gebe { Inhalt } zurück; }, }); </Skript> <Stil> /* Einige Schaltflächen entfernen */ .v-md-icon-speichern, .v-md-icon-vollbild { Anzeige: keine; } </Stil>
Die Wirkung ist wie folgt Vue CLI-Plugin Electron BuilderIch habe versucht, mit Vite 2.0 ein Electron- Projekt zu erstellen, habe aber kein ähnliches Tool gefunden, das Vite und Electron gut kombiniert, sodass ich der Versuchung von Vite 2.0 widerstanden habe. Wenn jemand Empfehlungen hat, teilen Sie sie uns bitte mit. Verwenden Sie zur Installation
Führen Sie
OptimierungVollbildanzeige startenEinführungsbildschirm importiere { screen } von "electron"; Beim Erstellen eines Fensters auf Bildschirmgröße einstellen <!-- Hintergrund.ts --> asynchrone Funktion createWindow() { const { Breite, Höhe } = screen.getPrimaryDisplay().workAreaSize; const win = neues Browserfenster({ Breite, Höhe, // Ausgelassen... }); // Ausgelassen... }
Ändern der MenüleisteDefinieren Sie die Menüleiste <!-- Hintergrund.ts --> const-Vorlage: Array<MenuItemConstructorOptions> = [ { Bezeichnung: "MarkDown", Untermenü: [ { Bezeichnung: "Über", Beschleuniger: „CmdOderStrg+W“, Rolle: "Über", }, { Bezeichnung: "Programm beenden", Beschleuniger: „CmdOderStrg+Q“, Rolle: "beenden", }, ], }, { Bezeichnung: "Datei", Untermenü: [ { Bezeichnung: "Datei öffnen", Beschleuniger: "CmdOderStrg+O", klicken: ( Element: Menüelement, fokussiertesFenster: Browserfenster | undefiniert, _event: Tastaturereignis ) => { // TODO: Datei öffnen}, }, { Bezeichnung: „Speicher“, Beschleuniger: „CmdOderStrg+S“, klicken: ( Element: Menüelement, fokussiertesFenster: Browserfenster | undefiniert, _event: Tastaturereignis ) => { //TODO: Inhalt speichern}, }, ], }, { Beschriftung: "Bearbeiten", Untermenü: [ { Bezeichnung: "Widerrufen", Beschleuniger: „CmdOderStrg+Z“, Rolle: „Rückgängig machen“, }, { Bezeichnung: "Wiederholen", Beschleuniger: „Umschalt+Befehlstaste oder Strg+Z“, Rolle: "Wiederholen", }, { Typ: "Trennzeichen", }, { Beschriftung: "Schnitt", Beschleuniger: „CmdOderStrg+X“, Rolle: "Schnitt", }, { Bezeichnung: "Kopieren", Beschleuniger: "CmdOderStrg+C", Rolle: "Kopie", }, { Bezeichnung: "Einfügen", Beschleuniger: „CmdOderStrg+V“, Rolle: "Einfügen", }, ], }, { Bezeichnung: "Fenster", Rolle: "Fenster", Untermenü: [ { Beschriftung: "Minimieren", Beschleuniger: „CmdOderStrg+M“, Rolle: "minimieren", }, { Bezeichnung: "maximieren", Beschleuniger: „CmdOderStrg+M“, klicken: ( Element: Menüelement, fokussiertesFenster: Browserfenster | undefiniert, _event: Tastaturereignis ) => { if (fokussiertesFenster) { fokussiertesFenster.maximieren(); } }, }, { Typ: "Trennzeichen", }, { Beschriftung: "Vollbild umschalten", Beschleuniger: (Funktion () { wenn (Prozess.Plattform === "darwin") { gibt „Strg+Befehl+F“ zurück; } anders { gib "F11" zurück; } })(), klicken: ( Element: Menüelement, fokussiertesFenster: Browserfenster | undefiniert, // eslint-disable-next-line @typescript-eslint/keine-unused-vars _event: Tastaturereignis ) => { if (fokussiertesFenster) { fokussiertesWindow.setFullScreen(!focusedWindow.isFullScreen()); } }, }, ], }, { Beschriftung: "Hilfe", Rolle: "Hilfe", Untermenü: [ { Beschriftung: „Mehr erfahren“, Klick: Funktion () { shell.openExternal("http://electron.atom.io"); }, }, ], }, ];
Einrichten der Menüleiste importiere { Menü } von "electron"; app.on("bereit", async () => { // Ausgelassen... // MenüMenu.setApplicationMenu erstellen (Menu.buildFromTemplate (Vorlage)); });
Wirkung Der Editor öffnet den Inhalt der Markdonw-DateiDer Hauptthread wählt die Datei aus und übergibt den Dateipfad an den Rendering-Thread. <!-- Hintergrund.ts --> Dialog .showOpenDialog({ Eigenschaften: ["openFile"], Filter: [{ Name: "Benutzerdefinierter Dateityp", Erweiterungen: ["md"] }], }) .then((res) => { wenn (res && res["Dateipfade"].Länge > 0) { const filePath = res["Dateipfade"][0]; // Übergebe die Datei an den Rendering-Thread if (focusedWindow) { focusedWindow.webContents.send("Dateipfad öffnen", Dateipfad); } } }) .catch((err) => { console.log(fehler); });
Der Rendering-Thread erhält den Dateipfad, liest den Dateiinhalt und weist ihn dem Markdown-Editor zu <!-- App.vue --> importiere { ipcRenderer } von "electron"; importiere { readFileSync } von "fs"; exportiere StandarddefiniereKomponente({ // Ausgelassen... aufstellen() { const Inhalt = ref(""); beimMounted(() => { // 1. ipcRenderer.on("open-file-path", (e, Dateipfad: Zeichenfolge) => { if (Dateipfad && Dateipfad.Länge > 0) { // 2. Inhalt.Wert = readFileSync(Dateipfad).toString(); } }); }); gebe { Inhalt } zurück; }, }); Vue fügt Knotenunterstützung hinzu <!-- vue.config.js --> modul.exporte = { Plugin-Optionen: { ElektronenBuilder: { nodeIntegration: wahr, }, }, }; Wirkung Speichern Sie den Inhalt von markdonw in der DateiDer Hauptthread initiiert eine Anfrage an den Rendering-Thread, um den Editor-Inhalt abzurufen. <!-- Hintergrund.js --> if (fokussiertesFenster) { fokussiertWindow.webContents.send("get-content", ""); } Der Rendering-Thread gibt den Editor-Inhalt an den Haupt-Thread zurück. <!-- App.vue --> beimMounted(() => { ipcRenderer.on("get-content", () => { ipcRenderer.send("Inhalt speichern", Inhalt.Wert); }); }); Der Hauptthread empfängt den Inhalt und speichert ihn in der Datei <!-- Hintergrund.ts --> // Datei speichern ipcMain.on("save-content", (event: unknown, content: string) => { if (openedFile.length > 0) { // Direkt in die Datei speichern try { writeFileSync(geöffneteDatei, Inhalt); console.log("Erfolgreich gespeichert"); } Fehler abfangen { console.log("Speichern fehlgeschlagen"); } } anders { const Optionen = { Titel: "Datei speichern", Standardpfad: "new.md", Filter: [{ Name: "Benutzerdefinierter Dateityp", Erweiterungen: ["md"] }], }; const fokussiertesWindow = BrowserWindow.getFocusedWindow(); if (fokussiertesFenster) { Dialog .showSaveDialog(fokussiertesFenster, Optionen) .then((Ergebnis: Electron.SaveDialogReturnValue) => { if (Ergebnis.Dateipfad) { versuchen { writeFileSync(Ergebnis.Dateipfad, Inhalt); console.log("Erfolgreich gespeichert"); geöffneteDatei = Ergebnis.Dateipfad; } Fehler abfangen { console.log("Speichern fehlgeschlagen"); } } }) .catch((Fehler) => { konsole.log(Fehler); }); } } }); Wirkung PackLegen Sie den Namen und das Bild der Anwendung fest <!-- vue.config.js --> modul.exporte = { Plugin-Optionen: { ElektronenBuilder: { nodeIntegration: wahr, // Einstellungen hinzugefügt builderOptions: { Anwendungs-ID: "com.johnny.markdown", productName: "JJMarkDown", // Anwendungsname copyright: "Copyright © 2021", // Copyright-Erklärung mac: { Symbol: "./public/icon.icns", // Symbol }, }, }, }, }; Bereiten Sie ein 1024*1024-Bild für die Icon.icns-Generierung vor und erstellen Sie im selben Verzeichnis einen Ordner mit dem Namen Erstellen Sie Bilddateien verschiedener Größen Schlucke -z 16 16 icon.png -o icons.iconset/icon_16x16.png sips -z 32 32 icon.png -o icons.iconset/[email protected] sips -z 32 32 icon.png -o icons.iconset/icon_32x32.png sips -z 64 64 icon.png -o icons.iconset/[email protected] Schlucke -z 128 128 icon.png -o icons.iconset/icon_128x128.png sips -z 256 256 icon.png -o icons.iconset/[email protected] sips -z 256 256 icon.png -o icons.iconset/icon_256x256.png sips -z 512 512 icon.png -o icons.iconset/[email protected] sips -z 512 512 icon.png -o icons.iconset/icon_512x512.png sips -z 1024 1024 icon.png -o icons.iconset/[email protected] Holen Sie sich die Symboldatei mit dem Namen icon.icns iconutil -c icns icons.iconset -o icon.icns Pack npm führt electron:build aus Ergebnis Die erhaltene dmg-Datei kann direkt installiert und verwendet werden. Code <!-- Hintergrund.ts --> "streng verwenden"; importieren { App, Protokoll, Browserfenster, Bildschirm, Speisekarte, Menüpunkt, Hülse, Dialog, ipcHaupt, } von "Elektron"; importiere { KeyboardEvent, MenuItemConstructorOptions } von "electron/main"; importiere { createProtocol } aus „vue-cli-plugin-electron-builder/lib“; importiere installExtension, { VUEJS3_DEVTOOLS } von „electron-devtools-installer“; const isDevelopment = process.env.NODE_ENV !== "Produktion"; importiere { writeFileSync } von "fs"; let geöffneteDatei = ""; // Datei speichern ipcMain.on("save-content", (event: unknown, content: string) => { if (openedFile.length > 0) { // Direkt in die Datei speichern try { writeFileSync(geöffneteDatei, Inhalt); console.log("Erfolgreich gespeichert"); } Fehler abfangen { console.log("Speichern fehlgeschlagen"); } } anders { const Optionen = { Titel: "Datei speichern", Standardpfad: "new.md", Filter: [{ Name: "Benutzerdefinierter Dateityp", Erweiterungen: ["md"] }], }; const fokussiertesWindow = BrowserWindow.getFocusedWindow(); if (fokussiertesFenster) { Dialog .showSaveDialog(fokussiertesFenster, Optionen) .then((Ergebnis: Electron.SaveDialogReturnValue) => { if (Ergebnis.Dateipfad) { versuchen { writeFileSync(Ergebnis.Dateipfad, Inhalt); console.log("Erfolgreich gespeichert"); geöffneteDatei = Ergebnis.Dateipfad; } Fehler abfangen { console.log("Speichern fehlgeschlagen"); } } }) .catch((Fehler) => { konsole.log(Fehler); }); } } }); const-Vorlage: Array<MenuItemConstructorOptions> = [ { Bezeichnung: "MarkDown", Untermenü: [ { Bezeichnung: "Über", Beschleuniger: „CmdOderStrg+W“, Rolle: "Über", }, { Bezeichnung: "Programm beenden", Beschleuniger: „CmdOderStrg+Q“, Rolle: "beenden", }, ], }, { Bezeichnung: "Datei", Untermenü: [ { Bezeichnung: "Datei öffnen", Beschleuniger: "CmdOderStrg+O", klicken: ( Element: Menüelement, fokussiertesFenster: Browserfenster | undefiniert, // eslint-disable-next-line @typescript-eslint/keine-unused-vars _event: Tastaturereignis ) => { Dialog .showOpenDialog({ Eigenschaften: ["openFile"], Filter: [{ Name: "Benutzerdefinierter Dateityp", Erweiterungen: ["md"] }], }) .then((res) => { wenn (res && res["Dateipfade"].Länge > 0) { const filePath = res["Dateipfade"][0]; // Übergebe die Datei an den Rendering-Thread if (focusedWindow) { focusedWindow.webContents.send("Dateipfad öffnen", Dateipfad); geöffneteDatei = Dateipfad; } } }) .catch((err) => { console.log(fehler); }); }, }, { Bezeichnung: „Speicher“, Beschleuniger: „CmdOderStrg+S“, klicken: ( Element: Menüelement, fokussiertesFenster: Browserfenster | undefiniert, // eslint-disable-next-line @typescript-eslint/keine-unused-vars _event: Tastaturereignis ) => { if (fokussiertesFenster) { fokussiertWindow.webContents.send("get-content", ""); } }, }, ], }, { Beschriftung: "Bearbeiten", Untermenü: [ { Bezeichnung: "Widerrufen", Beschleuniger: „CmdOderStrg+Z“, Rolle: „Rückgängig machen“, }, { Bezeichnung: "Wiederholen", Beschleuniger: „Umschalt+Befehlstaste oder Strg+Z“, Rolle: "Wiederholen", }, { Typ: "Trennzeichen", }, { Beschriftung: "Schnitt", Beschleuniger: „CmdOderStrg+X“, Rolle: "Schnitt", }, { Bezeichnung: "Kopieren", Beschleuniger: "CmdOderStrg+C", Rolle: "Kopie", }, { Bezeichnung: "Einfügen", Beschleuniger: „CmdOderStrg+V“, Rolle: "Einfügen", }, ], }, { Bezeichnung: "Fenster", Rolle: "Fenster", Untermenü: [ { Beschriftung: "Minimieren", Beschleuniger: „CmdOderStrg+M“, Rolle: "minimieren", }, { Bezeichnung: "maximieren", Beschleuniger: „CmdOderStrg+M“, klicken: ( Element: Menüelement, fokussiertesFenster: Browserfenster | undefiniert, // eslint-disable-next-line @typescript-eslint/keine-unused-vars _event: Tastaturereignis ) => { if (fokussiertesFenster) { fokussiertesFenster.maximieren(); } }, }, { Typ: "Trennzeichen", }, { Beschriftung: "Vollbild umschalten", Beschleuniger: (Funktion () { wenn (Prozess.Plattform === "darwin") { gibt „Strg+Befehl+F“ zurück; } anders { gib "F11" zurück; } })(), klicken: ( Element: Menüelement, fokussiertesFenster: Browserfenster | undefiniert, // eslint-disable-next-line @typescript-eslint/keine-unused-vars _event: Tastaturereignis ) => { if (fokussiertesFenster) { fokussiertesWindow.setFullScreen(!focusedWindow.isFullScreen()); } }, }, ], }, { Beschriftung: "Hilfe", Rolle: "Hilfe", Untermenü: [ { Beschriftung: „Mehr erfahren“, Klick: Funktion () { shell.openExternal("http://electron.atom.io"); }, }, ], }, ]; Protokoll.registerSchemesAsPrivileged([ { Schema: "App", Berechtigungen: { sicher: wahr, Standard: wahr } }, ]); asynchrone Funktion createWindow() { const { Breite, Höhe } = screen.getPrimaryDisplay().workAreaSize; const win = neues Browserfenster({ Breite, Höhe, Webeinstellungen: { nodeIntegration: wahr, KontextIsolation: falsch, }, }); wenn (Prozess.Umgebung.WEBPACK_DEV_SERVER_URL) { //Laden Sie die URL des Dev-Servers, wenn Sie sich im Entwicklungsmodus befinden warte auf win.loadURL(process.env.WEBPACK_DEV_SERVER_URL als Zeichenfolge); wenn (!process.env.IS_TEST) win.webContents.openDevTools(); } anders { Protokoll erstellen("App"); // Laden Sie die Datei „index.html“, wenn Sie sich nicht in der Entwicklung befinden win.loadURL("app://./index.html"); } } // Beenden, wenn alle Fenster geschlossen sind. app.on("Fenster-alle-geschlossen", () => { // Unter macOS ist es üblich, dass Anwendungen und deren Menüleiste // aktiv bleiben, bis der Benutzer explizit mit Cmd + Q beendet wenn (Prozess.Plattform !== "darwin") { app.quittieren(); } }); app.on("aktivieren", () => { // Unter macOS ist es üblich, ein Fenster in der App neu zu erstellen, wenn das // Auf das Dock-Symbol wird geklickt und es sind keine anderen Fenster geöffnet. wenn (BrowserWindow.getAllWindows().length === 0) createWindow(); }); // Diese Methode wird aufgerufen, wenn Electron fertig ist // Initialisierung und ist bereit zum Erstellen von Browserfenstern. // Einige APIs können erst verwendet werden, nachdem dieses Ereignis eintritt. app.on("bereit", async () => { wenn (isDevelopment && !process.env.IS_TEST) { // Vue Devtools installieren versuchen { warte auf installExtension(VUEJS3_DEVTOOLS); } fangen (e) { console.error("Vue Devtools konnte nicht installiert werden:", e.toString()); } } Fenster erstellen(); // MenüMenu.setApplicationMenu erstellen (Menu.buildFromTemplate (Vorlage)); }); // Auf Anforderung des übergeordneten Prozesses im Entwicklungsmodus sauber beenden. if (istEntwicklung) { wenn (Prozess.Plattform === "win32") { process.on("Nachricht", (Daten) => { wenn (Daten === "ordnungsgemäßer Ausgang") { app.quittieren(); } }); } anders { Prozess.auf("SIGTERM", () => { app.quittieren(); }); } } Dies ist das Ende dieses Artikels mit der detaillierten Erklärung zur Implementierung von Desktop-Anwendungen mit Vue3 und Electron. Weitere relevante Inhalte zu Desktop-Anwendungen mit Vue3 Electron finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Eine kurze Diskussion über die Leistungsprobleme des MySQL-Paging-Limits
>>: Zusammenfassung von 6 Methoden zur Anzeige von Linux-Protokollen
Gemäß dem Koeffizienten von Pi und dem Radius der...
Der Kern ist mysqldump und Runtime Der Vorgang is...
In diesem Artikel werden die pessimistische und d...
Gefühle: Ich bin Backend-Entwickler. Manchmal fühl...
Voraussetzung: content="width=750" <...
Beispielsweise Benutzer, die eine Bildschirmleseso...
Spezifische Methode: 1. Drücken Sie [ Win+R ], um...
Arial Arial ist eine serifenlose TrueType-Schrifta...
Inhaltsverzeichnis Ereignisschleife Ereignisschle...
Seit ich den Mac zurückgegeben habe, liegt mein u...
Heute habe ich auf der Blog-Site shoptalkshow ges...
(I) Grundkonzepte der Farbabstimmung auf Webseiten...
Inhaltsverzeichnis 1. Lernen Sie Teleport kennen ...
Vorwort: Verwenden Sie den Wasserzeicheneffekt im...
Unter Linux treten häufig Situationen auf, in den...