123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- var Vue // late bind
- var version
- var map = window.__VUE_HOT_MAP__ = Object.create(null)
- var installed = false
- var isBrowserify = false
- var initHookName = 'beforeCreate'
- exports.install = function (vue, browserify) {
- if (installed) return
- installed = true
- Vue = vue.__esModule ? vue.default : vue
- version = Vue.version.split('.').map(Number)
- isBrowserify = browserify
- // compat with < 2.0.0-alpha.7
- if (Vue.config._lifecycleHooks.indexOf('init') > -1) {
- initHookName = 'init'
- }
- exports.compatible = version[0] >= 2
- if (!exports.compatible) {
- console.warn(
- '[HMR] You are using a version of vue-hot-reload-api that is ' +
- 'only compatible with Vue.js core ^2.0.0.'
- )
- return
- }
- }
- /**
- * Create a record for a hot module, which keeps track of its constructor
- * and instances
- *
- * @param {String} id
- * @param {Object} options
- */
- exports.createRecord = function (id, options) {
- var Ctor = null
- if (typeof options === 'function') {
- Ctor = options
- options = Ctor.options
- }
- makeOptionsHot(id, options)
- map[id] = {
- Ctor: Vue.extend(options),
- instances: []
- }
- }
- /**
- * Make a Component options object hot.
- *
- * @param {String} id
- * @param {Object} options
- */
- function makeOptionsHot (id, options) {
- injectHook(options, initHookName, function () {
- map[id].instances.push(this)
- })
- injectHook(options, 'beforeDestroy', function () {
- var instances = map[id].instances
- instances.splice(instances.indexOf(this), 1)
- })
- }
- /**
- * Inject a hook to a hot reloadable component so that
- * we can keep track of it.
- *
- * @param {Object} options
- * @param {String} name
- * @param {Function} hook
- */
- function injectHook (options, name, hook) {
- var existing = options[name]
- options[name] = existing
- ? Array.isArray(existing)
- ? existing.concat(hook)
- : [existing, hook]
- : [hook]
- }
- function tryWrap (fn) {
- return function (id, arg) {
- try { fn(id, arg) } catch (e) {
- console.error(e)
- console.warn('Something went wrong during Vue component hot-reload. Full reload required.')
- }
- }
- }
- exports.rerender = tryWrap(function (id, options) {
- var record = map[id]
- if (typeof options === 'function') {
- options = options.options
- }
- record.Ctor.options.render = options.render
- record.Ctor.options.staticRenderFns = options.staticRenderFns
- record.instances.slice().forEach(function (instance) {
- instance.$options.render = options.render
- instance.$options.staticRenderFns = options.staticRenderFns
- instance._staticTrees = [] // reset static trees
- instance.$forceUpdate()
- })
- })
- exports.reload = tryWrap(function (id, options) {
- if (typeof options === 'function') {
- options = options.options
- }
- makeOptionsHot(id, options)
- var record = map[id]
- if (version[1] < 2) {
- // preserve pre 2.2 behavior for global mixin handling
- record.Ctor.extendOptions = options
- }
- var newCtor = record.Ctor.super.extend(options)
- record.Ctor.options = newCtor.options
- record.Ctor.cid = newCtor.cid
- record.Ctor.prototype = newCtor.prototype
- if (newCtor.release) {
- // temporary global mixin strategy used in < 2.0.0-alpha.6
- newCtor.release()
- }
- record.instances.slice().forEach(function (instance) {
- if (instance.$vnode && instance.$vnode.context) {
- instance.$vnode.context.$forceUpdate()
- } else {
- console.warn('Root or manually mounted instance modified. Full reload required.')
- }
- })
- })
|