Skip to content

Commit ad3cebd

Browse files
committed
refactor: improve hmr code generation
1 parent f418bd9 commit ad3cebd

File tree

3 files changed

+27
-16
lines changed

3 files changed

+27
-16
lines changed

Diff for: lib/hotReload.js

+23-6
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,36 @@
11
const hotReloadAPIPath = require.resolve('vue-hot-reload-api')
22

3-
module.exports = function genHotReloadCode (id, functional) {
3+
exports.genHotReloadCode = (id, functional) => {
44
// TODO handle CSSModules and style injection disposal
5+
return wrap(`
6+
if (!module.hot.data) {
7+
api.createRecord('${id}', component.options)
8+
} else {
9+
api.${functional ? `rerender` : `reload`}('${id}', component.options)
10+
}
11+
`)
12+
}
13+
14+
exports.genTemplateHotReloadCode = id => {
15+
return wrap(`
16+
if (module.hot.data) {
17+
require('${hotReloadAPIPath}').rerender('${id}', {
18+
render: render,
19+
staticRenderFns: staticRenderFns
20+
})
21+
}
22+
`)
23+
}
24+
25+
function wrap (inner) {
526
return `
627
/* hot reload */
728
if (module.hot) {
829
var api = require('${hotReloadAPIPath}')
930
api.install(require('vue'))
1031
if (api.compatible) {
1132
module.hot.accept()
12-
if (!module.hot.data) {
13-
api.createRecord('${id}', component.options)
14-
} else {
15-
api.${functional ? `rerender` : `reload`}('${id}', component.options)
16-
}
33+
${inner.trim()}
1734
}
1835
}
1936
`.trim()

Diff for: lib/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const qs = require('querystring')
55
const loaderUtils = require('loader-utils')
66
const selectBlock = require('./selector')
77
const plugin = require('./plugin')
8-
const genHotReloadCode = require('./hotReload')
8+
const { genHotReloadCode } = require('./hotReload')
99
const componentNormalizerPath = require.resolve('./runtime/componentNormalizer')
1010

1111
module.exports = function (source) {

Diff for: lib/template-loader/index.js

+3-9
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const compiler = require('vue-template-compiler')
66
const transpile = require('vue-template-es2015-compiler')
77
const transformAssetUrl = require('./modules/assetUrl')
88
const transformSrcset = require('./modules/srcset')
9-
const hotReloadAPIPath = require.resolve('vue-hot-reload-api')
9+
const { genTemplateHotReloadCode } = require('../hotReload')
1010

1111
// Loader that compiles raw template into JavaScript functions.
1212
// This is injected by the global pitcher (../pitch) for template
@@ -141,16 +141,10 @@ function actuallyCompile (sourceTemplate, options, loaderContext, query) {
141141
}
142142
code += `export { render, staticRenderFns }`
143143
}
144+
144145
// hot-reload
145146
if (needsHotReload) {
146-
code +=
147-
'\nif (module.hot) {\n' +
148-
' module.hot.accept()\n' +
149-
' if (module.hot.data) {\n' +
150-
' require("' + hotReloadAPIPath + '")' +
151-
' .rerender("' + options.id + '", { render: render, staticRenderFns: staticRenderFns })\n' +
152-
' }\n' +
153-
'}'
147+
code += genTemplateHotReloadCode(id)
154148
}
155149

156150
return code

0 commit comments

Comments
 (0)