From a191fedd57f451a4f3c67124adc5ded85d5aac65 Mon Sep 17 00:00:00 2001 From: 1549469775 <1549469775@qq.com> Date: Thu, 29 Jul 2021 16:50:39 +0800 Subject: [PATCH] add --- package-lock.json | 22 +++++------ resource/electron/static/icon.png | Bin 7555 -> 18332 bytes script/run.js | 2 +- script/webpack/webpack.main.config.js | 2 +- src/main/float.ts | 14 +++---- src/main/index.ts | 65 ++++++++++++++++----------------- src/main/menu.ts | 25 +++++++------ src/main/util/index.ts | 12 ++++++ src/render/index.html | 1 + test.js | 67 +++++++--------------------------- vite.config.ts | 2 +- 说明.md | 2 + 12 files changed, 94 insertions(+), 120 deletions(-) create mode 100644 src/main/util/index.ts diff --git a/package-lock.json b/package-lock.json index 819b952..d6f7c72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1734,7 +1734,7 @@ }, "@types/node": { "version": "15.14.3", - "resolved": "https://registry.nlark.com/@types/node/download/@types/node-15.14.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-15.14.3.tgz", + "resolved": "https://registry.nlark.com/@types/node/download/@types/node-15.14.3.tgz?cache=0&sync_timestamp=1627257813519&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-15.14.3.tgz", "integrity": "sha1-MwdjuXPQrKy3/czHWU4fsoHtGxw=", "dev": true }, @@ -4492,7 +4492,7 @@ }, "ejs": { "version": "3.1.6", - "resolved": "https://registry.npm.taobao.org/ejs/download/ejs-3.1.6.tgz", + "resolved": "https://registry.nlark.com/ejs/download/ejs-3.1.6.tgz", "integrity": "sha1-W/0KBol0O7UmizVQzO7rvBcCgio=", "dev": true, "requires": { @@ -6365,7 +6365,7 @@ }, "jake": { "version": "10.8.2", - "resolved": "https://registry.npm.taobao.org/jake/download/jake-10.8.2.tgz?cache=0&sync_timestamp=1591684013969&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjake%2Fdownload%2Fjake-10.8.2.tgz", + "resolved": "https://registry.npm.taobao.org/jake/download/jake-10.8.2.tgz", "integrity": "sha1-68nehVgWCmbYLQ6txqLlj7xQCns=", "dev": true, "requires": { @@ -6418,7 +6418,7 @@ }, "escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", + "resolved": "https://registry.nlark.com/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, @@ -7196,7 +7196,7 @@ }, "object.assign": { "version": "4.1.2", - "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.2.tgz?cache=0&sync_timestamp=1604115158081&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.1.2.tgz", + "resolved": "https://registry.nlark.com/object.assign/download/object.assign-4.1.2.tgz", "integrity": "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=", "dev": true, "requires": { @@ -9157,7 +9157,7 @@ "dependencies": { "commander": { "version": "2.20.3", - "resolved": "https://registry.nlark.com/commander/download/commander-2.20.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz", + "resolved": "https://registry.nlark.com/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1627358203890&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz", "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=", "dev": true }, @@ -9174,7 +9174,7 @@ }, "terser": { "version": "5.7.1", - "resolved": "https://registry.nlark.com/terser/download/terser-5.7.1.tgz", + "resolved": "https://registry.nlark.com/terser/download/terser-5.7.1.tgz?cache=0&sync_timestamp=1624884102109&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fterser%2Fdownload%2Fterser-5.7.1.tgz", "integrity": "sha1-LcemEAm2a7Y4MFyyqCR2OxFr94Q=", "dev": true, "requires": { @@ -9185,7 +9185,7 @@ "dependencies": { "source-map": { "version": "0.7.3", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz", + "resolved": "https://registry.nlark.com/source-map/download/source-map-0.7.3.tgz", "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=", "dev": true } @@ -9749,7 +9749,7 @@ }, "vite": { "version": "2.4.3", - "resolved": "https://registry.nlark.com/vite/download/vite-2.4.3.tgz?cache=0&sync_timestamp=1626783291368&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvite%2Fdownload%2Fvite-2.4.3.tgz", + "resolved": "https://registry.nlark.com/vite/download/vite-2.4.3.tgz", "integrity": "sha1-/kqnjp3X02vLEuzL1SMTsmz633c=", "dev": true, "requires": { @@ -9923,7 +9923,7 @@ "dependencies": { "commander": { "version": "7.2.0", - "resolved": "https://registry.nlark.com/commander/download/commander-7.2.0.tgz?cache=0&sync_timestamp=1624609539421&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-7.2.0.tgz", + "resolved": "https://registry.nlark.com/commander/download/commander-7.2.0.tgz?cache=0&sync_timestamp=1627358203890&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-7.2.0.tgz", "integrity": "sha1-o2y1fQtQHOEI5NIFWaFQo5HZerc=", "dev": true } @@ -10515,7 +10515,7 @@ }, "websocket-driver": { "version": "0.7.4", - "resolved": "https://registry.npm.taobao.org/websocket-driver/download/websocket-driver-0.7.4.tgz", + "resolved": "https://registry.nlark.com/websocket-driver/download/websocket-driver-0.7.4.tgz", "integrity": "sha1-ia1Slbv2S0gKvLox5JU6ynBvV2A=", "dev": true, "requires": { diff --git a/resource/electron/static/icon.png b/resource/electron/static/icon.png index 9e7ccc078807b4a98f1542a1c56e4d80c29611c2..b3ab3b8fecc7be9493f89bea4e44cb47eb9aa5e8 100644 GIT binary patch literal 18332 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 Qr|vL#y85}Sb4q9e0A~G3KL7v# literal 7555 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 K#2dAT&;JhxCQA<h diff --git a/script/run.js b/script/run.js index 7493f27..71a4b3a 100644 --- a/script/run.js +++ b/script/run.js @@ -10,7 +10,7 @@ if (argv.build) { "npm run build:in" ]) } else { - crossEnv([ + const process = crossEnv([ `STATIC=${join(__dirname, '../resource/electron/static')}`, "PORT=3344", "NODE_ENV=development", diff --git a/script/webpack/webpack.main.config.js b/script/webpack/webpack.main.config.js index 6256392..bdaae40 100644 --- a/script/webpack/webpack.main.config.js +++ b/script/webpack/webpack.main.config.js @@ -57,7 +57,7 @@ let mainConfig = { if (process.env.NODE_ENV !== 'production') { mainConfig.plugins.push( new webpack.DefinePlugin({ - '__static': `"${join(__dirname, '../../resource/electron/static').replace(/\\/g, '\\\\')}"` + '__static': `"${path.join(__dirname, '../../resource/electron/static').replace(/\\/g, '\\\\')}"` }) ) } diff --git a/src/main/float.ts b/src/main/float.ts index 691e7eb..baa4ffe 100644 --- a/src/main/float.ts +++ b/src/main/float.ts @@ -1,22 +1,19 @@ import Shared from "./share" -import { BrowserWindow, ipcMain, screen, Menu, shell, webContents } from "electron" +import { getFileUrl } from './util' +import { BrowserWindow, ipcMain, screen, Menu, shell, webContents, app } from "electron" // webContents console.log(webContents.getAllWebContents()) const window: any = null //BrowserWindow.fromWebContents(webContents.getFocusedWebContents()) -const winURL = - process.env.NODE_ENV === "development" ? `http://localhost:${process.env.PORT}/#/float` : `file://${__dirname}/index.html#/float` ipcMain.on("@float:setPosition", (event, x, y) => { Shared.data.floatWindow?.setPosition(x, y) }) ipcMain.on("showSuspensionWindow", () => { - console.log(24324) - if (Shared.data.floatWindow) { if (Shared.data.floatWindow.isVisible()) { - createSuspensionWindow() + // createSuspensionWindow() } else { Shared.data.floatWindow.showInactive() } @@ -73,7 +70,8 @@ ipcMain.on("createSuspensionMenu", e => { { label: "退出软件", click: () => { - Shared.data.mainWindow.close() + Shared.data.forceClose = true + app.quit() }, }, ]) @@ -101,7 +99,7 @@ function createSuspensionWindow() { // 设置窗口的位置 注意x轴要桌面的宽度 - 窗口的宽度 Shared.data.floatWindow.setPosition(size.width - winSize[0], 100) Shared.data.floatWindow.setPosition(size.width / 2, size.height / 2) - Shared.data.floatWindow.loadURL(winURL) + Shared.data.floatWindow.loadURL(getFileUrl("float")) Shared.data.floatWindow.once("ready-to-show", () => { Shared.data.floatWindow.show() diff --git a/src/main/index.ts b/src/main/index.ts index dcece78..d429f1e 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,34 +1,32 @@ /** * electron 主文件 */ -'use strict' -import Shared from './share' -import setTray from './disk' +"use strict" +import Shared from "./share" +import setTray from "./disk" +import { getFileUrl } from "./util" // import '../renderer/store' -import './facilities' -import { app, BrowserWindow, dialog } from 'electron' +import "./facilities" +import { app, BrowserWindow, dialog } from "electron" Shared.data = { - mainWindow: null, - floatWindow: null, + mainWindow: null, // 主窗口 + floatWindow: null, // 浮动窗口 miniWindow: null, forceClose: false, - lastChoice: -1, + lastChoice: -1, // 做过的选择 } -console.log('asdasadsads') +console.log("asdasadsads") /** * Set `__static` path to static files in production * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-static-assets.html */ - let isDev = process.env.NODE_ENV == "development" ? true : false +let isDev = process.env.NODE_ENV == "development" ? true : false - if (!isDev) { - // @ts-ignore - global.__static = require("path").join(__dirname, "/static").replace(/\\/g, "\\\\") - } - - -const winURL = process.env.NODE_ENV === 'development' ? `http://localhost:${process.env.PORT}/#/` : `file://${__dirname}/index.html` +if (!isDev) { + // @ts-ignore + global.__static = require("path").join(__dirname, "/static").replace(/\\/g, "\\\\") +} function createWindow() { /** @@ -41,17 +39,18 @@ function createWindow() { resizable: true, minWidth: 450, minHeight: 400, + icon: __static + "/icon.png", // frame: false, // transparent: true, alwaysOnTop: false, webPreferences: { nodeIntegration: true, - contextIsolation: false - } + contextIsolation: false, + }, }) - Shared.data.mainWindow.loadURL(winURL) - Shared.data.mainWindow.on('close', (event:any) => { + Shared.data.mainWindow.loadURL(getFileUrl("")) + Shared.data.mainWindow.on("close", (event: any) => { if (Shared.data.forceClose) { Shared.data.mainWindow = null app.quit() @@ -65,12 +64,12 @@ function createWindow() { event.preventDefault() } else { const choice = dialog.showMessageBoxSync(Shared.data.mainWindow, { - type: 'info', - title: 'Information', + type: "info", + title: "Information", defaultId: 0, cancelId: 0, - message: '确定要关闭吗?', - buttons: ['没事', '最小化到托盘', '直接退出'] + message: "确定要关闭吗?", + buttons: ["没事", "最小化到托盘", "直接退出"], }) if (choice === 1) { Shared.data.lastChoice = 1 @@ -98,10 +97,10 @@ const gotTheLock = app.requestSingleInstanceLock() if (!gotTheLock) { app.exit() } else { - require('./menu') - require('./float') + require("./menu") + require("./float") - app.on('second-instance', (event, commandLine, workingDirectory) => { + app.on("second-instance", (event, commandLine, workingDirectory) => { // 当运行第二个实例时,将会聚焦到mainWindow这个窗口 if (Shared.data.mainWindow) { if (Shared.data.mainWindow.isMinimized()) Shared.data.mainWindow.restore() @@ -110,9 +109,9 @@ if (!gotTheLock) { } }) - app.on('ready', createWindow) + app.on("ready", createWindow) - app.on('before-quit', event => { + app.on("before-quit", event => { if (Shared.data.forceClose) { app.exit() } else { @@ -120,13 +119,13 @@ if (!gotTheLock) { } }) - app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { + app.on("window-all-closed", () => { + if (process.platform !== "darwin") { app.exit() } }) - app.on('activate', () => { + app.on("activate", () => { if (Shared.data.mainWindow === null) { createWindow() } diff --git a/src/main/menu.ts b/src/main/menu.ts index 302cd26..fe14adb 100644 --- a/src/main/menu.ts +++ b/src/main/menu.ts @@ -1,6 +1,7 @@ // const path = require('path') import { BrowserWindow } from "electron" import Shared from "./share" +import { getFileUrl } from "./util" const electron = require("electron") const setTray = require("./disk").default // const BrowserWindow = electron.BrowserWindow @@ -9,12 +10,12 @@ const app = electron.app const dialog = electron.dialog const ipcMain = electron.ipcMain -let newwin:BrowserWindow |null +let newwin: BrowserWindow | null let template = [ { label: "选择保存目录", - click: function (item:any, focusedWindow:BrowserWindow) { + click: function (item: any, focusedWindow: BrowserWindow) { dialog .showOpenDialog(focusedWindow, { properties: ["openDirectory"], @@ -30,7 +31,7 @@ let template = [ { label: "置顶", key: "alwaysTop", - click: function (item: any, focusedWindow:BrowserWindow) { + click: function (item: any, focusedWindow: BrowserWindow) { if (Shared.data.mainWindow.isAlwaysOnTop()) { Shared.data.mainWindow.setAlwaysOnTop(false) } else { @@ -41,7 +42,7 @@ let template = [ { label: "重载", accelerator: "CmdOrCtrl+R", - click: function (item: any, focusedWindow:BrowserWindow) { + click: function (item: any, focusedWindow: BrowserWindow) { if (focusedWindow) { // 重载之后, 刷新并关闭所有的次要窗体 if (focusedWindow.id === 1) { @@ -60,14 +61,14 @@ let template = [ submenu: [ { label: "悬浮窗", - click: function (item: any, focusedWindow:BrowserWindow) { + click: function (item: any, focusedWindow: BrowserWindow) { ipcMain.emit("showSuspensionWindow") }, }, { label: "最小化到托盘", - click: function (item: any, focusedWindow:BrowserWindow) { - Shared.data.lastChoice = 1; + click: function (item: any, focusedWindow: BrowserWindow) { + Shared.data.lastChoice = 1 if (Shared.data.miniWindow) { Shared.data.mainWindow.hide() // 调用 最小化实例方法 } else { @@ -84,7 +85,7 @@ let template = [ return "F11" } })(), - click: function (item: any, focusedWindow:BrowserWindow) { + click: function (item: any, focusedWindow: BrowserWindow) { if (focusedWindow) { focusedWindow.setFullScreen(!focusedWindow.isFullScreen()) } @@ -135,16 +136,16 @@ let template = [ modal: true, show: false, resizable: false, - webPreferences:{ + webPreferences: { nodeIntegration: true, - contextIsolation: false - } + contextIsolation: false, + }, // parent: focusedWindow // win是主窗口 }) // 隐藏菜单 newwin.setMenuBarVisibility(false) // vue是单页面,需要改成多页面才行 - newwin.loadURL(process.env.NODE_ENV === "development" ? `http://localhost:${process.env.PORT}/#/about` : `file://${__dirname}#/about`) + newwin.loadURL(getFileUrl("about")) newwin.on("ready-to-show", () => { newwin?.show() }) diff --git a/src/main/util/index.ts b/src/main/util/index.ts new file mode 100644 index 0000000..52de28f --- /dev/null +++ b/src/main/util/index.ts @@ -0,0 +1,12 @@ + +export function getFileUrl(route: string, isSPA: boolean = true) { + if (isSPA) { + const winURL = + process.env.NODE_ENV === "development" + ? `http://localhost:${process.env.PORT}/#/${route}` + : `file://${__dirname}/index.html#/${route}` + return winURL + } else { + return "" + } +} diff --git a/src/render/index.html b/src/render/index.html index 7339905..8cf9ba4 100644 --- a/src/render/index.html +++ b/src/render/index.html @@ -6,6 +6,7 @@ <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self' https: 'unsafe-inline'; style-src * 'unsafe-inline'; font-src * data:;"> --> <!-- <meta http-equiv="X-Content-Security-Policy" content="default-src 'self' https: 'unsafe-inline'; style-src * 'unsafe-inline'; font-src * data:;"> --> + <!-- --> <title><%- title %></title> </head> <body> diff --git a/test.js b/test.js index e3044ae..f9868ec 100644 --- a/test.js +++ b/test.js @@ -1,57 +1,18 @@ - -// // http://localhost:3344 -// get("http://baidu.com",res=>{ -// console.log(res.statusCode); -// }) -// import { spawn, ChildProcess } from 'child_process' -// spawn( -// electronForge, -// [ -// "start", -// "--inspect-electron", -// "--app-path", -// join(__dirname, "dist/electron/entry.js"),//join(__dirname, `../${main}`), -// ] , -// { -// stdio: 'inherit', -// env: Object.assign(process.env, { NODE_ENV: "development" }), -// }) +const { say } = require("cfonts") const chalk = require("chalk") -const electron = require("electron") -const { spawn } = require("child_process") -const { join } = require("path") -console.log(electron); - -// let child = spawn( -// electron, -// [join(__dirname, `dist/electron/entry.js`)] -// ) - -// if(child){ -// setTimeout(() => { -// child.kill() -// }, 5000); -// } -function runVite () { - return new Promise((resolve, reject) => { - let viteProcess = spawn('node', [`D:/1XYX/pro/vite-electron/node_modules/vite/bin/vite.js`]) - let isReady = false; - viteProcess.stdout.on('data', (data) => { - console.log(`${data}`); - if (!isReady && data.indexOf("ready") != -1) { - resolve() - } - }); - viteProcess.stderr.on('data', (data) => { - console.error(`[vite err]: ${data}`); - reject() - }); - - viteProcess.on('close', (code) => { - console.log(`[vite close]: exited with code ${code}`); - reject() - }); +function electronLog(data, color) { + let log = "" + data = data.toString().split(/\r?\n/) + data.forEach(line => { + log += ` ${line}\n` }) -} \ No newline at end of file + if (/[0-9A-z]+/.test(log)) { + console.log( + chalk[color].bold("┏ Electron -------------------") + "\n\n" + log + chalk[color].bold("┗ ----------------------------") + "\n" + ) + } +} + +electronLog("dfssssssssssssssssssssssssssssssssssssssssssssssss","red") \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index 9efed90..d84ef9a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -58,7 +58,7 @@ export default defineConfig({ minifyHtml(), injectHtml({ injectData: { - title: "vite-plugin-htmlaa-example" + title: "代码片段管理工具" }, }), ], diff --git a/说明.md b/说明.md index 72c397d..a53466d 100644 --- a/说明.md +++ b/说明.md @@ -1,5 +1,7 @@ ### 渲染层 +* 必须使用hash模式,方便 + 全局替换字符 * `__static`: 静态资源字符串,注意没有用引号包裹,不能直接赋值