热重载

使用 webpack 的 Hot Module Replacement API热重载 - 图1 (opens new window),Vuex 支持在开发过程中热重载 mutation、module、action 和 getter。你也可以在 Browserify 中使用 browserify-hmr热重载 - 图2 (opens new window) 插件。

对于 mutation 和模块,你需要使用 store.hotUpdate() 方法:

  1. // store.js
  2. import Vue from 'vue'
  3. import Vuex from 'vuex'
  4. import mutations from './mutations'
  5. import moduleA from './modules/a'
  6. Vue.use(Vuex)
  7. const state = { ... }
  8. const store = new Vuex.Store({
  9. state,
  10. mutations,
  11. modules: {
  12. a: moduleA
  13. }
  14. })
  15. if (module.hot) {
  16. // 使 action 和 mutation 成为可热重载模块
  17. module.hot.accept(['./mutations', './modules/a'], () => {
  18. // 获取更新后的模块
  19. // 因为 babel 6 的模块编译格式问题,这里需要加上 `.default`
  20. const newMutations = require('./mutations').default
  21. const newModuleA = require('./modules/a').default
  22. // 加载新模块
  23. store.hotUpdate({
  24. mutations: newMutations,
  25. modules: {
  26. a: newModuleA
  27. }
  28. })
  29. })
  30. }

参考热重载示例 counter-hot热重载 - 图3 (opens new window)

动态模块热重载

如果你仅使用模块,你可以使用 require.context 来动态地加载或热重载所有的模块。

  1. // store.js
  2. import Vue from 'vue'
  3. import Vuex from 'vuex'
  4. // 加载所有模块。
  5. function loadModules() {
  6. const context = require.context("./modules", false, /([a-z_]+)\.js$/i)
  7. const modules = context
  8. .keys()
  9. .map((key) => ({ key, name: key.match(/([a-z_]+)\.js$/i)[1] }))
  10. .reduce(
  11. (modules, { key, name }) => ({
  12. ...modules,
  13. [name]: context(key).default
  14. }),
  15. {}
  16. )
  17. return { context, modules }
  18. }
  19. const { context, modules } = loadModules()
  20. Vue.use(Vuex)
  21. const store = new Vuex.Store({
  22. modules
  23. })
  24. if (module.hot) {
  25. // 在任何模块发生改变时进行热重载。
  26. module.hot.accept(context.id, () => {
  27. const { modules } = loadModules()
  28. store.hotUpdate({
  29. modules
  30. })
  31. })
  32. }