我的前端规范系列-前端专属的目录结构[解决项目中的钉子户]

为什么需要前端专属的项目结构

这里说到目录结构,想必不少程序员会想到按职能分目录吧!以下所提的目录结构为单页面目录结构

以下面这种为例[按职能划分]

├──src
│   ├──view                    //页面
│   ├──utils                   //JS工具库
│   ├──api                     //api接口
│   ├──style                   //style
│   ├──config                  //配置
│   ├──model                   //model层其实是redux或vux文件
│   ├──component               //组件
│   ├── App.vue                // 入口页面
│   ├── main.js                // 入口 加载组件 初始化等
│   ├── assets                 // 主题 字体等静态资源
├── index.html                 // html模板
└── package.json

其实该目录结构完全没问题,按职能划分结构非常清晰,api放api,静态资源放assets里等等。但是前端目录结构,笔者认为应该对于页面和组件继续细分

举个列子当项目较大时,api目录里存在api将会非常之多。大致效果如下图:
我的前端规范系列-前端专属的目录结构[解决项目中的钉子户]
我的前端规范系列-前端专属的目录结构[解决项目中的钉子户]
该图为笔者某个项目的api结构图,虽然笔者按照某个约定api文件名==view里对应的页面组名.但是真正维护起来有时会遇到这么两种常见情况.
1.删除页面:你将删除pages/carts[购物车页面]里的某个页面,但是问题来了你不确定api/carts[购物车api]哪些api才是不用的,其实没用到的有些IDE会提示。
2.复制移动组件或页面: 比如你想复制组件,由于划分颗粒度不够细,你又一次面临该组件对应什么api和什么静态资源,这么移动复制时只能靠猜了= =

其实出现上面问题,就是该种按职能划分的方法不太适合前端。如果你仔细想想前端页面的删除逻辑,你就会知道我们一般会去做删除或废弃的单位就是页面或组件,所以笔者前端目录应该对于页面和组件继续细分

这里在扯远点,不知各位看官老爷是否记得MVC框架,这个衍生于后端思维的前端框架。为什么会被MVVM框架逐渐取代? 原因就是MVC这种框架不适合前端这种频繁需要数据和页面组件联动的场景,因为前端不仅仅是管好数据并渲染这么简单,而是要应付各种数据变化对应的页面组件变化,而MVVM框架恰能解决该痛点。所以,后端这种按职能划分的目录结构虽好,但用于前端也不是最合适的方案。

目标

在按职能划分目录的基础上,再细分到按页面和组件划分目录,做到删除组件时不会牵连到其他组件和页面!不会出现页面删除后,资源还常驻于项目中成为钉子户.

解决方案

示例结构

├──src
│   ├──view                    //页面
│       ├──carts               //购物车页面 
│           ├──component       //该页面专用组件
│           ├──model.js        //该页面的数据层[redux和vuex文件的细分]    
│           ├──index.js        //该页面的布局文件    
│           ├──service.js      //该页面用到的api  
│           ├──index.scss      //该页面用到的scss  
│   ├──utils                   //JS工具库
│   ├──api                     //共用api接口【永不删除】
│   ├──style                   //共用style【永不删除】
│   ├──config                  //配置
│   ├──model                   //共用model层其实是redux或vux文件【永不删除】
│   ├──component               //共用组件
│       ├──map                 //地图组件
│           ├──model.js        //该组件的数据层[redux和vuex文件的细分]    
│           ├──index.js        //该组件的布局文件    
│           ├──service.js      //该组件用到的api  
│           ├──index.scss      //该组件用到的scss  
│   ├── App.vue                // 入口页面
│   ├── main.js                // 入口 加载组件 初始化等
│   ├── assets                 // 主题 字体等静态资源【永不删除】
├── index.html                 // html模板
└── package.json

这里分为三个级别共用级别,页面级别,组件级别

共用级别

这个好理解,就是项目经常会共用到的资源,基本上一旦定下,为了项目稳定就永不删除了。

页面级别

│   ├──view                    //页面
│       ├──carts               //购物车页面 
│           ├──component       //该页面专用组件
│           ├──model.js        //该页面的数据层[redux和vuex文件的细分]    
│           ├──index.js        //该页面的布局文件    
│           ├──service.js      //该页面用到的api  
│           ├──index.scss      //该页面用到的scss

可见围绕该页面各种职能的文件又再建一遍,且都为该页面专用,连组件也是页面专用级别的。

组件级别

│   ├──component               //共用组件
│       ├──map                 //地图组件
│           ├──assets          //该组件专用图片或icon  
│           ├──model.js        //该组件的数据层[redux和vuex文件的细分]    
│           ├──index.js        //该组件的布局文件    
│           ├──service.js      //该组件用到的api  
│           ├──index.scss      //该组件用到的scss

可见围绕该组件各种职能的文件又再建一遍,且都为该组件专用。

总结

在按职能划分目录的基础上,再细分到按页面和组件划分目录。如此这般,组件想删即删想改即改,副作用更可控!!再也不怕留下钉子户资源啦!

相关推荐