mirror of
https://github.com/marktext/marktext.git
synced 2025-05-03 03:50:27 +08:00
198 lines
4.6 KiB
JavaScript
198 lines
4.6 KiB
JavaScript
'use strict'
|
|
|
|
const chalk = require('chalk')
|
|
const electron = require('electron')
|
|
const path = require('path')
|
|
const { say } = require('cfonts')
|
|
const { spawn } = require('child_process')
|
|
const webpack = require('webpack')
|
|
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
|
const WebpackDevServer = require('webpack-dev-server')
|
|
const webpackHotMiddleware = require('webpack-hot-middleware')
|
|
|
|
const mainConfig = require('./webpack.main.config')
|
|
const rendererConfig = require('./webpack.renderer.config')
|
|
|
|
let electronProcess = null
|
|
let manualRestart = false
|
|
let hotMiddleware
|
|
|
|
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 startRenderer () {
|
|
return new Promise((resolve, reject) => {
|
|
rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer)
|
|
|
|
const compiler = webpack(rendererConfig)
|
|
hotMiddleware = webpackHotMiddleware(compiler, {
|
|
log: false,
|
|
heartbeat: 2500
|
|
})
|
|
|
|
compiler.hooks.compilation.tap('HtmlWebpackPluginAfterEmit', compilation => {
|
|
HtmlWebpackPlugin.getHooks(compilation).afterEmit.tapAsync(
|
|
'AfterPlugin',
|
|
(data, cb) => {
|
|
hotMiddleware.publish({ action: 'reload' })
|
|
// Tell webpack to move on
|
|
cb(null, data)
|
|
}
|
|
)
|
|
})
|
|
|
|
compiler.hooks.done.tap('AfterCompiler', stats => {
|
|
logStats('Renderer', stats)
|
|
})
|
|
|
|
const server = new WebpackDevServer({
|
|
host: '127.0.0.1',
|
|
port: 9091,
|
|
hot: true,
|
|
liveReload: true,
|
|
compress: true,
|
|
static: [
|
|
{
|
|
directory: path.join(__dirname, '../node_modules/codemirror/mode'),
|
|
publicPath: '/codemirror/mode',
|
|
watch: false
|
|
}
|
|
],
|
|
onBeforeSetupMiddleware ({ app, middleware }) {
|
|
app.use(hotMiddleware)
|
|
middleware.waitUntilValid(() => {
|
|
resolve()
|
|
})
|
|
}
|
|
}, compiler)
|
|
|
|
server.start()
|
|
})
|
|
}
|
|
|
|
function startMain () {
|
|
return new Promise((resolve, reject) => {
|
|
mainConfig.entry.main = [path.join(__dirname, '../src/main/index.dev.js')].concat(mainConfig.entry.main)
|
|
|
|
const compiler = webpack(mainConfig)
|
|
|
|
compiler.hooks.watchRun.tapAsync('Compiling', (_, done) => {
|
|
logStats('Main', chalk.white.bold('compiling...'))
|
|
hotMiddleware.publish({ action: 'compiling' })
|
|
done()
|
|
})
|
|
|
|
compiler.watch({}, (err, stats) => {
|
|
if (err) {
|
|
console.log(err)
|
|
return
|
|
}
|
|
|
|
logStats('Main', stats)
|
|
|
|
if (electronProcess && electronProcess.kill) {
|
|
manualRestart = true
|
|
process.kill(electronProcess.pid)
|
|
electronProcess = null
|
|
startElectron()
|
|
|
|
setTimeout(() => {
|
|
manualRestart = false
|
|
}, 5000)
|
|
}
|
|
|
|
resolve()
|
|
})
|
|
})
|
|
}
|
|
|
|
function startElectron () {
|
|
electronProcess = spawn(electron, [
|
|
'--inspect=5858',
|
|
'--remote-debugging-port=8315',
|
|
'--nolazy',
|
|
path.join(__dirname, '../dist/electron/main.js')
|
|
])
|
|
|
|
electronProcess.stdout.on('data', data => {
|
|
electronLog(data, 'blue')
|
|
})
|
|
electronProcess.stderr.on('data', data => {
|
|
electronLog(data, 'red')
|
|
})
|
|
|
|
electronProcess.on('close', () => {
|
|
if (!manualRestart) process.exit()
|
|
})
|
|
}
|
|
|
|
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 > 155) text = 'building marktext'
|
|
else if (cols > 76) text = 'building|marktext'
|
|
else text = false
|
|
|
|
if (text) {
|
|
say(text, {
|
|
colors: ['yellow'],
|
|
font: 'simple3d',
|
|
space: false
|
|
})
|
|
} else {
|
|
console.log(chalk.yellow.bold('\n building marktext'))
|
|
}
|
|
console.log(chalk.blue(' getting ready...') + '\n')
|
|
}
|
|
|
|
function init () {
|
|
greeting()
|
|
|
|
Promise.all([startRenderer(), startMain()])
|
|
.then(() => {
|
|
startElectron()
|
|
})
|
|
.catch(err => {
|
|
console.error(err)
|
|
})
|
|
}
|
|
|
|
init()
|