项目目录规范设计与实战中的避坑指南
项目初期的目录规范选型
最近刚结束一个中型项目的重构,前端部分用了Vue3,后端是Spring Boot。说起来挺有意思,这个项目一开始其实是另一个外包团队做的,后来交接给我们维护。接手的时候真是头大,目录结构乱得一塌糊涂,光是找一个组件就得翻半天。
我琢磨着既然要重构,干脆把目录规范也重新设计一遍。最开始想直接照搬Vue CLI的默认结构,但发现不太适合我们的业务场景。我们这个项目有十几个独立的业务模块,每个模块都需要单独开发和部署,所以需要更清晰的模块划分。
最大的坑:模块划分与命名冲突
说到踩坑,模块划分这块可折腾死我了。一开始我是按照功能来划分目录的,比如把所有跟用户相关的放在一起:
src/
components/
UserAvatar.vue
UserProfile.vue
views/
UserDashboard.vue
store/
user.js
看起来挺合理,对吧?结果问题来了:随着业务扩展,我发现很多组件其实既属于用户模块,又可能被其他模块复用。比如UserAvatar,在管理员后台也要用到。
后来调整了方案,改成按模块优先级划分,公共组件单独抽出来:
src/
modules/
user/
components/
UserProfile.vue
views/
UserDashboard.vue
store/
index.js
common/
components/
UserAvatar.vue
utils/
format.js
核心代码就这几行
具体实现上,我在每个模块的入口文件都做了统一的配置加载:
// src/modules/user/index.js
import UserDashboard from './views/UserDashboard.vue';
import userStore from './store';
export default {
routes: [
{ path: '/user', component: UserDashboard }
],
store: {
user: userStore
}
}
然后在主应用里动态加载这些模块:
// src/main.js
const modules = import.meta.glob('./modules/*/index.js');
Object.keys(modules).forEach(async (path) => {
const module = await modules[path]();
app.use(router.addRoutes(module.routes));
store.registerModule(Object.keys(module.store), module.store);
});
谁更灵活?谁更省事?
说实话,这个方案也不是十全十美。最大的问题是调试起来有点麻烦,特别是当你修改了一个模块的store时,整个应用都得重启。我试过用webpack的热更新来优化,但效果一般。
还有个问题就是路径别名的配置,虽然用了@符号,但在嵌套比较深的文件里还是容易写错。这里提醒下:记得在eslint里加个规则检查路径别名,能省不少事。
回顾与反思
总的来说,这次目录规范的调整还是挺成功的。最大的好处就是新人上手快了很多,之前新同事入职要看一周才能搞清楚代码结构,现在基本一天就能定位到自己负责的模块。
不过也有遗憾的地方,比如模块间的依赖关系还是有点混乱。有些公共方法本该放在utils里,但因为历史原因散落在各个模块里。这个后续还得慢慢整理。
以上是我个人对目录规范的一些实战经验,欢迎评论区交流。特别是关于模块间依赖管理这块,如果大家有更好的实践方案,非常期待听到你的分享。

暂无评论