store 自动分块的核心是利用构建工具的代码分割能力与状态管理库的动态加载机制,将业务域 store 拆为独立 chunk 按需加载;vite + pinia 通过动态 import() 和 store factory 实现天然分块,webpack 则需配置 splitchunks 并确保异步引用。

通过插件实现 Store 的自动分块,核心是利用构建工具(如 Webpack 或 Vite)的代码分割能力,结合状态管理库(如 Pinia 或 Vuex)的模块动态加载机制,将不同业务域的 Store 模块拆分为独立 chunk,按需加载。
使用 Vite + Pinia 实现自动分块
Vite 原生支持基于 动态 import() 的异步模块加载。Pinia 允许你把 Store 定义为函数(即“store factory”),配合路由级或功能级的懒加载,就能自然触发分块。
- 把每个业务模块的 Store 写成单独文件,导出一个 useXXXStore 函数
- 在组件中不直接 import,而是用
defineAsyncComponent或await import()动态引入对应 Store - Vite 会自动为每个
import()创建独立 chunk,文件名含 hash,天然支持缓存与按需加载
示例:src/stores/user.ts 导出 useUserStore,组件中写 const { useUserStore } = await import('@/stores/user'),构建后该 Store 就会分离为独立 JS 文件。
Webpack + Vuex(或 Pinia)配合 SplitChunks 插件
Webpack 需要显式配置 splitChunks 并结合动态导入。关键不是“插件本身分块”,而是让构建工具识别 Store 的异步边界。
- 确保 Store 模块被至少一处
import()引用(比如在路由守卫、按钮点击回调里) - 在
vue.config.js或webpack.config.js中启用splitChunks.chunks: 'all' - 可添加
cacheGroups规则,例如匹配/stores\/.+\.ts$/的文件强制打入storeschunk
注意:Vuex 传统写法(全局注册 store)不利于分块;推荐改用 Pinia 或手动封装 createStore 工厂函数,避免初始化时全部加载。
借助专用插件简化配置(如 vite-plugin-pwa + 自定义逻辑)
没有“开箱即用”的 Store 分块插件,但你可以封装轻量插件来统一处理:
- 扫描
src/stores/**/*.{ts,js},自动生成按目录分组的异步加载入口 - 在开发时注入 mock store 加载器,避免构建前报错
- 配合
vite-plugin-dynamic-import等社区插件,自动将指定路径转为import()
这类插件本质是语法糖,真正起作用的仍是 Vite/Webpack 的分包机制——插件只是帮你更规范、更少出错地写出可分块的代码结构。
不复杂但容易忽略:Store 分块的前提是“不提前 import”,所有引用必须延迟到运行时。只要模块没被同步导入,构建工具就能把它拎出来单独打包。











