-
Notifications
You must be signed in to change notification settings - Fork 3
/
dev.runner.js
138 lines (119 loc) · 4.14 KB
/
dev.runner.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
'use strict'
process.env.NODE_ENV = 'development';
const path = require('path');
const { spawn } = require('child_process');
const electron = require('electron');
const webpack = require('webpack');
const WebpackDevServer = require('webpack-dev-server');
const mainConfig = require('./webpack.main.config.js');
const rendererConfig = require('./webpack.renderer.config.js');
var runner = {
/**
* electron 进程
*/
electronProcess: null,
/**
* 是否重启
*/
manualRestart: false,
/**
* 渲染进程(HMR: hot module replacement)
*/
startRenderer() {
var promise = new Promise((resolve, reject) => {
// 设置该mode会将process.env.NODE_ENV 的值设为development,启用NamedChunksPlugin和NamedModulesPlugin
rendererConfig.mode = 'development';
// 配置并返回一个compiler对象
var compiler = webpack(rendererConfig);
// 执行打包(webpack传入第二个参数回调,也会执行打包),输出结果,热加载则不需要,相关模块将其结果保存在内存中
// compiler.run();
// 监听编译过程(webpack-dev-server)
compiler.hooks.watchRun.tapAsync('watch-run', (compilation, done) => {
console.log('render process is compiling...');
done();
});
// 编译完成
compiler.hooks.done.tap('done', stats => {
console.log('render process compiled done.');
});
// 创建服务
var server = new WebpackDevServer(compiler, {
// 指定一个虚拟路径来让devServer服务器提供内容
contentBase: path.join(__dirname, "../"),
// 在浏览器中打开
// open: true,
after() {
resolve();
}
});
// 监听端口
server.listen(8181);
});
return promise;
},
/**
* 主进程
*/
startMain() {
var self = this;
var promise = new Promise((resolve, reject) => {
// 设置该mode会将process.env.NODE_ENV 的值设为development,启用NamedChunksPlugin和NamedModulesPlugin
mainConfig.mode = 'development';
// 配置并返回一个compiler对象
var compiler = webpack(mainConfig);
// 编译完成
compiler.hooks.done.tap('done', stats => {
console.log('main process compiled done.');
});
compiler.watch({}, (err, stats) => {
if (err) {
console.log(err)
return
}
if (self.electronProcess && self.electronProcess.kill) {
self.manualRestart = true;
process.kill(self.electronProcess.pid)
self.electronProcess = null;
self.startElectron();
setTimeout(() => {
self.manualRestart = false;
}, 5000)
}
resolve();
});
});
return promise;
},
/**
* 启动electron终端
*/
startElectron() {
var self = this;
var args = [
'--inspect=5858',
path.join(__dirname, '../dist/electron/main.js')
];
self.electronProcess = spawn(electron, args);
self.electronProcess.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
self.electronProcess.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
self.electronProcess.on('close', (code) => {
console.log(`child process exited with code ${code}`);
if (!self.manualRestart) process.exit();
});
},
init() {
var self = this;
Promise.all([self.startRenderer(), self.startMain()])
.then(() => {
self.startElectron();
})
.catch(err => {
console.error(err);
});
}
}
runner.init();