面试官:说下你的vue项目的目录结构,如果是大型项目你该怎么划分结构和划分组件呢?...

news/2024/7/10 3:17:07 标签: vue, js, babel, xhtml, html
htmledit_views">
html" title=js>js_content">

一、为什么要划分

使用html" title=vue>vue构建项目,项目结构清晰会提高开发效率,熟悉项目的各种配置同样会让开发效率更高

在划分项目结构的时候,需要遵循一些基本的原则:

  • 文件夹和文件夹内部文件的语义一致性

  • 单一入口/出口

  • 就近原则,紧耦合的文件应该放到一起,且应以相对路径引用

  • 公共的文件应该以绝对路径的方式从根目录引用

  • /src 外的文件不应该被引入

文件夹和文件夹内部文件的语义一致性

我们的目录结构都会有一个文件夹是按照路由模块来划分的,如pages文件夹,这个文件夹里面应该包含我们项目所有的路由模块,并且仅应该包含路由模块,而不应该有别的其他的非路由模块的文件夹

这样做的好处在于一眼就从 pages文件夹看出这个项目的路由有哪些

单一入口/出口

举个例子,在pages文件夹里面存在一个seller文件夹,这时候seller 文件夹应该作为一个独立的模块由外部引入,并且 seller/index.html" title=js>js 应该作为外部引入 seller 模块的唯一入口

// 错误用法
import sellerReducer from 'src/pages/seller/reducer'

// 正确用法
import { reducer as sellerReducer } from 'src/pages/seller'

这样做的好处在于,无论你的模块文件夹内部有多乱,外部引用的时候,都是从一个入口文件引入,这样就很好的实现了隔离,如果后续有重构需求,你就会发现这种方式的优点

就近原则,紧耦合的文件应该放到一起,且应以相对路径引用

使用相对路径可以保证模块内部的独立性

// 正确用法
import styles from './index.module.scss'
// 错误用法
import styles from 'src/pages/seller/index.module.scss'

举个例子

假设我们现在的 seller 目录是在 src/pages/seller,如果我们后续发生了路由变更,需要加一个层级,变成 src/pages/user/seller

如果我们采用第一种相对路径的方式,那就可以直接将整个文件夹拖过去就好,seller 文件夹内部不需要做任何变更。

但是如果我们采用第二种绝对路径的方式,移动文件夹的同时,还需要对每个 import 的路径做修改

公共的文件应该以绝对路径的方式从根目录引用

公共指的是多个路由模块共用,如一些公共的组件,我们可以放在src/components

在使用到的页面中,采用绝对路径的形式引用

// 错误用法
import Input from '../../components/input'
// 正确用法
import Input from 'src/components/input'

同样的,如果我们需要对文件夹结构进行调整。将 /src/components/input 变成 /src/components/new/input,如果使用绝对路径,只需要全局搜索替换

再加上绝对路径有全局的语义,相对路径有独立模块的语义

/src 外的文件不应该被引入

html" title=vue>vue-cli脚手架已经帮我们做了相关的约束了,正常我们的前端项目都会有个src文件夹,里面放着所有的项目需要的资源,html" title=js>js,css, png, svg 等等。src 外会放一些项目配置,依赖,环境等文件

这样的好处是方便划分项目代码文件和配置文件

二、目录结构

单页面目录结构

project
│  .browserslistrc
│  .env.production
│  .eslintrc.html" title=js>js
│  .gitignore
│  html" title=babel>babel.config.html" title=js>js
│  package-lock.html" title=js>json
│  package.html" title=js>json
│  README.md
│  html" title=vue>vue.config.html" title=js>js
│  yarn-error.log
│  yarn.lock
│
├─public
│      favicon.ico
│      index.html
│
|-- src
    |-- components
        |-- input
            |-- index.html" title=js>js
            |-- index.module.scss
    |-- pages
        |-- seller
            |-- components
                |-- input
                    |-- index.html" title=js>js
                    |-- index.module.scss
            |-- reducer.html" title=js>js
            |-- saga.html" title=js>js
            |-- index.html" title=js>js
            |-- index.module.scss
        |-- buyer
            |-- index.html" title=js>js
        |-- index.html" title=js>js

多页面目录结构

my-html" title=vue>vue-test:.
│  .browserslistrc
│  .env.production
│  .eslintrc.html" title=js>js
│  .gitignore
│  html" title=babel>babel.config.html" title=js>js
│  package-lock.html" title=js>json
│  package.html" title=js>json
│  README.md
│  html" title=vue>vue.config.html" title=js>js
│  yarn-error.log
│  yarn.lock
│
├─public
│      favicon.ico
│      index.html
│
└─src
    ├─apis //接口文件根据页面或实例模块化
    │      index.html" title=js>js
    │      login.html" title=js>js
    │
    ├─components //全局公共组件
    │  └─header
    │          index.less
    │          index.html" title=vue>vue
    │
    ├─config //配置(环境变量配置不同passid等)
    │      env.html" title=js>js
    │      index.html" title=js>js
    │
    ├─contant //常量
    │      index.html" title=js>js
    │
    ├─images //图片
    │      logo.png
    │
    ├─pages //多页面html" title=vue>vue项目,不同的实例
    │  ├─index //主实例
    │  │  │  index.html" title=js>js
    │  │  │  index.html" title=vue>vue
    │  │  │  main.html" title=js>js
    │  │  │  router.html" title=js>js
    │  │  │  store.html" title=js>js
    │  │  │
    │  │  ├─components //业务组件
    │  │  └─pages //此实例中的各个路由
    │  │      ├─amenu
    │  │      │      index.html" title=vue>vue
    │  │      │
    │  │      └─bmenu
    │  │              index.html" title=vue>vue
    │  │
    │  └─login //另一个实例
    │          index.html" title=js>js
    │          index.html" title=vue>vue
    │          main.html" title=js>js
    │
    ├─scripts //包含各种常用配置,工具函数
    │  │  map.html" title=js>js
    │  │
    │  └─utils
    │          helper.html" title=js>js
    │
    ├─store //html" title=vue>vuex仓库
    │  │  index.html" title=js>js
    │  │
    │  ├─index
    │  │      actions.html" title=js>js
    │  │      getters.html" title=js>js
    │  │      index.html" title=js>js
    │  │      mutation-types.html" title=js>js
    │  │      mutations.html" title=js>js
    │  │      state.html" title=js>js
    │  │
    │  └─user
    │          actions.html" title=js>js
    │          getters.html" title=js>js
    │          index.html" title=js>js
    │          mutation-types.html" title=js>js
    │          mutations.html" title=js>js
    │          state.html" title=js>js
    │
    └─styles //样式统一配置
        │  components.less
        │
        ├─animation
        │      index.less
        │      slide.less
        │
        ├─base
        │      index.less
        │      style.less
        │      var.less
        │      widget.less
        │
        └─common
                index.less
                reset.less
                style.less
                transition.less

小结

项目的目录结构很重要,因为目录结构能体现很多东西,怎么规划目录结构可能每个人有自己的理解,但是按照一定的规范去进行目录的设计,能让项目整个架构看起来更为简洁,更加易用

参考文献

  • https://juejin.cn/post/6844904129186234381#heading-0

  • https://zhuanlan.zhihu.com/p/89693668

◆ ◆ ◆  ◆ ◆
长按试试

你的在看我当成喜欢


http://www.niftyadmin.cn/n/1251659.html

相关文章

c语言 rbinom函数,R - 二项分布( Binomial Distribution)

R - 二项分布( Binomial Distribution)二项分布模型用于找出事件成功的概率,该事件在一系列实验中仅具有两种可能的结果。 例如,投掷硬币总是给出头部或尾部。 在二项分布期间估计在重复投掷硬币10次时准确找到3个头的概率。R有四个内置函数来生成二项分…

docker多个容器一起打包_docker容器打包、镜像文件导入与导出 , 支持批量

1. 查看镜像idsudo docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEquay.io/calico/node v1.0.1 c70511a49fa1 6 weeks ago 257 MBhello-world latest 48b5124b2768 2 months ago 1.84 kBquay.io/coreos/flannel v0.7.0 63cee19df39c 2 months ago 73.8 MBquay.io/calico/c…

WinSCP SSH登录Linux服务器

Wnscp dondown xshell6 下载这个都可以,xftp6和xshell6 download 首先输入主机名然后选择高级 然后选择 SHH -->验证-->密钥文件 选择私钥即可,选择过程中如果提示转码,直接选择转码,并保存到本地,然后选择…

总结c语言中数组的用途,总结一下C语言中的数组

1.关于数组的定义类型 数组名[常量表达式]定义一个长度可变的数组Example1: 错误#include#includeint main(){int n 10;int a[n] {0};system("pause");return 0;}Example2:#include#includeint main(){const int n 4; //此处n为符号常量int a[n] {1,2,3,4};pr…

php防伪溯源x系统_一物一码防伪溯源系统的好处与价值?

防伪溯源系统的好处:1、保障产品质量:生产管理规范化、标准化,是提高产品质量的有力保障。2、实施缺陷召回:当发现产品质量缺陷时,可迅速实现缺陷产品召回,将损害与损失降至较低。3、提升品牌形象&#xff…

map转换成JSON的方法

第一种alibaba falstjson&#xff1a; 1.Map转JSON Map<String, Object> map new HashMap<String, Object>();map.put("a", "a");map.put("b", "123");JSONObject json new JSONObject(map);2.map转string Map<Stri…

44 道 JS '难'题,做对一半就是高手

来源 | https://www.jianshu.com/p/e161bd720e64国外某网站给出了44道JS难题&#xff0c;试着做了下&#xff0c;只做对了17道。这些题涉及面非常广&#xff0c;涵盖JS原型、函数细节、强制转换、闭包等知识&#xff0c;而且都是非常细节的东西&#xff0c;透过这些小细节可以折…

C语言链表快速创建,C语言链表的创建,插入,删除

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#includestruct student{long number;char name[8];float score;struct student *next;}*headNULL;int sum0; //计数void main(){void show();void insert();void del();char command[6];printf("***********…