2016-10-14 15:05:08 +00:00
|
|
|
import WebpackDevServer from 'webpack-dev-server'
|
2016-10-17 07:05:46 +00:00
|
|
|
import webpack from './build/webpack'
|
2016-10-15 19:49:42 +00:00
|
|
|
import read from './read'
|
2016-10-14 15:05:08 +00:00
|
|
|
|
|
|
|
export default class HotReloader {
|
2016-10-17 07:05:46 +00:00
|
|
|
constructor (dir) {
|
|
|
|
this.dir = dir
|
|
|
|
this.server = null
|
|
|
|
}
|
|
|
|
|
|
|
|
async start () {
|
|
|
|
await this.prepareServer()
|
|
|
|
await this.waitBuild()
|
|
|
|
await this.listen()
|
|
|
|
}
|
|
|
|
|
|
|
|
async prepareServer () {
|
|
|
|
const compiler = await webpack(this.dir, { hotReload: true })
|
2016-10-15 19:49:42 +00:00
|
|
|
|
|
|
|
compiler.plugin('after-emit', (compilation, callback) => {
|
|
|
|
const { assets } = compilation
|
|
|
|
for (const f of Object.keys(assets)) {
|
|
|
|
const source = assets[f]
|
|
|
|
// delete updated file caches
|
|
|
|
delete require.cache[source.existsAt]
|
|
|
|
delete read.cache[source.existsAt]
|
|
|
|
}
|
|
|
|
callback()
|
|
|
|
})
|
2016-10-14 15:05:08 +00:00
|
|
|
|
2016-10-17 07:05:46 +00:00
|
|
|
this.server = new WebpackDevServer(compiler, {
|
|
|
|
publicPath: '/',
|
|
|
|
hot: true,
|
|
|
|
noInfo: true,
|
2016-10-18 09:33:49 +00:00
|
|
|
clientLogLevel: 'warning',
|
|
|
|
stats: {
|
|
|
|
assets: false,
|
|
|
|
children: false,
|
|
|
|
chunks: false,
|
|
|
|
color: false,
|
|
|
|
errors: true,
|
|
|
|
errorDetails: false,
|
|
|
|
hash: false,
|
|
|
|
modules: false,
|
|
|
|
publicPath: false,
|
|
|
|
reasons: false,
|
|
|
|
source: false,
|
|
|
|
timings: false,
|
|
|
|
version: false,
|
|
|
|
warnings: false
|
|
|
|
}
|
2016-10-17 07:05:46 +00:00
|
|
|
})
|
2016-10-14 15:05:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
async waitBuild () {
|
|
|
|
const stats = await new Promise((resolve) => {
|
|
|
|
this.server.middleware.waitUntilValid(resolve)
|
|
|
|
})
|
|
|
|
|
|
|
|
const jsonStats = stats.toJson()
|
|
|
|
if (jsonStats.errors.length > 0) {
|
|
|
|
const err = new Error(jsonStats.errors[0])
|
|
|
|
err.errors = jsonStats.errors
|
|
|
|
err.warnings = jsonStats.warnings
|
|
|
|
throw err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
listen () {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
this.server.listen(3030, (err) => {
|
|
|
|
if (err) return reject(err)
|
|
|
|
resolve()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
get fileSystem () {
|
|
|
|
return this.server.middleware.fileSystem
|
|
|
|
}
|
|
|
|
}
|