diff --git a/package.json b/package.json index f9924d4f95..bbb50b3aa0 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "license": "MPL-2.0", "scripts": { "lint": "eslint .", - "lint:fix": "eslint . --fix" + "lint:fix": "eslint . --fix", + "gui:dev": "cd packages/gui && pnpm dev" }, "devDependencies": { "@antfu/eslint-config": "^3.16.0", diff --git a/packages/gui/.env b/packages/gui/.env index 55c49958bf..5c5a6c11b5 100644 --- a/packages/gui/.env +++ b/packages/gui/.env @@ -1,2 +1,2 @@ -VUE_APP_PUBLISH_URL=http://dev-sidecar.docmirror.cn/update/ -VUE_APP_PUBLISH_PROVIDER=generic +VITE_PUBLISH_URL=http://dev-sidecar.docmirror.cn/update/ +VITE_PUBLISH_PROVIDER=generic diff --git a/packages/gui/.gitignore b/packages/gui/.gitignore index a1010b6745..7ebec3d65d 100644 --- a/packages/gui/.gitignore +++ b/packages/gui/.gitignore @@ -1,6 +1,7 @@ .DS_Store node_modules /dist +/out # local env files diff --git a/packages/gui/babel.config.cjs b/packages/gui/babel.config.cjs deleted file mode 100644 index 0a932f18f5..0000000000 --- a/packages/gui/babel.config.cjs +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - presets: [ - '@vue/babel-preset-jsx', - ], -} diff --git a/packages/gui/electron-builder.config.cjs b/packages/gui/electron-builder.config.cjs deleted file mode 100644 index 9a860b31e5..0000000000 --- a/packages/gui/electron-builder.config.cjs +++ /dev/null @@ -1,104 +0,0 @@ -const publishUrl = process.env.VUE_APP_PUBLISH_URL -const publishProvider = process.env.VUE_APP_PUBLISH_PROVIDER - -/** @type {import('electron-builder').Configuration} */ -module.exports = { - appId: 'dev-sidecar', - productName: 'dev-sidecar', - artifactName: 'DevSidecar-${version}-${arch}.${ext}', - copyright: 'Copyright © 2020-' + new Date().getFullYear() + ' Greper, WangLiang, CuteOmega', - directories: { - output: 'dist_electron', - buildResources: 'build', - }, - files: [ - { - from: 'dist', - to: 'dist', - filter: [ - '**/*', - '!win-*/**/*', - '!mac-*/**/*', - '!linux-*/**/*', - '!*.zip', - '!*.dmg', - '!*.blockmap', - '!*.exe', - '!*.AppImage', - '!*.deb', - '!*.rpm', - '!*.tar.gz', - '!*.flatpak', - '!builder-*.yml', - '!builder-*.yaml', - ], - }, - 'src/**/*', - 'package.json', - 'extra/**/*', - ], - extraResources: [ - { - from: 'extra', - to: 'extra', - }, - ], - afterPack: './pkg/after-pack.cjs', - afterAllArtifactBuild: './pkg/after-all-artifact-build.cjs', - nsis: { - oneClick: false, - perMachine: true, - allowElevation: true, - allowToChangeInstallationDirectory: true, - }, - win: { - icon: 'build/icons/', - target: [ - { - target: 'nsis', - arch: ['x64', 'ia32', 'arm64'], - }, - ], - }, - linux: { - icon: 'build/mac/', - target: [ - { - target: 'deb', - arch: ['x64', 'arm64', 'armv7l'], - }, - { - target: 'AppImage', - arch: ['x64', 'arm64', 'armv7l'], - }, - { - target: 'tar.gz', - arch: ['x64', 'arm64', 'armv7l'], - }, - { - target: 'rpm', - arch: ['x64', 'arm64', 'armv7l'], - }, - { - target: 'flatpak', - arch: ['x64'], - }, - ], - appId: 'cn.docmirror.DevSidecar', - category: 'System', - }, - mac: { - icon: './build/mac/icon.icns', - target: { - target: 'dmg', - arch: ['x64', 'arm64', 'universal'], - }, - category: 'public.app-category.developer-tools', - }, - publish: publishProvider - ? { - provider: publishProvider, - url: publishUrl, - } - : undefined, -} diff --git a/packages/gui/electron-builder.yml b/packages/gui/electron-builder.yml new file mode 100644 index 0000000000..0bb5e12b61 --- /dev/null +++ b/packages/gui/electron-builder.yml @@ -0,0 +1,85 @@ +appId: dev-sidecar +productName: dev-sidecar +artifactName: DevSidecar-${version}-${arch}.${ext} +copyright: Copyright © 2020-2026 Greper, WangLiang, CuteOmega + +directories: + output: dist_electron + buildResources: build + +files: + - from: out/main + to: out/main + filter: ['**/*'] + - from: out/renderer + to: out/renderer + filter: ['**/*'] + - from: out/preload + to: out/preload + filter: ['**/*'] + - from: src/main/bridge + to: out/main + filter: ['mitmproxy.js'] + - package.json + - extra/**/* + +extraResources: + - from: extra + to: extra + +afterPack: ./pkg/after-pack.cjs +afterAllArtifactBuild: ./pkg/after-all-artifact-build.cjs + +nsis: + oneClick: false + perMachine: true + allowElevation: true + allowToChangeInstallationDirectory: true + +win: + icon: build/icons/ + target: + - target: nsis + arch: + - x64 + - ia32 + - arm64 + +linux: + icon: build/mac/ + target: + - target: deb + arch: + - x64 + - arm64 + - armv7l + - target: AppImage + arch: + - x64 + - arm64 + - armv7l + - target: tar.gz + arch: + - x64 + - arm64 + - armv7l + - target: rpm + arch: + - x64 + - arm64 + - armv7l + - target: flatpak + arch: + - x64 + appId: cn.docmirror.DevSidecar + category: System + +mac: + icon: ./build/mac/icon.icns + target: + target: dmg + arch: + - x64 + - arm64 + - universal + category: public.app-category.developer-tools diff --git a/packages/gui/electron.vite.config.mjs b/packages/gui/electron.vite.config.mjs new file mode 100644 index 0000000000..cf8abee33c --- /dev/null +++ b/packages/gui/electron.vite.config.mjs @@ -0,0 +1,106 @@ +import { defineConfig, externalizeDepsPlugin } from 'electron-vite' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import { resolve } from 'path' +import fs from 'fs' + +// 复制 mitmproxy.js 到输出目录的插件 +function copyMitmproxyPlugin() { + return { + name: 'copy-mitmproxy', + closeBundle() { + const src = resolve(__dirname, 'src/main/bridge/mitmproxy.js') + const dest = resolve(__dirname, 'out/main/mitmproxy.js') + if (fs.existsSync(src)) { + fs.copyFileSync(src, dest) + console.log('✓ mitmproxy.js copied to out/main/') + } + } + } +} + +export default defineConfig({ + main: { + build: { + outDir: 'out/main', + rollupOptions: { + external: [ + 'electron', + '@starknt/sysproxy', + '@starknt/sysproxy-linux-arm64-gnu', + '@starknt/shutdown-handler-napi', + '@starknt/shutdown-handler-napi-linux-arm64-gnu', + ], + }, + }, + plugins: [ + externalizeDepsPlugin(), + copyMitmproxyPlugin() + ], + resolve: { + alias: { + '@': resolve(__dirname, 'src/main'), + }, + }, + define: { + 'global.GENTLY': true, + }, + }, + preload: { + build: { + outDir: 'out/preload', + lib: { + entry: resolve(__dirname, 'src/preload/index.js'), + formats: ['cjs'], + fileName: () => 'index.js', + }, + rollupOptions: { + external: ['electron'], + }, + }, + plugins: [externalizeDepsPlugin()], + }, + renderer: { + root: resolve(__dirname, 'src/renderer'), + base: './', + publicDir: resolve(__dirname, 'public'), + build: { + outDir: resolve(__dirname, 'out/renderer'), + rollupOptions: { + input: { + index: resolve(__dirname, 'src/renderer/index.html'), + }, + output: { + manualChunks(id) { + if (id.includes('node_modules')) { + if (id.includes('vue') || id.includes('vue-router') || id.includes('ant-design-vue')) { + return 'vendor' + } + } + }, + }, + }, + }, + plugins: [ + vue(), + vueJsx(), + ], + resolve: { + alias: { + '@': resolve(__dirname, 'src/renderer/src') + }, + }, + css: { + preprocessorOptions: { + scss: {}, + }, + }, + define: { + 'global.GENTLY': true, + }, + server: { + port: 8080, + open: false, + }, + }, +}) diff --git a/packages/gui/linux-arm64.vue.config.js b/packages/gui/linux-arm64.vue.config.js deleted file mode 100644 index 58e4337573..0000000000 --- a/packages/gui/linux-arm64.vue.config.js +++ /dev/null @@ -1,94 +0,0 @@ -const path = require('node:path') -const { defineConfig } = require('@vue/cli-service') -const webpack = require('webpack') - -const publishUrl = process.env.VUE_APP_PUBLISH_URL -const publishProvider = process.env.VUE_APP_PUBLISH_PROVIDER -console.log('Publish url:', publishUrl) - -module.exports = defineConfig({ - pages: { - index: { - entry: 'src/main.js', - title: 'DevSidecar-给开发者的边车辅助工具', - }, - }, - lintOnSave: false, - configureWebpack: { - plugins: [ - new webpack.DefinePlugin({ 'global.GENTLY': true }), - ], - module: { - rules: [ - { - test: /\.json5$/i, - loader: 'json5-loader', - options: { - esModule: false, - }, - type: 'javascript/auto', - }, - ], - }, - }, - pluginOptions: { - electronBuilder: { - mainProcessFile: './src/background.js', - // Ref: https://github.com/nklayman/vue-cli-plugin-electron-builder/issues/1891 - customFileProtocol: './', - externals: [ - '@starknt/sysproxy', - '@starknt/sysproxy-linux-arm64-gnu', - '@starknt/shutdown-handler-napi', - '@starknt/shutdown-handler-napi-linux-arm64-gnu', - ], - nodeIntegration: true, - // Provide an array of files that, when changed, will recompile the main process and restart Electron - // Your main process file will be added by default - mainProcessWatch: ['src/bridge', 'src/*.js', 'node_modules/dev-sidecar/src'], - builderOptions: { - afterPack: './pkg/after-pack.js', - afterAllArtifactBuild: './pkg/after-all-artifact-build.js', - // artifactBuildCompleted: './pkg/artifact-build-completed.js', - // builderOptions: { - // publish: ['github']// 此处写入github 就好,不用添加其他内容 - // }, - extraResources: [ - { - from: 'extra', - to: 'extra', - }, - ], - appId: 'cn.docmirror.DevSidecar', - productName: 'dev-sidecar', - // eslint-disable-next-line no-template-curly-in-string - artifactName: 'DevSidecar-${version}-${arch}.${ext}', - copyright: 'Copyright © 2020-' + new Date().getFullYear() + ' Greper, WangLiang, CuteOmega', - nsis: { - oneClick: false, - perMachine: true, - allowElevation: true, - allowToChangeInstallationDirectory: true, - }, - linux: { - icon: 'build/mac/', - target: [ - { - target: 'flatpak', - arch: ['arm64', 'armv7l'], - }, - ], - category: 'System', - }, - publish: { - provider: publishProvider, - url: publishUrl, - // url: 'http://dev-sidecar.docmirror.cn/update/preview/', - }, - }, - chainWebpackMainProcess (config) { - config.entry('mitmproxy').add(path.join(__dirname, 'src/bridge/mitmproxy.js')) - }, - }, - }, -}) diff --git a/packages/gui/package.json b/packages/gui/package.json index 0790fca76f..d580705f70 100644 --- a/packages/gui/package.json +++ b/packages/gui/package.json @@ -3,7 +3,7 @@ "version": "2.1.0", "private": false, "type": "module", - "main": "src/background.js", + "main": "out/main/index.js", "author": { "email": "xiaojunnuo@qq.com", "name": "Greper" @@ -11,16 +11,17 @@ "license": "MPL-2.0", "homepage": "https://github.com/docmirror/dev-sidecar", "scripts": { - "serve": "pnpm exec vue-cli-service serve", - "build": "pnpm exec vue-cli-service build", - "lint": "pnpm exec vue-cli-service lint", - "electron": "node ../../_script/electron-dev.mjs", - "electron:build": "pnpm run build && pnpm exec electron-builder --config electron-builder.config.cjs", - "postinstall": "pnpm exec electron-builder install-app-deps", - "postuninstall": "pnpm exec electron-builder install-app-deps", - "electron:icons": "pnpm exec electron-icon-builder --input=./public/logo/win.png --output=build --flatten", - "electron:icons-mac": "pnpm exec electron-icon-builder --input=./public/logo/mac.png --output=build --flatten", - "electron:icons-black": "pnpm exec electron-icon-builder --input=./public/logo/win-black.png --output=build/black --flatten" + "dev": "electron-vite dev --watch", + "build": "electron-vite build", + "preview": "electron-vite preview", + "lint": "eslint .", + "electron": "electron-vite dev", + "electron:build": "electron-vite build && electron-builder", + "postinstall": "electron-builder install-app-deps", + "postuninstall": "electron-builder install-app-deps", + "electron:icons": "electron-icon-builder --input=./public/logo/win.png --output=build --flatten", + "electron:icons-mac": "electron-icon-builder --input=./public/logo/mac.png --output=build --flatten", + "electron:icons-black": "electron-icon-builder --input=./public/logo/win-black.png --output=build/black --flatten" }, "dependencies": { "@docmirror/dev-sidecar": "workspace:*", @@ -31,7 +32,6 @@ "adm-zip": "^0.5.17", "ant-design-vue": "^4.2.6", "archiver": "^7.0.1", - "core-js": "^3.49.0", "electron-baidu-tongji": "^1.0.5", "electron-updater": "^6.8.3", "json5": "^2.2.3", @@ -39,27 +39,23 @@ "minimist": "^1.2.8", "request-progress": "^3.0.0", "sass": "^1.99.0", - "sass-loader": "^16.0.7", "tiny-emitter": "^2.1.0", "vue": "^3.5.33", "vue-router": "^4.6.4", "vue3-json-editor": "^1.1.5" }, "devDependencies": { - "@babel/core": "^7.29.0", - "@babel/plugin-syntax-jsx": "^7.28.6", - "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", - "@vue/babel-preset-jsx": "^1.4.0", - "@vue/cli-plugin-babel": "^5.0.9", - "@vue/cli-service": "^5.0.9", - "concurrently": "^8.2.2", - "cross-env": "^7.0.3", + "@vitejs/plugin-vue": "^6.0.7", + "@vitejs/plugin-vue-jsx": "^5.1.5", "electron": "^41.3.0", "electron-builder": "^26.8.1", "electron-icon-builder": "^2.0.1", - "json5-loader": "^4.0.1", - "path-browserify": "^1.0.1", - "wait-on": "^7.2.0" + "electron-vite": "^5.0.0", + "esbuild": "^0.28.0", + "rollup": "^4.60.4", + "vite": "^8.0.13", + "vite-plugin-electron": "^0.29.1", + "vite-plugin-electron-renderer": "^0.14.7" }, "browserslist": [ "> 1%", diff --git a/packages/gui/src/background/powerMonitor.js b/packages/gui/src/main/background/powerMonitor.js similarity index 100% rename from packages/gui/src/background/powerMonitor.js rename to packages/gui/src/main/background/powerMonitor.js diff --git a/packages/gui/src/bridge/api/backend.js b/packages/gui/src/main/bridge/api/backend.js similarity index 94% rename from packages/gui/src/bridge/api/backend.js rename to packages/gui/src/main/bridge/api/backend.js index 2441882d90..fe6ef892dd 100644 --- a/packages/gui/src/bridge/api/backend.js +++ b/packages/gui/src/main/bridge/api/backend.js @@ -1,13 +1,11 @@ -import fs from 'node:fs' +import fs, { readFileSync } from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' import DevSidecar from '@docmirror/dev-sidecar' import { app, ipcMain } from 'electron' import lodash from 'lodash' import jsonApi from '@docmirror/mitmproxy/src/json.js' -import { createRequire } from 'node:module' -const require = createRequire(import.meta.url) -const pk = require('../../../package.json') +const pk = JSON.parse(readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8')) import coreDefaultConfig from '@docmirror/dev-sidecar/src/config/index.js' import configLoader from '@docmirror/dev-sidecar/src/config/local-config-loader.js' import log from '../../utils/util.log.gui.js' @@ -16,7 +14,12 @@ import dateUtil from '@docmirror/dev-sidecar/src/utils/util.date.js' const { configFromFiles } = coreDefaultConfig const __dirname = path.dirname(fileURLToPath(import.meta.url)) -const mitmproxyPath = path.join(__dirname, '../mitmproxy.js') +// 根据环境判断 mitmproxy.js 的路径 +// electron-vite 开发模式下,主进程构建输出在 out/main/,所以 mitmproxy.js 也在同一目录 +const isDev = process.env.NODE_ENV !== 'production' +const mitmproxyPath = isDev + ? path.join(process.cwd(), 'out', 'main', 'mitmproxy.js') + : path.join(app.getAppPath(), 'out', 'main', 'mitmproxy.js') process.env.DS_EXTRA_PATH = path.join(app.getAppPath(), 'extra') let currentWin diff --git a/packages/gui/src/bridge/api/open-enable-loopback.js b/packages/gui/src/main/bridge/api/open-enable-loopback.js similarity index 82% rename from packages/gui/src/bridge/api/open-enable-loopback.js rename to packages/gui/src/main/bridge/api/open-enable-loopback.js index 2ec3f9ace7..6a09e1307e 100644 --- a/packages/gui/src/bridge/api/open-enable-loopback.js +++ b/packages/gui/src/main/bridge/api/open-enable-loopback.js @@ -1,17 +1,17 @@ import { app } from 'electron' import DevSidecar from '@docmirror/dev-sidecar' import sudoPrompt from '@vscode/sudo-prompt' -import { join } from 'node:path' +import path from 'node:path' import log from '../../utils/util.log.gui.js' const isDevelopment = process.env.NODE_ENV !== 'production' -const extraPath = join(process.cwd(), 'extra') +const extraPath = path.join(process.cwd(), 'extra') export default { open () { const options = { name: 'EnableLoopback', - icns: process.platform === 'darwin' ? join(extraPath, 'icons/icon.icns') : undefined, + icns: process.platform === 'darwin' ? path.join(extraPath, 'icons/icon.icns') : undefined, env: { PARAM: 'VALUE' }, } const exeFile = DevSidecar.api.shell.extraPath.getEnableLoopbackPath() diff --git a/packages/gui/src/bridge/auto-start/backend.js b/packages/gui/src/main/bridge/auto-start/backend.js similarity index 100% rename from packages/gui/src/bridge/auto-start/backend.js rename to packages/gui/src/main/bridge/auto-start/backend.js diff --git a/packages/gui/src/bridge/backend.js b/packages/gui/src/main/bridge/backend.js similarity index 100% rename from packages/gui/src/bridge/backend.js rename to packages/gui/src/main/bridge/backend.js diff --git a/packages/gui/src/bridge/file-selector/backend.js b/packages/gui/src/main/bridge/file-selector/backend.js similarity index 100% rename from packages/gui/src/bridge/file-selector/backend.js rename to packages/gui/src/main/bridge/file-selector/backend.js diff --git a/packages/gui/src/bridge/mitmproxy.js b/packages/gui/src/main/bridge/mitmproxy.js similarity index 100% rename from packages/gui/src/bridge/mitmproxy.js rename to packages/gui/src/main/bridge/mitmproxy.js diff --git a/packages/gui/src/bridge/tongji/backend.js b/packages/gui/src/main/bridge/tongji/backend.js similarity index 100% rename from packages/gui/src/bridge/tongji/backend.js rename to packages/gui/src/main/bridge/tongji/backend.js diff --git a/packages/gui/src/bridge/update/backend.js b/packages/gui/src/main/bridge/update/backend.js similarity index 98% rename from packages/gui/src/bridge/update/backend.js rename to packages/gui/src/main/bridge/update/backend.js index cb39cb24fd..dcc5f5d758 100644 --- a/packages/gui/src/bridge/update/backend.js +++ b/packages/gui/src/main/bridge/update/backend.js @@ -1,4 +1,4 @@ -import fs from 'node:fs' +import fs, { readFileSync } from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' import DevSidecar from '@docmirror/dev-sidecar' @@ -8,9 +8,7 @@ import electronUpdater from 'electron-updater' const { autoUpdater } = electronUpdater import request from 'request' import progress from 'request-progress' -import { createRequire } from 'node:module' -const require = createRequire(import.meta.url) -const pkg = require('../../../package.json') +const pkg = JSON.parse(readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8')) import appPathUtil from '../../utils/util.apppath.js' import log from '../../utils/util.log.gui.js' import { isNewVersion } from '@docmirror/dev-sidecar/src/utils/util.version.js' diff --git a/packages/gui/src/background.js b/packages/gui/src/main/index.js similarity index 96% rename from packages/gui/src/background.js rename to packages/gui/src/main/index.js index 5844616ced..bd327dc94c 100644 --- a/packages/gui/src/background.js +++ b/packages/gui/src/main/index.js @@ -5,6 +5,7 @@ import DevSidecar from '@docmirror/dev-sidecar' import { app, BrowserWindow, dialog, globalShortcut, ipcMain, Menu, nativeImage, nativeTheme, powerMonitor, Tray } from 'electron' import minimist from 'minimist' import backend from './bridge/backend.js' +// Note: bridge, utils, background are now in src/main/ directory import jsonApi from '@docmirror/mitmproxy/src/json.js' import log from './utils/util.log.gui.js' @@ -20,6 +21,11 @@ const staticPath = isDevelopment ? path.resolve('public') : path.join(app.getAppPath(), 'dist') +// preload 脚本路径 +const preloadPath = isDevelopment + ? path.join(process.cwd(), 'out/preload/index.cjs') + : path.join(app.getAppPath(), 'out/preload/index.cjs') + let _powerMonitor = powerMonitor // Keep a global reference of the window object, if you don't, the window will @@ -206,12 +212,10 @@ function createWindow (startHideWindow, autoQuitIfError = true) { height: windowSize.height || 750, title: 'DevSidecar', webPreferences: { - enableRemoteModule: true, - contextIsolation: false, - nativeWindowOpen: true, // ADD THIS - // Use pluginOptions.nodeIntegration, leave this alone - // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info - nodeIntegration: true, // process.env.ELECTRON_NODE_INTEGRATION + preload: preloadPath, + contextIsolation: true, + nodeIntegration: false, + nativeWindowOpen: true, }, show: !startHideWindow, icon: path.join(staticPath, 'icon.png'), @@ -234,15 +238,15 @@ function createWindow (startHideWindow, autoQuitIfError = true) { _powerMonitor.setupMainWindow(win) } - if (process.env.WEBPACK_DEV_SERVER_URL) { + if (process.env.VITE_DEV_SERVER_URL) { // Load the url of the dev server if in development mode - win.loadURL(process.env.WEBPACK_DEV_SERVER_URL) + win.loadURL(process.env.VITE_DEV_SERVER_URL) if (!process.env.IS_TEST) { setTimeout(openDevTools, 2000) } } else { // Load the index.html when not in development - win.loadFile(path.join(app.getAppPath(), 'dist', 'index.html')) + win.loadFile(path.join(app.getAppPath(), 'out', 'renderer', 'index.html')) } if (startHideWindow) { diff --git a/packages/gui/src/utils/util.apppath.js b/packages/gui/src/main/utils/util.apppath.js similarity index 100% rename from packages/gui/src/utils/util.apppath.js rename to packages/gui/src/main/utils/util.apppath.js diff --git a/packages/gui/src/utils/util.log.gui.js b/packages/gui/src/main/utils/util.log.gui.js similarity index 100% rename from packages/gui/src/utils/util.log.gui.js rename to packages/gui/src/main/utils/util.log.gui.js diff --git a/packages/gui/src/preload/index.js b/packages/gui/src/preload/index.js new file mode 100644 index 0000000000..9cff0be956 --- /dev/null +++ b/packages/gui/src/preload/index.js @@ -0,0 +1,19 @@ +const { contextBridge, ipcRenderer, shell } = require('electron') + +// 通过 contextBridge 暴露安全的 API 给渲染进程 +contextBridge.exposeInMainWorld('electron', { + // ipcRenderer 相关方法 + ipcRenderer: { + send: (channel, ...args) => ipcRenderer.send(channel, ...args), + on: (channel, callback) => ipcRenderer.on(channel, callback), + once: (channel, callback) => ipcRenderer.once(channel, callback), + removeListener: (channel, callback) => ipcRenderer.removeListener(channel, callback), + removeAllListeners: (channel) => ipcRenderer.removeAllListeners(channel), + invoke: (channel, ...args) => ipcRenderer.invoke(channel, ...args), + }, + // shell 相关方法 + shell: { + openExternal: (url) => shell.openExternal(url), + openPath: (path) => shell.openPath(path), + }, +}) diff --git a/packages/gui/public/index.html b/packages/gui/src/renderer/index.html similarity index 64% rename from packages/gui/public/index.html rename to packages/gui/src/renderer/index.html index 1b8de0d375..05f6ed4a49 100644 --- a/packages/gui/public/index.html +++ b/packages/gui/src/renderer/index.html @@ -2,10 +2,9 @@ - - - <%= htmlWebpackPlugin.options.title %> + + DevSidecar-给开发者的边车辅助工具 @@ -13,9 +12,9 @@
- +
- + diff --git a/packages/gui/src/view/App.vue b/packages/gui/src/renderer/src/App.vue similarity index 98% rename from packages/gui/src/view/App.vue rename to packages/gui/src/renderer/src/App.vue index de21789538..897eb63ed0 100644 --- a/packages/gui/src/view/App.vue +++ b/packages/gui/src/renderer/src/App.vue @@ -2,11 +2,13 @@ import { h } from 'vue'; import * as Icons from '@ant-design/icons-vue'; -import { ipcRenderer } from 'electron' -import createMenus from '@/view/router/menu' +import createMenus from '@/router/menu' import zhCN from 'ant-design-vue/es/locale/zh_CN' import { colorTheme } from './composables/theme' +// 从 preload 暴露的 electron API 获取 ipcRenderer +const { ipcRenderer } = window.electron + export default { name: 'App', @@ -363,7 +365,7 @@ body { padding: 5px; border-bottom: #eee solid 1px; height: 60px; - background-image: url('../../public/logo/logo-lang.svg'); + background-image: url('/logo/logo-lang.svg'); background-size: auto 50px; background-repeat: no-repeat; background-position: 5px center; diff --git a/packages/gui/src/view/api.js b/packages/gui/src/renderer/src/api.js similarity index 91% rename from packages/gui/src/view/api.js rename to packages/gui/src/renderer/src/api.js index 66e59c7a6b..9dc6680106 100644 --- a/packages/gui/src/view/api.js +++ b/packages/gui/src/renderer/src/api.js @@ -1,6 +1,7 @@ -import { ipcRenderer, shell } from 'electron' import lodash from 'lodash' -import path from 'path' + +// 从 preload 暴露的 electron API 获取 ipcRenderer 和 shell +const { ipcRenderer, shell } = window.electron let inited = false let apiObj = null @@ -39,7 +40,7 @@ export function apiInit (app) { await shell.openExternal(href) }, openPath (file) { - shell.openPath(path.resolve(file)) + shell.openPath(file) }, }, } diff --git a/packages/gui/src/bridge/auto-start/front.js b/packages/gui/src/renderer/src/bridge/auto-start/front.js similarity index 100% rename from packages/gui/src/bridge/auto-start/front.js rename to packages/gui/src/renderer/src/bridge/auto-start/front.js diff --git a/packages/gui/src/bridge/error/front.js b/packages/gui/src/renderer/src/bridge/error/front.js similarity index 100% rename from packages/gui/src/bridge/error/front.js rename to packages/gui/src/renderer/src/bridge/error/front.js diff --git a/packages/gui/src/bridge/file-selector/front.js b/packages/gui/src/renderer/src/bridge/file-selector/front.js similarity index 100% rename from packages/gui/src/bridge/file-selector/front.js rename to packages/gui/src/renderer/src/bridge/file-selector/front.js diff --git a/packages/gui/src/bridge/front.js b/packages/gui/src/renderer/src/bridge/front.js similarity index 93% rename from packages/gui/src/bridge/front.js rename to packages/gui/src/renderer/src/bridge/front.js index c52a2e72c7..b03fcef58d 100644 --- a/packages/gui/src/bridge/front.js +++ b/packages/gui/src/renderer/src/bridge/front.js @@ -4,7 +4,7 @@ import error from './error/front' import fileSelector from './file-selector/front' import onClose from './on-close/front' import tongji from './tongji/front' -import update from './update/front' +import update from './update/front.jsx' const modules = { // api, // 核心接口模块 diff --git a/packages/gui/src/bridge/on-close/front.js b/packages/gui/src/renderer/src/bridge/on-close/front.js similarity index 100% rename from packages/gui/src/bridge/on-close/front.js rename to packages/gui/src/renderer/src/bridge/on-close/front.js diff --git a/packages/gui/src/bridge/tongji/front.js b/packages/gui/src/renderer/src/bridge/tongji/front.js similarity index 94% rename from packages/gui/src/bridge/tongji/front.js rename to packages/gui/src/renderer/src/bridge/tongji/front.js index 4d54f3bc8b..f46f033a27 100644 --- a/packages/gui/src/bridge/tongji/front.js +++ b/packages/gui/src/renderer/src/bridge/tongji/front.js @@ -52,11 +52,13 @@ function ebtRenderer (ipcRenderer, siteId, router) { ipcRenderer.send('electron-baidu-tongji-message', siteId) } +// 从 preload 暴露的 electron API 获取 ipcRenderer +const { ipcRenderer } = window.electron + export default { install (app, api, router) { const BAIDU_SITE_ID = 'f2d170ce560aef0005b689f28697f852' // 百度统计 - const { ipcRenderer } = require('electron') ebtRenderer(ipcRenderer, BAIDU_SITE_ID, router) }, ebtRenderer, diff --git a/packages/gui/src/bridge/update/front.js b/packages/gui/src/renderer/src/bridge/update/front.jsx similarity index 100% rename from packages/gui/src/bridge/update/front.js rename to packages/gui/src/renderer/src/bridge/update/front.jsx diff --git a/packages/gui/src/view/components/container.vue b/packages/gui/src/renderer/src/components/container.vue similarity index 100% rename from packages/gui/src/view/components/container.vue rename to packages/gui/src/renderer/src/components/container.vue diff --git a/packages/gui/src/view/components/setup-ca.vue b/packages/gui/src/renderer/src/components/setup-ca.vue similarity index 100% rename from packages/gui/src/view/components/setup-ca.vue rename to packages/gui/src/renderer/src/components/setup-ca.vue diff --git a/packages/gui/src/view/components/tree-node.vue b/packages/gui/src/renderer/src/components/tree-node.vue similarity index 100% rename from packages/gui/src/view/components/tree-node.vue rename to packages/gui/src/renderer/src/components/tree-node.vue diff --git a/packages/gui/src/view/composables/theme.js b/packages/gui/src/renderer/src/composables/theme.js similarity index 100% rename from packages/gui/src/view/composables/theme.js rename to packages/gui/src/renderer/src/composables/theme.js diff --git a/packages/gui/src/view/index.js b/packages/gui/src/renderer/src/index.js similarity index 92% rename from packages/gui/src/view/index.js rename to packages/gui/src/renderer/src/index.js index 0d498f02eb..4ee7e89be8 100644 --- a/packages/gui/src/view/index.js +++ b/packages/gui/src/renderer/src/index.js @@ -1,4 +1,4 @@ -import modules from '../bridge/front' +import modules from './bridge/front' import { apiInit, useApi } from './api' import status from './status' diff --git a/packages/gui/src/main.js b/packages/gui/src/renderer/src/main.js similarity index 81% rename from packages/gui/src/main.js rename to packages/gui/src/renderer/src/main.js index 0f067b140e..1c77babcc4 100644 --- a/packages/gui/src/main.js +++ b/packages/gui/src/renderer/src/main.js @@ -1,14 +1,16 @@ import antd from 'ant-design-vue' import { createApp } from 'vue'; import { createRouter, createWebHashHistory } from 'vue-router'; -import { ipcRenderer } from 'electron' -import view from './view' -import App from './view/App.vue' -import DsContainer from './view/components/container' -import routes from './view/router' +import view from './' +import App from './App.vue' +import DsContainer from './components/container.vue' +import routes from './router' import 'ant-design-vue/dist/reset.css' -import './view/style/index.scss' -import './view/style/theme/dark.scss' // 暗色主题 +import './style/index.scss' +import './style/theme/dark.scss' // 暗色主题 + +// 从 preload 暴露的 electron API 获取 ipcRenderer +const { ipcRenderer } = window.electron try { window.onerror = (message, source, lineno, colno, error) => { @@ -29,11 +31,11 @@ try { routes, // (缩写) 相当于 routes: routes }) const app = createApp(App) - + app.use(antd) app.use(router) app.component('DsContainer', DsContainer) - + view.initApi(app).then(async (api) => { // 初始化status try { diff --git a/packages/gui/src/view/mixins/plugin.js b/packages/gui/src/renderer/src/mixins/plugin.js similarity index 98% rename from packages/gui/src/view/mixins/plugin.js rename to packages/gui/src/renderer/src/mixins/plugin.js index bff7b52f96..3add575fc4 100644 --- a/packages/gui/src/view/mixins/plugin.js +++ b/packages/gui/src/renderer/src/mixins/plugin.js @@ -1,5 +1,5 @@ import lodash from 'lodash' -import DsContainer from '../components/container' +import DsContainer from '../components/container.vue' export default { components: { diff --git a/packages/gui/src/view/pages/help.vue b/packages/gui/src/renderer/src/pages/help.vue similarity index 94% rename from packages/gui/src/view/pages/help.vue rename to packages/gui/src/renderer/src/pages/help.vue index 64994feaec..982b831e49 100644 --- a/packages/gui/src/view/pages/help.vue +++ b/packages/gui/src/renderer/src/pages/help.vue @@ -3,7 +3,7 @@ import { defineComponent } from 'vue'; import { ProfileOutlined } from '@ant-design/icons-vue' import Plugin from '../mixins/plugin' -import TreeNode from '../components/tree-node' +import TreeNode from '../components/tree-node.vue' export default defineComponent({ name: 'Help', diff --git a/packages/gui/src/view/pages/index.vue b/packages/gui/src/renderer/src/pages/index.vue similarity index 99% rename from packages/gui/src/view/pages/index.vue rename to packages/gui/src/renderer/src/pages/index.vue index 9c93a37b43..757238fd99 100644 --- a/packages/gui/src/view/pages/index.vue +++ b/packages/gui/src/renderer/src/pages/index.vue @@ -1,8 +1,8 @@