npmrun 4 years ago
parent
commit
01c6380c8b
  1. 262
      package-lock.json
  2. 8
      package.json
  3. 158
      script/aa.js
  4. 84
      script/build.ts
  5. 36
      script/code/runCommon.ts
  6. 47
      script/code/runElectron.ts
  7. 54
      script/code/runVite.ts
  8. 80
      script/dev-runner.ts
  9. 58
      script/log.ts
  10. 2
      script/rollup.config.ts
  11. 8
      script/run.js
  12. 24
      src/main/index.ts
  13. 3
      src/render/index.html
  14. 2
      src/render/views/Login/index.tsx
  15. 3
      src/share/index.ts
  16. 2
      types/global.d.ts
  17. 21
      vite.config.ts

262
package-lock.json

@ -1343,7 +1343,7 @@
},
"@types/node": {
"version": "15.14.3",
"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",
"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",
"integrity": "sha1-MwdjuXPQrKy3/czHWU4fsoHtGxw=",
"dev": true
},
@ -1602,6 +1602,12 @@
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true
},
"async": {
"version": "0.9.2",
"resolved": "https://registry.nlark.com/async/download/async-0.9.2.tgz",
"integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
"dev": true
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
@ -1831,6 +1837,16 @@
}
}
},
"camel-case": {
"version": "4.1.2",
"resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-4.1.2.tgz?cache=0&sync_timestamp=1606867297052&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamel-case%2Fdownload%2Fcamel-case-4.1.2.tgz",
"integrity": "sha1-lygHKpVPgFIoIlpt7qazhGHhvVo=",
"dev": true,
"requires": {
"pascal-case": "^3.1.2",
"tslib": "^2.0.3"
}
},
"camelcase": {
"version": "2.1.1",
"resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz?cache=0&sync_timestamp=1603923709404&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-2.1.1.tgz",
@ -1915,6 +1931,15 @@
"resolved": "https://registry.npm.taobao.org/classnames/download/classnames-2.3.1.tgz?cache=0&sync_timestamp=1617400318265&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclassnames%2Fdownload%2Fclassnames-2.3.1.tgz",
"integrity": "sha1-38+jiR4wbsHa0QXQ6I9EF7hTXo4="
},
"clean-css": {
"version": "4.2.3",
"resolved": "https://registry.nlark.com/clean-css/download/clean-css-4.2.3.tgz",
"integrity": "sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g=",
"dev": true,
"requires": {
"source-map": "~0.6.0"
}
},
"cli-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-3.1.0.tgz",
@ -2173,6 +2198,15 @@
"integrity": "sha1-wdfo8eX2z8n/ZfnNNS03NIdWwzM=",
"dev": true
},
"cross-env": {
"version": "7.0.3",
"resolved": "https://registry.nlark.com/cross-env/download/cross-env-7.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcross-env%2Fdownload%2Fcross-env-7.0.3.tgz",
"integrity": "sha1-hlJkspZ33AFbqEGJGJZd0jL8VM8=",
"dev": true,
"requires": {
"cross-spawn": "^7.0.1"
}
},
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.nlark.com/cross-spawn/download/cross-spawn-7.0.3.tgz",
@ -2354,6 +2388,16 @@
"integrity": "sha1-YPOuy4nV+uUgwRqhnvwruYKq3n0=",
"dev": true
},
"dot-case": {
"version": "3.0.4",
"resolved": "https://registry.npm.taobao.org/dot-case/download/dot-case-3.0.4.tgz",
"integrity": "sha1-mytnDQCkMWZ6inW6Kc0bmICc51E=",
"dev": true,
"requires": {
"no-case": "^3.0.4",
"tslib": "^2.0.3"
}
},
"dotenv": {
"version": "10.0.0",
"resolved": "https://registry.nlark.com/dotenv/download/dotenv-10.0.0.tgz?cache=0&sync_timestamp=1621627076012&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdotenv%2Fdownload%2Fdotenv-10.0.0.tgz",
@ -2376,6 +2420,15 @@
"safer-buffer": "^2.1.0"
}
},
"ejs": {
"version": "3.1.6",
"resolved": "https://registry.npm.taobao.org/ejs/download/ejs-3.1.6.tgz",
"integrity": "sha1-W/0KBol0O7UmizVQzO7rvBcCgio=",
"dev": true,
"requires": {
"jake": "^10.6.1"
}
},
"electron": {
"version": "13.1.7",
"resolved": "https://registry.nlark.com/electron/download/electron-13.1.7.tgz",
@ -3387,6 +3440,15 @@
}
}
},
"filelist": {
"version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/filelist/download/filelist-1.0.2.tgz",
"integrity": "sha1-gCAvIUYtTRwuIUEZsYB8G8A4Dls=",
"dev": true,
"requires": {
"minimatch": "^3.0.4"
}
},
"filename-reserved-regex": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/filename-reserved-regex/download/filename-reserved-regex-2.0.0.tgz",
@ -3869,6 +3931,12 @@
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"dev": true
},
"he": {
"version": "1.2.0",
"resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz",
"integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=",
"dev": true
},
"history": {
"version": "4.10.1",
"resolved": "https://registry.nlark.com/history/download/history-4.10.1.tgz",
@ -3905,6 +3973,21 @@
"integrity": "sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k=",
"dev": true
},
"html-minifier-terser": {
"version": "5.1.1",
"resolved": "https://registry.npm.taobao.org/html-minifier-terser/download/html-minifier-terser-5.1.1.tgz",
"integrity": "sha1-ki6W8fO7YIMsJjS3mIQJY4mx8FQ=",
"dev": true,
"requires": {
"camel-case": "^4.1.1",
"clean-css": "^4.2.3",
"commander": "^4.1.1",
"he": "^1.2.0",
"param-case": "^3.0.3",
"relateurl": "^0.2.7",
"terser": "^4.6.3"
}
},
"html-parse-stringify": {
"version": "3.0.1",
"resolved": "https://registry.nlark.com/html-parse-stringify/download/html-parse-stringify-3.0.1.tgz",
@ -4241,6 +4324,76 @@
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true
},
"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",
"integrity": "sha1-68nehVgWCmbYLQ6txqLlj7xQCns=",
"dev": true,
"requires": {
"async": "0.9.x",
"chalk": "^2.4.2",
"filelist": "^1.0.1",
"minimatch": "^3.0.4"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-3.2.1.tgz",
"integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1618995367379&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
"integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz",
"integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.nlark.com/color-name/download/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"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",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz",
"integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"jiti": {
"version": "1.10.1",
"resolved": "https://registry.nlark.com/jiti/download/jiti-1.10.1.tgz",
@ -4465,6 +4618,15 @@
"signal-exit": "^3.0.0"
}
},
"lower-case": {
"version": "2.0.2",
"resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-2.0.2.tgz?cache=0&sync_timestamp=1606867333511&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flower-case%2Fdownload%2Flower-case-2.0.2.tgz",
"integrity": "sha1-b6I3xj29xKgsoP2ILkci3F5jTig=",
"dev": true,
"requires": {
"tslib": "^2.0.3"
}
},
"lowercase-keys": {
"version": "1.0.1",
"resolved": "https://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-1.0.1.tgz",
@ -4791,6 +4953,16 @@
"integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=",
"dev": true
},
"no-case": {
"version": "3.0.4",
"resolved": "https://registry.nlark.com/no-case/download/no-case-3.0.4.tgz",
"integrity": "sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0=",
"dev": true,
"requires": {
"lower-case": "^2.0.2",
"tslib": "^2.0.3"
}
},
"node-abi": {
"version": "2.30.0",
"resolved": "https://registry.nlark.com/node-abi/download/node-abi-2.30.0.tgz",
@ -5190,6 +5362,16 @@
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
"dev": true
},
"param-case": {
"version": "3.0.4",
"resolved": "https://registry.npm.taobao.org/param-case/download/param-case-3.0.4.tgz?cache=0&sync_timestamp=1606867292797&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparam-case%2Fdownload%2Fparam-case-3.0.4.tgz",
"integrity": "sha1-fRf+SqEr3jTUp32RrPtiGcqtAcU=",
"dev": true,
"requires": {
"dot-case": "^3.0.4",
"tslib": "^2.0.3"
}
},
"parse-author": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/parse-author/download/parse-author-2.0.0.tgz",
@ -5220,6 +5402,16 @@
"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
"dev": true
},
"pascal-case": {
"version": "3.1.2",
"resolved": "https://registry.nlark.com/pascal-case/download/pascal-case-3.1.2.tgz",
"integrity": "sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs=",
"dev": true,
"requires": {
"no-case": "^3.0.4",
"tslib": "^2.0.3"
}
},
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.nlark.com/path-exists/download/path-exists-3.0.0.tgz",
@ -5707,6 +5899,12 @@
"resolved": "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz?cache=0&sync_timestamp=1626993001371&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.9.tgz",
"integrity": "sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I="
},
"relateurl": {
"version": "0.2.7",
"resolved": "https://registry.nlark.com/relateurl/download/relateurl-0.2.7.tgz",
"integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
"dev": true
},
"repeating": {
"version": "2.0.1",
"resolved": "https://registry.nlark.com/repeating/download/repeating-2.0.1.tgz",
@ -6345,6 +6543,25 @@
}
}
},
"terser": {
"version": "4.8.0",
"resolved": "https://registry.nlark.com/terser/download/terser-4.8.0.tgz",
"integrity": "sha1-YwVjQ9fHC7KfOvZlhlpG/gOg3xc=",
"dev": true,
"requires": {
"commander": "^2.20.0",
"source-map": "~0.6.1",
"source-map-support": "~0.5.12"
},
"dependencies": {
"commander": {
"version": "2.20.3",
"resolved": "https://registry.nlark.com/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1624609539421&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz",
"integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=",
"dev": true
}
}
},
"throttleit": {
"version": "0.0.2",
"resolved": "https://registry.npm.taobao.org/throttleit/download/throttleit-0.0.2.tgz",
@ -6760,7 +6977,7 @@
},
"vite": {
"version": "2.4.3",
"resolved": "https://registry.nlark.com/vite/download/vite-2.4.3.tgz",
"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",
"integrity": "sha1-/kqnjp3X02vLEuzL1SMTsmz633c=",
"requires": {
"esbuild": "^0.12.8",
@ -6770,6 +6987,47 @@
"rollup": "^2.38.5"
}
},
"vite-plugin-html": {
"version": "2.0.7",
"resolved": "https://registry.npm.taobao.org/vite-plugin-html/download/vite-plugin-html-2.0.7.tgz",
"integrity": "sha1-VROf+KhDujs9XNSGEMpvav33wj0=",
"dev": true,
"requires": {
"ejs": "^3.1.6",
"fs-extra": "^9.1.0",
"html-minifier-terser": "^5.1.1"
},
"dependencies": {
"fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.nlark.com/fs-extra/download/fs-extra-9.1.0.tgz",
"integrity": "sha1-WVRGDHZKjaIJS6NVS/g55rmnyG0=",
"dev": true,
"requires": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-6.1.0.tgz?cache=0&sync_timestamp=1604161797011&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsonfile%2Fdownload%2Fjsonfile-6.1.0.tgz",
"integrity": "sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6",
"universalify": "^2.0.0"
}
},
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/universalify/download/universalify-2.0.0.tgz?cache=0&sync_timestamp=1603179967633&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-2.0.0.tgz",
"integrity": "sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc=",
"dev": true
}
}
},
"vite-plugin-windicss": {
"version": "1.2.5",
"resolved": "https://registry.nlark.com/vite-plugin-windicss/download/vite-plugin-windicss-1.2.5.tgz",

8
package.json

@ -4,13 +4,11 @@
"description": "description",
"main": "dist/electron/entry.js",
"scripts": {
"dev": "ts-node -r tsconfig-paths/register script/dev-runner --env=development --watch",
"dev": "node script/run --command=ts-node -r tsconfig-paths/register script/dev-runner --watch",
"build": "ts-node -r tsconfig-paths/register script/build --env=production && npm run package",
"devaa": "npm run dev:all",
"dev:all": "concurrently -n=vue,ele -c=green,blue \"npm run dev:vue\" \"npm run dev:ele\"",
"dev:vue": "vite",
"dev:vue": "node script/before",
"dev:ele": "node -r ts-node/register script/build-main --env=development --watch",
"dev:test": "electron-forge start --inspect-electron",
"package": "electron-forge package",
@ -37,11 +35,13 @@
"cfonts": "^2.9.3",
"chalk": "^4.1.1",
"concurrently": "^6.2.0",
"cross-env": "^7.0.3",
"dotenv": "^10.0.0",
"electron": "^13.1.7",
"execa": "^5.1.1",
"ts-node": "^10.1.0",
"tsconfig-paths": "^3.10.1",
"vite-plugin-html": "^2.0.7",
"vitejs-plugin-electron": "^0.1.3"
},
"dependencies": {

158
script/aa.js

@ -1,158 +0,0 @@
// @ts-nocheck
const electron = require("electron")
const execa = require("execa")
const vite = require("vite")
const path = require("path")
const fs = require("fs")
const os = require("os")
const esbuild = require("esbuild")
const { say } = require("cfonts")
const { spawn } = require("child_process")
const chalk = require("chalk")
function getEnvScript () {
let script = `process.env={...process.env};`
script += `process.env.RES_DIR = require("path").join(require("path").dirname(process.execPath),"resources/resource/release")`
return script
}
async function buildRender() {
const subprocess = execa("vite",['-c','vite.config.ts']).stdout.pipe(process.stdout);;
setTimeout(() => {
subprocess.killed();
}, 1000);
try {
await subprocess;
} catch (error) {
console.log(subprocess.killed); // true
console.log(error.isCanceled); // true
}
return
let options = {
root: path.join(__dirname, "../src/render"),
enableEsbuild: true,
minify: false,
resolve:{
alias: [
{ find: "@", replacement: path.resolve(__dirname, "src/render") },
{ find: "@render", replacement: path.resolve(__dirname, "src/render") },
{ find: "@main", replacement: path.resolve(__dirname, "src/main") },
{ find: "@src", replacement: path.resolve(__dirname, "src/src") },
{ find: "@root", replacement: __dirname },
],
},
optimizeDeps: {
exclude: ["process"],
},
}
await vite.build(options)
// let htmlPath = path.join(__dirname, "../dist/electron", "index.html")
// let html = fs.readFileSync(htmlPath, { encoding: "utf8" })
// html = html.replace("<head>", `<head><script>${getEnvScript()};</script>`)
// fs.writeFileSync(htmlPath, html)
}
function buildMain() {
let outfile = path.join(process.cwd(), "dist/electron/entry.js")
let entryFilePath = path.join(process.cwd(), "src/main/index.js")
esbuild.buildSync({
entryPoints: [entryFilePath],
outfile,
minify: false,
bundle: true,
platform: "node",
sourcemap: false,
external: ["electron"],
})
let js = `${getEnvScript()}${os.EOL}${fs.readFileSync(outfile)}`
fs.writeFileSync(outfile, js)
}
function startElectron() {
var args = ["--inspect=5858", path.join(__dirname, "../dist/electron/main.js")]
// detect yarn or npm and process commandline args accordingly
if (process.env.npm_execpath.endsWith("yarn.js")) {
args = args.concat(process.argv.slice(3))
} else if (process.env.npm_execpath.endsWith("npm-cli.js")) {
args = args.concat(process.argv.slice(2))
}
// electronProcess = spawn(electron, args)
// electronProcess.stdout.on("data", data => {
// electronLog(data, "blue")
// })
// electronProcess.stderr.on("data", data => {
// electronLog(data, "red")
// })
// electronProcess.on("close", () => {
// if (!manualRestart) process.exit()
// })
}
function logStats(proc, data) {
let log = ""
log += chalk.yellow.bold(`${proc} Process ${new Array(19 - proc.length + 1).join("-")}`)
log += "\n\n"
if (typeof data === "object") {
data
.toString({
colors: true,
chunks: false,
})
.split(/\r?\n/)
.forEach(line => {
log += " " + line + "\n"
})
} else {
log += ` ${data}\n`
}
log += "\n" + chalk.yellow.bold(`${new Array(28 + 1).join("-")}`) + "\n"
console.log(log)
}
function electronLog(data, color) {
let log = ""
data = data.toString().split(/\r?\n/)
data.forEach(line => {
log += ` ${line}\n`
})
if (/[0-9A-z]+/.test(log)) {
console.log(
chalk[color].bold("┏ Electron -------------------") + "\n\n" + log + chalk[color].bold("┗ ----------------------------") + "\n"
)
}
}
function greeting() {
const cols = process.stdout.columns
let text = ""
if (cols > 104) text = "electron-vue"
else if (cols > 76) text = "electron-|vue"
else text = ''
if (text) {
say(text, {
colors: ["yellow"],
font: "simple3d",
space: false,
})
} else console.log(chalk.yellow.bold("\n electron-vue"))
console.log(chalk.blue(" getting ready...") + "\n")
}
function init() {
greeting()
// buildMain()
buildRender()
}
init()

84
script/build.ts

@ -3,97 +3,21 @@
import { main } from "../package.json"
import { join } from "path"
import * as electron from "electron"
import * as dotenv from "dotenv"
import * as ora from "ora"
import * as chalk from "chalk"
import * as minimist from "minimist"
import { buildVite } from "./code/runVite"
import { buildElectron } from "./code/runElectron"
import { buildMain, tscCheck } from "./code/runCommon"
import { exec, spawn, ChildProcess } from "child_process"
import { watch, rollup, OutputOptions } from "rollup"
import { waitOn } from "./utils"
import options from "./rollup.config"
// 注入环境变量
dotenv.config({ path: join(__dirname, "../.env") })
// 解析命令行参数
const argv = minimist(process.argv.slice(2))
// rollup配置
const opts = options(argv.env)
const TAG = "[build-main.ts]"
// 加载图
const spinner = ora(`${TAG} Electron build...`)
function buildVite() {
return new Promise((resolve, reject) => {
let viteProcess = spawn("node", [join(__dirname, "../node_modules/vite/bin/vite.js"), "build"], {
stdio: "pipe",
env: Object.assign(process.env, { NODE_ENV: argv.env }),
})
if (viteProcess) {
viteProcess.stdout.on("end", data => {
console.log(`\n[vite build end]`)
resolve(viteProcess)
})
viteProcess.stderr.on("data", data => {
console.error(`\n[vite build err]: ${data}`)
reject()
})
} else {
reject()
}
})
}
function tscCheck() {
return new Promise((resolve, reject) => {
let tscProcess = spawn("node", [join(__dirname, "../node_modules/typescript/bin/tsc")], {
stdio: "pipe",
env: Object.assign(process.env, { NODE_ENV: argv.env }),
})
if (tscProcess) {
tscProcess.stdout.on("end", data => {
console.log(`[tsc check end]`)
resolve(tscProcess)
})
tscProcess.stderr.on("data", data => {
console.error(`[tsc check err]: ${data}`)
reject()
})
} else {
reject()
}
})
}
async function buildMain() {
try {
const build = await rollup(opts)
build.write(opts.output as OutputOptions)
} catch (error) {
console.log(`\n${TAG} ${chalk.red("构建报错")}\n`, error, "\n")
}
}
function buildElectron() {
return new Promise((resolve, reject) => {
let tscProcess = spawn("node", [join(__dirname, "../node_modules/@electron-forge/cli/dist/electron-forge.js"), "make"], {
stdio: "pipe",
env: Object.assign(process.env, { NODE_ENV: argv.env }),
})
if (tscProcess) {
tscProcess.stdout.on("data", data => {
console.log(`[electron build]: ${data}`)
})
tscProcess.stdout.on("end", data => {
console.log(`[electron build end]`)
resolve(tscProcess)
})
tscProcess.stderr.on("data", data => {
console.error(`[electron build err]: ${data}`)
reject()
})
} else {
reject()
}
})
}
;(async () => {
await tscCheck()
await buildVite()

36
script/code/runCommon.ts

@ -0,0 +1,36 @@
// @ts-nocheck
import { spawn } from "child_process"
import { join } from "path"
import { rollup, OutputOptions } from "rollup"
import * as chalk from "chalk"
import options from "../rollup.config"
export function tscCheck() {
return new Promise((resolve, reject) => {
let tscProcess = spawn("node", [join(__dirname, "../../node_modules/typescript/bin/tsc")], {
stdio: "pipe",
// env: Object.assign(process.env, { NODE_ENV: argv.env }),
})
if (tscProcess) {
tscProcess.stdout.on("end", data => {
console.log(`[tsc check end]`)
resolve(tscProcess)
})
tscProcess.stderr.on("data", data => {
console.error(`[tsc check err]: ${data}`)
reject()
})
} else {
reject()
}
})
}
export async function buildMain() {
try {
const opts = options(process.env.NODE_ENV)
const build = await rollup(opts)
build.write(opts.output as OutputOptions)
} catch (error) {
console.log(`\n${"[build-main.ts]"} ${chalk.red("构建报错")}\n`, error, "\n")
}
}

47
script/code/runElectron.ts

@ -0,0 +1,47 @@
// @ts-nocheck
import { exec, spawn, ChildProcess } from "child_process"
import { join } from "path"
import * as electron from "electron"
import { main } from "../../package.json"
export function devElectron() {
return new Promise((resolve, reject) => {
let electronProcess = spawn(electron as unknown as string, ['--inspect=5858',join(__dirname, `../../${main}`)], {
stdio: "pipe",
// env: Object.assign(process.env, { NODE_ENV: argv.env }),
})
if (electronProcess) {
electronProcess.stdout.on("data", data => {
console.log(`${data}`)
})
resolve(electronProcess)
} else {
reject()
}
})
}
export function buildElectron() {
return new Promise((resolve, reject) => {
let tscProcess = spawn("node", [join(__dirname, "../../node_modules/@electron-forge/cli/dist/electron-forge.js"), "package"], {
stdio: "pipe",
// env: Object.assign(process.env, { NODE_ENV: argv.env }),
})
if (tscProcess) {
tscProcess.stdout.on("data", data => {
console.log(`[electron build]: ${data}`)
})
tscProcess.stdout.on("end", data => {
console.log(`[electron build end]`)
resolve(tscProcess)
})
tscProcess.stderr.on("data", data => {
console.error(`[electron build err]: ${data}`)
reject()
})
} else {
reject()
}
})
}

54
script/code/runVite.ts

@ -0,0 +1,54 @@
// @ts-nocheck
import { exec, spawn, ChildProcess } from "child_process"
import { join } from "path"
export function devVite() {
return new Promise((resolve, reject) => {
let viteProcess = spawn("node", [join(__dirname, "../../node_modules/vite/bin/vite.js")], {
stdio: "pipe",
// env: Object.assign(process.env, { NODE_ENV: argv.env }),
})
if (viteProcess) {
let isReady = false
viteProcess.stdout.on("data", data => {
console.log(`${data}`)
if (!isReady && data.indexOf("ready") != -1) {
resolve(viteProcess)
}
})
viteProcess.stderr.on("data", data => {
console.error(`[vite err]: ${data}`)
reject()
})
viteProcess.on("close", code => {
console.log(`[vite close]: exited with code ${code}`)
reject()
})
} else {
reject()
}
})
}
export function buildVite() {
return new Promise((resolve, reject) => {
let viteProcess = spawn("node", [join(__dirname, "../../node_modules/vite/bin/vite.js"), "build"], {
stdio: "pipe",
// env: Object.assign(process.env, { NODE_ENV: argv.env }),
})
if (viteProcess) {
viteProcess.stdout.on("end", data => {
console.log(`\n[vite build end]`)
resolve(viteProcess)
})
viteProcess.stderr.on("data", data => {
console.error(`\n[vite build err]: ${data}`)
reject()
})
} else {
reject()
}
})
}

80
script/dev-runner.ts

@ -1,76 +1,18 @@
// @ts-nocheck
import { main } from "../package.json"
import { join } from "path"
import * as electron from "electron"
import * as dotenv from "dotenv"
import * as ora from "ora"
import * as chalk from "chalk"
import * as minimist from "minimist"
import { devVite } from "./code/runVite"
import { devElectron } from "./code/runElectron"
import { exec, spawn, ChildProcess } from "child_process"
import { watch, rollup, OutputOptions } from "rollup"
import { waitOn } from "./utils"
import { ChildProcess } from "child_process"
import { watch } from "rollup"
import options from "./rollup.config"
// 注入环境变量
dotenv.config({ path: join(__dirname, "../.env") })
// 解析命令行参数
const argv = minimist(process.argv.slice(2))
// rollup配置
const opts = options(argv.env)
const TAG = "[build-main.ts]"
// 加载图
const spinner = ora(`${TAG} Electron build...`)
console.log(join(__dirname, "../node_modules/.bin/vite"))
function runVite() {
return new Promise((resolve, reject) => {
let viteProcess = spawn("node", [`D:/1XYX/pro/vite-electron/node_modules/vite/bin/vite.js`], {
stdio: "pipe",
env: Object.assign(process.env, { NODE_ENV: argv.env }),
})
if (viteProcess) {
let isReady = false
viteProcess.stdout.on("data", data => {
// console.log(`${data}`)
if (!isReady && data.indexOf("ready") != -1) {
resolve(viteProcess)
}
})
viteProcess.stderr.on("data", data => {
console.error(`[vite err]: ${data}`)
reject()
})
viteProcess.on("close", code => {
console.log(`[vite close]: exited with code ${code}`)
reject()
})
} else {
reject()
}
})
}
function runElectron() {
return new Promise((resolve, reject) => {
let electronProcess = spawn(electron as unknown as string, [join(__dirname, `../${main}`)], {
stdio: "pipe",
env: Object.assign(process.env, { NODE_ENV: argv.env }),
})
if (electronProcess) {
resolve(electronProcess)
} else {
reject()
}
})
}
const opts = options(process.env.NODE_ENV)
const TAG = "[build-main.ts]"
;(async () => {
let vitePorcess = await runVite()
console.log('[vite]', chalk.green(`vite ready.`))
let vitePorcess = await devVite()
console.log("[vite]", chalk.green(`vite ready.`))
const watcher = watch(opts)
let child: ChildProcess | null
let manualRestart = false
@ -78,7 +20,7 @@ function runElectron() {
const log = chalk.green(`change -- ${filename}`)
console.log(TAG, log)
})
watcher.on("event",async ev => {
watcher.on("event", async ev => {
if (ev.code === "END") {
if (child && child.kill) {
manualRestart = true
@ -89,8 +31,8 @@ function runElectron() {
}, 5000)
}
try {
child = await runElectron()
console.log('[electron]', chalk.green(`electron ready.`))
child = await devElectron()
console.log("[electron]", chalk.green(`electron ready.`))
child.on("close", () => {
if (!manualRestart) {
vitePorcess.kill()

58
script/log.ts

@ -0,0 +1,58 @@
const { say } = require("cfonts")
const chalk = require("chalk")
export function logStats(proc, data) {
let log = ""
log += chalk.yellow.bold(`${proc} Process ${new Array(19 - proc.length + 1).join("-")}`)
log += "\n\n"
if (typeof data === "object") {
data
.toString({
colors: true,
chunks: false,
})
.split(/\r?\n/)
.forEach(line => {
log += " " + line + "\n"
})
} else {
log += ` ${data}\n`
}
log += "\n" + chalk.yellow.bold(`${new Array(28 + 1).join("-")}`) + "\n"
console.log(log)
}
export function electronLog(data, color) {
let log = ""
data = data.toString().split(/\r?\n/)
data.forEach(line => {
log += ` ${line}\n`
})
if (/[0-9A-z]+/.test(log)) {
console.log(
chalk[color].bold("┏ Electron -------------------") + "\n\n" + log + chalk[color].bold("┗ ----------------------------") + "\n"
)
}
}
export function greeting() {
const cols = process.stdout.columns
let text
if (cols > 104) text = "electron-vue"
else if (cols > 76) text = "electron-|vue"
else text = false
if (text) {
say(text, {
colors: ["yellow"],
font: "simple3d",
space: false,
})
} else console.log(chalk.yellow.bold("\n electron-vue"))
console.log(chalk.blue(" getting ready...") + "\n")
}

2
script/rollup.config.ts

@ -9,6 +9,8 @@ const alias = require("@rollup/plugin-alias")
const {nodeResolve} = require("@rollup/plugin-node-resolve")
export default (env = "production") => {
console.log(env);
const options: RollupOptions = {
input: join(__dirname, "../src/main/index.ts"),
output: {

8
script/run.js

@ -0,0 +1,8 @@
const crossEnv = require("cross-env")
crossEnv([
"NO=123",
"PORT=3344",
"NODE_ENV=development",
"ts-node -r tsconfig-paths/register script/dev-runner --watch"
])

24
src/main/index.ts

@ -2,12 +2,26 @@
* electron
*/
import "@src/common/patch"
import * as dotenv from "dotenv"
import Shared from "../share"
const { join } = require("path")
dotenv.config({ path: join(__dirname, "../../.env") })
const { app, BrowserWindow } = require("electron")
let win
Shared.data = {
mainWindow: null,
floatWindow: null,
miniWindow: null,
forceClose: false,
}
let isDev = process.env.NODE_ENV == "development" ? true : false
if (!isDev) {
global.__static = require('path')
.join(__dirname, '/resource')
.replace(/\\/g, '\\\\')
}
let win;
function createWin() {
// 创建浏览器窗口dsa
@ -17,13 +31,13 @@ function createWin() {
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
preload: join(__dirname, "../../src/preload/index.js"),
// preload: join(__dirname, "../../src/preload/index.js"),
},
})
const URL = app.isPackaged
? `file://${join(__dirname, "./index.html")}` // vite 构建后的静态文件地址
: `http://localhost:${process.env.PORT}/#/login` // vite 启动的服务器地址
: `http://localhost:${process.env.PORT}/#/` // vite 启动的服务器地址
win?.loadURL(URL)
}

3
src/render/index.html

@ -6,10 +6,11 @@
<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>Vite App</title>
<title><%- title %></title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/main.tsx"></script>
</body>
</html>

2
src/render/views/Login/index.tsx

@ -28,7 +28,7 @@ export default function Login(props: any) {
<div style={{background:"red"}}>
<button onClick={()=>i18n.changeLanguage(i18n.language=='en'?'zh':'en')}>{i18n.language=='en'?'zh':'en'}</button>
<h1>{t('home')}</h1>
<h1>{t('home')}</h1>
<h1>{usename}</h1>
<h1>{password}</h1>
<h2><Trans>home</Trans></h2>

3
src/share/index.ts

@ -0,0 +1,3 @@
export default {
data: {}
}

2
types/global.d.ts

@ -6,3 +6,5 @@ interface IAny{
interface IAction extends IAny{
type: string
}

21
vite.config.ts

@ -1,13 +1,11 @@
import { defineConfig } from "vite"
import reactRefresh from "@vitejs/plugin-react-refresh"
// import WindiCSS from "vite-plugin-windicss"
const { resolve, join } = require("path")
// import electron from "vitejs-plugin-electron"
import { minifyHtml, injectHtml } from "vite-plugin-html"
require('dotenv').config({ path: join(__dirname, '.env') })
console.log(process.env.NO);
// https://vitejs.dev/config/
export default defineConfig({
@ -20,8 +18,8 @@ export default defineConfig({
},
},
},
server:{
port: +process.env.PORT
server: {
port: +process.env.PORT,
},
build: {
outDir: resolve(__dirname, "dist/electron"),
@ -41,5 +39,14 @@ export default defineConfig({
},
},
// electron()
plugins: [reactRefresh(),],
plugins: [
reactRefresh(),
minifyHtml(),
injectHtml({
injectData: {
title: "vite-plugin-htmlaa-example",
// injectScript: '<script src="./inject.js"></script>',
},
}),
],
})

Loading…
Cancel
Save