Skip to content

Commit 27cb2c6

Browse files
committed
feat: watch and update template in dev
1 parent 79165df commit 27cb2c6

File tree

3 files changed

+40
-26
lines changed

3 files changed

+40
-26
lines changed

Diff for: build/setup-dev-server.js

+28-19
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
const fs = require('fs')
12
const path = require('path')
2-
const webpack = require('webpack')
33
const MFS = require('memory-fs')
4+
const webpack = require('webpack')
5+
const chokidar = require('chokidar')
46
const clientConfig = require('./webpack.client.config')
57
const serverConfig = require('./webpack.server.config')
68

@@ -10,15 +12,31 @@ const readFile = (fs, file) => {
1012
} catch (e) {}
1113
}
1214

13-
module.exports = function setupDevServer (app, cb) {
14-
let bundle, clientManifest
15-
let resolve
16-
const readyPromise = new Promise(r => { resolve = r })
17-
const ready = (...args) => {
18-
resolve()
19-
cb(...args)
15+
module.exports = function setupDevServer (app, templatePath, cb) {
16+
let bundle
17+
let template
18+
let clientManifest
19+
20+
let ready
21+
const readyPromise = new Promise(r => { ready = r })
22+
const update = () => {
23+
if (bundle && clientManifest) {
24+
ready()
25+
cb(bundle, {
26+
template,
27+
clientManifest
28+
})
29+
}
2030
}
2131

32+
// read template from disk and watch
33+
template = fs.readFileSync(templatePath, 'utf-8')
34+
chokidar.watch(templatePath).on('change', () => {
35+
template = fs.readFileSync(templatePath, 'utf-8')
36+
console.log('index.html template updated.')
37+
update()
38+
})
39+
2240
// modify client config to work with hot middleware
2341
clientConfig.entry.app = ['webpack-hot-middleware/client', clientConfig.entry.app]
2442
clientConfig.output.filename = '[name].js'
@@ -39,16 +57,11 @@ module.exports = function setupDevServer (app, cb) {
3957
stats.errors.forEach(err => console.error(err))
4058
stats.warnings.forEach(err => console.warn(err))
4159
if (stats.errors.length) return
42-
4360
clientManifest = JSON.parse(readFile(
4461
devMiddleware.fileSystem,
4562
'vue-ssr-client-manifest.json'
4663
))
47-
if (bundle) {
48-
ready(bundle, {
49-
clientManifest
50-
})
51-
}
64+
update()
5265
})
5366

5467
// hot middleware
@@ -65,11 +78,7 @@ module.exports = function setupDevServer (app, cb) {
6578

6679
// read bundle generated by vue-ssr-webpack-plugin
6780
bundle = JSON.parse(readFile(mfs, 'vue-ssr-server-bundle.json'))
68-
if (clientManifest) {
69-
ready(bundle, {
70-
clientManifest
71-
})
72-
}
81+
update()
7382
})
7483

7584
return readyPromise

Diff for: package.json

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"babel-loader": "^7.1.2",
3737
"babel-plugin-syntax-dynamic-import": "^6.18.0",
3838
"babel-preset-env": "^1.6.0",
39+
"chokidar": "^1.7.0",
3940
"css-loader": "^0.28.7",
4041
"file-loader": "^0.11.2",
4142
"friendly-errors-webpack-plugin": "^1.6.1",

Diff for: server.js

+11-7
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,9 @@ const serverInfo =
1616

1717
const app = express()
1818

19-
const template = fs.readFileSync(resolve('./src/index.template.html'), 'utf-8')
20-
2119
function createRenderer (bundle, options) {
2220
// https://github.com/vuejs/vue/blob/dev/packages/vue-server-renderer/README.md#why-use-bundlerenderer
2321
return createBundleRenderer(bundle, Object.assign(options, {
24-
template,
2522
// for component caching
2623
cache: LRU({
2724
max: 1000,
@@ -36,23 +33,30 @@ function createRenderer (bundle, options) {
3633

3734
let renderer
3835
let readyPromise
36+
const templatePath = resolve('./src/index.template.html')
3937
if (isProd) {
40-
// In production: create server renderer using built server bundle.
38+
// In production: create server renderer using template and built server bundle.
4139
// The server bundle is generated by vue-ssr-webpack-plugin.
40+
const template = fs.readFileSync(templatePath, 'utf-8')
4241
const bundle = require('./dist/vue-ssr-server-bundle.json')
4342
// The client manifests are optional, but it allows the renderer
4443
// to automatically infer preload/prefetch links and directly add <script>
4544
// tags for any async chunks used during render, avoiding waterfall requests.
4645
const clientManifest = require('./dist/vue-ssr-client-manifest.json')
4746
renderer = createRenderer(bundle, {
47+
template,
4848
clientManifest
4949
})
5050
} else {
5151
// In development: setup the dev server with watch and hot-reload,
5252
// and create a new renderer on bundle / index template update.
53-
readyPromise = require('./build/setup-dev-server')(app, (bundle, options) => {
54-
renderer = createRenderer(bundle, options)
55-
})
53+
readyPromise = require('./build/setup-dev-server')(
54+
app,
55+
templatePath,
56+
(bundle, options) => {
57+
renderer = createRenderer(bundle, options)
58+
}
59+
)
5660
}
5761

5862
const serve = (path, cache) => express.static(resolve(path), {

0 commit comments

Comments
 (0)