瀏覽代碼

provide warning when trying to add a new module on hot reload (#316)

katashin 8 年之前
父節點
當前提交
32212d9ed6
共有 2 個文件被更改,包括 46 次插入15 次删除
  1. 25 15
      src/index.js
  2. 21 0
      test/unit/test.js

+ 25 - 15
src/index.js

@@ -145,21 +145,7 @@ class Store {
   }
 
   hotUpdate (newOptions) {
-    const options = this._options
-    if (newOptions.actions) {
-      options.actions = newOptions.actions
-    }
-    if (newOptions.mutations) {
-      options.mutations = newOptions.mutations
-    }
-    if (newOptions.getters) {
-      options.getters = newOptions.getters
-    }
-    if (newOptions.modules) {
-      for (const key in newOptions.modules) {
-        options.modules[key] = newOptions.modules[key]
-      }
-    }
+    updateModule(this._options, newOptions)
     resetStore(this)
   }
 
@@ -175,6 +161,30 @@ function assert (condition, msg) {
   if (!condition) throw new Error(`[vuex] ${msg}`)
 }
 
+function updateModule (targetModule, newModule) {
+  if (newModule.actions) {
+    targetModule.actions = newModule.actions
+  }
+  if (newModule.mutations) {
+    targetModule.mutations = newModule.mutations
+  }
+  if (newModule.getters) {
+    targetModule.getters = newModule.getters
+  }
+  if (newModule.modules) {
+    for (const key in newModule.modules) {
+      if (!(targetModule.modules && targetModule.modules[key])) {
+        console.warn(
+          `[vuex] trying to add a new module '${key}' on hot reloading, ` +
+          'manual reload is needed'
+        )
+        return
+      }
+      updateModule(targetModule.modules[key], newModule.modules[key])
+    }
+  }
+}
+
 function resetStore (store) {
   store._actions = Object.create(null)
   store._mutations = Object.create(null)

+ 21 - 0
test/unit/test.js

@@ -970,6 +970,27 @@ describe('Vuex', () => {
     })
   })
 
+  it('hot reload: provide warning if a new module is given', () => {
+    const store = new Vuex.Store({})
+
+    spyOn(console, 'warn')
+
+    store.hotUpdate({
+      modules: {
+        test: {
+          state: {
+            count: 0
+          }
+        }
+      }
+    })
+
+    expect(console.warn).toHaveBeenCalledWith(
+      '[vuex] trying to add a new module \'test\' on hot reloading, ' +
+      'manual reload is needed'
+    )
+  })
+
   it('watch: with resetting vm', done => {
     const store = new Vuex.Store({
       state: {