dev-runner.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. 'use strict'
  2. const serverConfig = require('../static/EnitySystem')
  3. const chalk = require('chalk')
  4. const electron = require('electron')
  5. const path = require('path')
  6. const { say } = require('cfonts')
  7. const { spawn } = require('child_process')
  8. const webpack = require('webpack')
  9. const WebpackDevServer = require('webpack-dev-server')
  10. const webpackHotMiddleware = require('webpack-hot-middleware')
  11. const mainConfig = require('./webpack.main.config')
  12. const rendererConfig = require('./webpack.renderer.config')
  13. let electronProcess = null
  14. let manualRestart = false
  15. let hotMiddleware
  16. function logStats (proc, data) {
  17. let log = ''
  18. log += chalk.yellow.bold(`┏ ${proc} Process ${new Array((19 - proc.length) + 1).join('-')}`)
  19. log += '\n\n'
  20. if (typeof data === 'object') {
  21. data.toString({
  22. colors: true,
  23. chunks: false
  24. }).split(/\r?\n/).forEach(line => {
  25. log += ' ' + line + '\n'
  26. })
  27. } else {
  28. log += ` ${data}\n`
  29. }
  30. log += '\n' + chalk.yellow.bold(`┗ ${new Array(28 + 1).join('-')}`) + '\n'
  31. console.log(log)
  32. }
  33. function startRenderer () {
  34. return new Promise((resolve, reject) => {
  35. rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer)
  36. rendererConfig.mode = 'development'
  37. const compiler = webpack(rendererConfig)
  38. hotMiddleware = webpackHotMiddleware(compiler, {
  39. log: false,
  40. heartbeat: 2500
  41. })
  42. compiler.hooks.compilation.tap('compilation', compilation => {
  43. compilation.hooks.htmlWebpackPluginAfterEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => {
  44. hotMiddleware.publish({ action: 'reload' })
  45. cb()
  46. })
  47. })
  48. compiler.hooks.done.tap('done', stats => {
  49. logStats('Renderer', stats)
  50. })
  51. const server = new WebpackDevServer(
  52. compiler,
  53. {
  54. contentBase: path.join(__dirname, '../'),
  55. quiet: true,
  56. proxy: {
  57. '/seller': {
  58. // 请求的目标服务器地址
  59. target: `http://112.74.78.188:8080`,
  60. // 设置允许跨域
  61. changeOrigin: true,
  62. // 重写路径
  63. pathRewrite: {
  64. '^/seller': '/seller'
  65. },
  66. headers: {
  67. referer: ''
  68. }
  69. }
  70. },
  71. before (app, ctx) {
  72. app.use(hotMiddleware)
  73. ctx.middleware.waitUntilValid(() => {
  74. resolve()
  75. })
  76. }
  77. }
  78. )
  79. server.listen(9080)
  80. })
  81. }
  82. function startMain () {
  83. return new Promise((resolve, reject) => {
  84. mainConfig.entry.main = [path.join(__dirname, '../src/main/index.dev.js')].concat(mainConfig.entry.main)
  85. mainConfig.mode = 'development'
  86. const compiler = webpack(mainConfig)
  87. compiler.hooks.watchRun.tapAsync('watch-run', (compilation, done) => {
  88. logStats('Main', chalk.white.bold('compiling...'))
  89. hotMiddleware.publish({ action: 'compiling' })
  90. done()
  91. })
  92. compiler.watch({}, (err, stats) => {
  93. if (err) {
  94. console.log(err)
  95. return
  96. }
  97. logStats('Main', stats)
  98. if (electronProcess && electronProcess.kill) {
  99. manualRestart = true
  100. process.kill(electronProcess.pid)
  101. electronProcess = null
  102. startElectron()
  103. setTimeout(() => {
  104. manualRestart = false
  105. }, 5000)
  106. }
  107. resolve()
  108. })
  109. })
  110. }
  111. function startElectron () {
  112. var args = [
  113. '--inspect=5858',
  114. path.join(__dirname, '../dist/electron/main.js')
  115. ]
  116. // detect yarn or npm and process commandline args accordingly
  117. if (process.env.npm_execpath.endsWith('yarn.js')) {
  118. args = args.concat(process.argv.slice(3))
  119. } else if (process.env.npm_execpath.endsWith('npm-cli.js')) {
  120. args = args.concat(process.argv.slice(2))
  121. }
  122. electronProcess = spawn(electron, args)
  123. electronProcess.stdout.on('data', data => {
  124. electronLog(data, 'blue')
  125. })
  126. electronProcess.stderr.on('data', data => {
  127. electronLog(data, 'red')
  128. })
  129. electronProcess.on('close', () => {
  130. if (!manualRestart) process.exit()
  131. })
  132. }
  133. function electronLog (data, color) {
  134. let log = ''
  135. data = data.toString().split(/\r?\n/)
  136. data.forEach(line => {
  137. log += ` ${line}\n`
  138. })
  139. if (/[0-9A-z]+/.test(log)) {
  140. console.log(
  141. chalk[color].bold('┏ Electron -------------------') +
  142. '\n\n' +
  143. log +
  144. chalk[color].bold('┗ ----------------------------') +
  145. '\n'
  146. )
  147. }
  148. }
  149. function greeting () {
  150. const cols = process.stdout.columns
  151. let text = ''
  152. if (cols > 104) text = 'electron-vue'
  153. else if (cols > 76) text = 'electron-|vue'
  154. else text = false
  155. if (text) {
  156. say(text, {
  157. colors: ['yellow'],
  158. font: 'simple3d',
  159. space: false
  160. })
  161. } else console.log(chalk.yellow.bold('\n electron-vue'))
  162. console.log(chalk.blue(' getting ready...') + '\n')
  163. }
  164. function init () {
  165. greeting()
  166. Promise.all([startRenderer(), startMain()])
  167. .then(() => {
  168. startElectron()
  169. })
  170. .catch(err => {
  171. console.error(err)
  172. })
  173. }
  174. init()