项目目录规范设计与实战中的避坑指南

永香的笔记 前端 阅读 834
赞 16 收藏
二维码
手机扫码查看
反馈

项目初期的目录规范选型

最近刚结束一个中型项目的重构,前端部分用了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里,但因为历史原因散落在各个模块里。这个后续还得慢慢整理。

以上是我个人对目录规范的一些实战经验,欢迎评论区交流。特别是关于模块间依赖管理这块,如果大家有更好的实践方案,非常期待听到你的分享。

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论

暂无评论