-
Notifications
You must be signed in to change notification settings - Fork 113
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 605928d
Showing
33 changed files
with
15,945 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
'use strict' | ||
process.env.NODE_ENV = 'production' | ||
|
||
const { say } = require('cfonts') | ||
const { sync } = require('del') | ||
|
||
const chalk = require('chalk') | ||
const rollup = require("rollup") | ||
const { build } = require('vite') | ||
const Multispinner = require('multispinner') | ||
|
||
const mainOptions = require('./rollup.Main.config'); | ||
const rendererOptions = require('./vite.config') | ||
const opt = mainOptions(process.env.NODE_ENV); | ||
|
||
const doneLog = chalk.bgGreen.white(' DONE ') + ' ' | ||
const errorLog = chalk.bgRed.white(' ERROR ') + ' ' | ||
const okayLog = chalk.bgBlue.white(' OKAY ') + ' ' | ||
const isCI = process.env.CI || false | ||
|
||
if (process.env.BUILD_TARGET === 'clean') clean() | ||
else if (process.env.BUILD_TARGET === 'web') web() | ||
else unionBuild() | ||
|
||
function clean() { | ||
sync(['dist/electron/main/*', 'dist/electron/renderer/*', 'dist/web/*', 'build/*', '!build/icons', '!build/lib', '!build/lib/electron-build.*', '!build/icons/icon.*']) | ||
console.log(`\n${doneLog}clear done`) | ||
process.exit() | ||
} | ||
|
||
function unionBuild() { | ||
greeting() | ||
sync(['dist/electron/main/*', 'dist/electron/renderer/*', 'build/*', '!build/icons', '!build/lib', '!build/lib/electron-build.*', '!build/icons/icon.*']) | ||
|
||
const tasks = ['main', 'renderer'] | ||
const m = new Multispinner(tasks, { | ||
preText: 'building', | ||
postText: 'process' | ||
}) | ||
let results = '' | ||
|
||
m.on('success', () => { | ||
process.stdout.write('\x1B[2J\x1B[0f') | ||
console.log(`\n\n${results}`) | ||
console.log(`${okayLog}take it away ${chalk.yellow('`electron-builder`')}\n`) | ||
process.exit() | ||
}) | ||
|
||
rollup.rollup(opt) | ||
.then(build => { | ||
results += `${doneLog}MainProcess build success` + '\n\n' | ||
build.write(opt.output).then(() => { | ||
m.success('main') | ||
}) | ||
}) | ||
.catch(error => { | ||
m.error('main') | ||
console.log(`\n ${errorLog}failed to build main process`) | ||
console.error(`\n${error}\n`) | ||
process.exit(1) | ||
}); | ||
|
||
build(rendererOptions).then(res => { | ||
results += `${doneLog}RendererProcess build success` + '\n\n' | ||
m.success('renderer') | ||
}).catch(err => { | ||
m.error('renderer') | ||
console.log(`\n ${errorLog}failed to build renderer process`) | ||
console.error(`\n${err}\n`) | ||
process.exit(1) | ||
}) | ||
} | ||
|
||
function web() { | ||
sync(['dist/web/*', '!.gitkeep']) | ||
build(rendererOptions).then(res => { | ||
console.log(`${doneLog}RendererProcess build success`) | ||
process.exit() | ||
}) | ||
} | ||
|
||
function greeting() { | ||
const cols = process.stdout.columns | ||
let text = '' | ||
|
||
if (cols > 85) text = `let's-build` | ||
else if (cols > 60) text = `let's-|build` | ||
else text = false | ||
|
||
if (text && !isCI) { | ||
say(text, { | ||
colors: ['yellow'], | ||
font: 'simple3d', | ||
space: false | ||
}) | ||
} else console.log(chalk.yellow.bold(`\n let's-build`)) | ||
console.log() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,191 @@ | ||
process.env.NODE_ENV = 'development' | ||
|
||
const chalk = require('chalk') | ||
const electron = require('electron') | ||
const path = require('path') | ||
const rollup = require("rollup") | ||
const Portfinder = require("portfinder") | ||
const config = require('../config') | ||
|
||
const { say } = require('cfonts') | ||
const { spawn } = require('child_process') | ||
const { createServer } = require('vite') | ||
|
||
const rendererOptions = require("./vite.config") | ||
const mainOptions = require("./rollup.main.config") | ||
const opt = mainOptions(process.env.NODE_ENV); | ||
|
||
let electronProcess = null | ||
let manualRestart = false | ||
|
||
function logStats(proc, data) { | ||
let log = '' | ||
|
||
log += chalk.yellow.bold(`┏ ${proc} ${config.dev.chineseLog ? '编译过程' : '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 removeJunk(chunk) { | ||
if (config.dev.removeElectronJunk) { | ||
// Example: 2018-08-10 22:48:42.866 Electron[90311:4883863] *** WARNING: Textured window <AtomNSWindow: 0x7fb75f68a770> | ||
if (/\d+-\d+-\d+ \d+:\d+:\d+\.\d+ Electron(?: Helper)?\[\d+:\d+] /.test(chunk)) { | ||
return false; | ||
} | ||
|
||
// Example: [90789:0810/225804.894349:ERROR:CONSOLE(105)] "Uncaught (in promise) Error: Could not instantiate: ProductRegistryImpl.Registry", source: chrome-devtools://devtools/bundled/inspector.js (105) | ||
if (/\[\d+:\d+\/|\d+\.\d+:ERROR:CONSOLE\(\d+\)\]/.test(chunk)) { | ||
return false; | ||
} | ||
|
||
// Example: ALSA lib confmisc.c:767:(parse_card) cannot find card '0' | ||
if (/ALSA lib [a-z]+\.c:\d+:\([a-z_]+\)/.test(chunk)) { | ||
return false; | ||
} | ||
} | ||
|
||
|
||
return chunk; | ||
} | ||
|
||
function startRenderer() { | ||
return new Promise((resolve, reject) => { | ||
Portfinder.basePort = config.dev.port || 9080 | ||
Portfinder.getPort(async (err, port) => { | ||
if (err) { | ||
reject("PortError:" + err) | ||
} else { | ||
const server = await createServer(rendererOptions) | ||
process.env.PORT = port | ||
server.listen(port).then(() => { | ||
console.log('\n\n' + chalk.blue(`${config.dev.chineseLog ? ' 正在准备主进程,请等待...' : ' Preparing main process, please wait...'}`) + '\n\n') | ||
}) | ||
resolve() | ||
} | ||
}) | ||
}) | ||
} | ||
|
||
function startMain() { | ||
return new Promise((resolve, reject) => { | ||
const watcher = rollup.watch(opt); | ||
watcher.on('change', filename => { | ||
// 主进程日志部分 | ||
logStats(`${config.dev.chineseLog ? '主进程文件变更' : 'Main-FileChange'}`, filename) | ||
}); | ||
watcher.on('event', event => { | ||
if (event.code === 'END') { | ||
if (electronProcess && electronProcess.kill) { | ||
manualRestart = true | ||
process.kill(electronProcess.pid) | ||
electronProcess = null | ||
startElectron() | ||
|
||
setTimeout(() => { | ||
manualRestart = false | ||
}, 5000) | ||
} | ||
|
||
resolve() | ||
|
||
} else if (event.code === 'ERROR') { | ||
reject(event.error) | ||
} | ||
}) | ||
}) | ||
} | ||
|
||
function startElectron() { | ||
|
||
var args = [ | ||
'--inspect=5858', | ||
path.join(__dirname, '../dist/electron/main/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(removeJunk(data), 'blue') | ||
}) | ||
electronProcess.stderr.on('data', data => { | ||
electronLog(removeJunk(data), 'red') | ||
}) | ||
|
||
electronProcess.on('close', () => { | ||
if (!manualRestart) process.exit() | ||
}) | ||
} | ||
|
||
function electronLog(data, color) { | ||
if (data) { | ||
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(`┏ ${config.dev.chineseLog ? '主程序日志' : 'Electron'} -------------------`) + | ||
'\n\n' + | ||
log + | ||
chalk[color].bold('┗ ----------------------------') + | ||
'\n' | ||
) | ||
} | ||
} | ||
|
||
} | ||
|
||
function greeting() { | ||
const cols = process.stdout.columns | ||
let text = '' | ||
|
||
if (cols > 104) text = 'electron-vite' | ||
else if (cols > 76) text = 'electron-|vite' | ||
else text = false | ||
|
||
if (text) { | ||
say(text, { | ||
colors: ['yellow'], | ||
font: 'simple3d', | ||
space: false | ||
}) | ||
} else console.log(chalk.yellow.bold('\n electron-vite')) | ||
console.log(chalk.blue(`${config.dev.chineseLog ? ' 准备启动...' : ' getting ready...'}`) + '\n') | ||
} | ||
|
||
async function init() { | ||
greeting() | ||
|
||
try { | ||
await startRenderer() | ||
await startMain() | ||
await startElectron() | ||
} catch (error) { | ||
console.error(error) | ||
process.exit(1) | ||
} | ||
|
||
} | ||
|
||
init() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
const path = require('path') | ||
const { nodeResolve } = require('@rollup/plugin-node-resolve') | ||
const commonjs = require('@rollup/plugin-commonjs') | ||
const esbuild = require('rollup-plugin-esbuild') | ||
const alias = require('@rollup/plugin-alias') | ||
const json = require('@rollup/plugin-json') | ||
|
||
module.exports = (env = 'production') => { | ||
return { | ||
input: path.join(__dirname, '../src/main/index.ts'), | ||
output: { | ||
file: path.join(__dirname, '../dist/electron/main/main.js'), | ||
format: 'cjs', | ||
name: 'MainProcess', | ||
sourcemap: false, | ||
}, | ||
plugins: [ | ||
nodeResolve({ jsnext: true, preferBuiltins: true, browser: true }), // 消除碰到 node.js 模块时⚠警告 | ||
commonjs(), | ||
json(), | ||
esbuild({ | ||
// All options are optional | ||
include: /\.[jt]sx?$/, // default, inferred from `loaders` option | ||
exclude: /node_modules/, // default | ||
// watch: process.argv.includes('--watch'), // rollup 中有配置 | ||
sourceMap: false, // default | ||
minify: process.env.NODE_ENV === 'production', | ||
target: 'es2017', // default, or 'es20XX', 'esnext' | ||
// Like @rollup/plugin-replace | ||
define: { | ||
__VERSION__: '"x.y.z"' | ||
}, | ||
// Add extra loaders | ||
loaders: { | ||
// Add .json files support | ||
// require @rollup/plugin-commonjs | ||
'.json': 'json', | ||
// Enable JSX in .js files too | ||
'.js': 'jsx' | ||
}, | ||
}), | ||
alias({ | ||
entries: [ | ||
{ find: '@main', replacement: path.join(__dirname, '../src/main'), }, | ||
{ find: '@config', replacement: path.join(__dirname, '..', 'config') } | ||
] | ||
}) | ||
], | ||
external: [ | ||
'crypto', | ||
'assert', | ||
'fs', | ||
'util', | ||
'os', | ||
'events', | ||
'child_process', | ||
'http', | ||
'https', | ||
'path', | ||
'electron', | ||
'electron-updater', | ||
'express' | ||
], | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
const { join } = require("path") | ||
const vuePlugin = require("@vitejs/plugin-vue") | ||
|
||
function resolve(dir) { | ||
return join(__dirname, '..', dir) | ||
} | ||
|
||
const root = resolve('src/renderer') | ||
|
||
const config = { | ||
mode: process.env.NODE_ENV, | ||
root, | ||
resolve: { | ||
alias: { | ||
'@': root, | ||
} | ||
}, | ||
base: './', | ||
build: { | ||
outDir: process.env.BUILD_TARGET === 'web' ? resolve('dist/web') : resolve('dist/electron/renderer'), | ||
emptyOutDir: true | ||
}, | ||
server: { | ||
port: Number(process.env.PORT), | ||
}, | ||
plugins: [ | ||
vuePlugin() | ||
], | ||
publicDir: resolve('static') | ||
} | ||
|
||
module.exports = config |
Oops, something went wrong.