一个合理的前端应用文件结构

news2024/11/24 23:53:58

在大型应用中,最关键且最具挑战性的方面之一就是拥有一个良好且合理的文件结构。在考虑通过微前端将代码库拆分成多个应用之前,可以遵循一些步骤来改善项目级别的架构,并在您考虑这一路径时使过渡更容易。

我们的目标是应用某种模块化方法,使代码库更容易理解,通过为各个功能设置边界,减少代码耦合和副作用。

默认项目结构

默认情况下,当使用流行的前端框架之一搭建新项目时,组件结构是扁平的,并且没有任何层次结构。

d29bb7514ce6b1d47de09ac75058efeb.png

本示例使用的是 Vue 的默认项目结构,但 React 对如何将文件放入文件夹也没有意见。

这个例子使用了 Vue 的默认项目结构,但 React 也没有对如何将文件放入文件夹提出意见。

  • assets:存储应用中使用的静态资产,如图像、字体和 CSS 文件。

  • components:包含可重用的 Vue 组件。推荐使用扁平层次结构。

  • main.js:作为应用的入口点,启用 Vue 并配置插件或附加库。

  • App.vue:表示应用的根组件,作为其他组件的容器并充当主要模板。

我们通过实践发现,对于大型项目,这种架构很快就会失控。需要某种模块化方法来轻松定位给定的文件,为各个功能设置边界,并避免组件的紧密耦合。

将应用分解成多个功能

将应用分解成多个功能任何大型应用都会被分解成多个独立的功能。识别它们并不总是容易和直接的,但经过一段时间和经验之后会变得更好。我们一起尝试将一个流行的应用分成多个部分作为练习。

e70a234ad2dd680ff057cbda18490d1a.png

Twitter 的主页有很多内容。时间线是页面的核心,被许多功能环绕,如导航、推文创建部分、带有多个子组件的侧边栏、悬浮消息组件等。

647ffb6c8a2a99d44c1224c0a46002ac.png

将构成这些功能的所有组件放在同一个文件夹中是不可维护的,即使使用 IDE 的快速查找选项,定位其中一个组件也会非常困难。

更精细的项目结构

从经验来看,更好和更全面的文件结构如下所示:

9b6601516499a98bc9d40d66b7a3eaab.png

  • components:所有跨整个应用使用的共享组件。

  • composables:所有共享的 composables。

  • config:应用配置文件。

  • features:包含所有应用功能。我们希望将大部分应用代码放在这里。稍后会详细说明。

  • layouts:页面的不同布局。

  • lib:应用中使用的不同第三方库的配置。

  • pages:应用的页面。

  • services:共享的应用服务和提供者。

  • stores:全局状态存储。

  • test:与测试相关的 mock、帮助程序、工具和配置。

  • types:共享的 TypeScript 类型定义。

  • utils:共享的实用函数。

  • assets:静态资源。

在项目根目录下运行以下命令以创建不存在的文件夹。

mkdir -p src/{components,composables,config,features,layouts,lib,pages,services,stores,test,types,utils,assets}

需要注意的三件重要事项:

Pages 文件夹:页面文件夹已经在上下文和构建工具(如 webpack 或 Vite)将创建的实际块方面进行了一些模块化。将所有页面放在一个地方非常有帮助,但其中的逻辑应保持最低限度。

Features 文件夹:为了更容易的维护和扩展,我们希望将大部分应用代码放在 features 文件夹中。每个功能文件夹应包含特定功能的领域代码。

共享内容:在一个理想的世界中,我们不应该有共享组件、composables、stores 和 services,所有内容都应该放在相应的功能文件夹中。不幸的是,在实际项目中,这无法避免,但我们应该提前计划,并在将内容添加到这些文件夹时格外小心。

Features 文件夹

正如前面提到的,我们的大部分应用应该放在 features 文件夹中,分为多个子目录。

98a28ade1527b6eff409c1266f849a64.png

  • api:所有的 fetch 逻辑都放在这里。这将 API 和 UI 解耦。

  • components:特定功能的组件。

  • composables:特定功能的 composables。

  • stores:状态管理代码。多个子模块是预期的,实际上是被鼓励的。

  • types:特定功能的 TypeScript 类型定义。

  • index.ts:这是功能的入口点。它充当功能的公共 API,并且应该只导出应该为应用程序其他部分公开的内容。

上述的 index.ts 文件充当每个功能的公共 API。在从另一个领域导入内容时,应该仅通过此文件进行。这可以防止循环依赖,并且还可以更轻松地找到导入的来源。

// 不好的做法 🚫 🚫 🚫
import { UserProfile } from '@/features/profile/components/UserProfile.vue'

// 好的做法 ✅ ✅ ✅
import { UserProfile } from '@/features/profile'

我们可以使用 no-restricted-imports ESLint 规则来强制执行此模式。

rules: {
    'no-restricted-imports': [
      'error',
      {
        patterns: ['@/features/*/*'],
      },
    ],
    'import/no-cycle': 'error',
    ...
}
结论

以功能为导向的架构是一种有效且经过实战验证的结构复杂项目的方法。它允许我们将代码解耦成独立的模块,并随着应用的复杂性增加而扩展。这将通过提高代码库的可预测性、减少调试时间并使上手变得更容易,从而改善开发体验。

你的应用结构是否类似于此?您是否使用了不同的结构?请在下面留言。

最后:

vue2与vue3技巧合集

VueUse源码解读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1879483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于图片大小问题造成的QPixmap或QImage读取图片失败的解决办法

今天碰到一个奇怪又离谱的问题 : 图片加载失败。明明路径是正确的,图片也实实在在存在。。。 经过比对,发现如下问题: 我就齐了怪了 这大小怎么差这么多?会不会是这里除了问题。秉持着怀疑的态度,我试着用GIMP重新导出…

java笔记(30)——反射的 API 及其 使用

文章目录 反射1. 什么是反射2. 获取class字段(字节码文件对象)方式1方式2方式3应用 3. 获取构造方法和权限修饰符前期准备获取所有的公共构造方法获取所有的构造方法获取无参构造方法获取一个参数的构造方法获取一个参数的构造方法获取两个参数的构造方法…

查看Linux系统中用过什么命令 history

提示:以下所有命令都在Ubuntu-24.04-live-server-amd64系统中运行 文章目录 前言一、基本用法:二、查看其他用户历史三、增加时间戳结语 前言 history 命令用于显示和操作当前用户在当前会话中执行过的命令历史记录。它是 Bash shell 的内置命令&#x…

架构设计上中的master三种架构,单节点,主从节点,多节点分析

文章目录 背景单节点优点缺点 主从节点优点缺点 多节点优点缺点 多节点,多backup设计优点缺点 总结 背景 在很多分布式系统里会有master,work这种结构。 master 节点负责管理资源,分发任务。下面着重讨论下master 数量不同带来的影响 单节点 优点 1.设…

PTA:7-194 循环结构 —— 中国古代著名算题。趣味题目:物不知其数。

作者 苑丽红 单位 长春理工大学 中国古代著名算题。原载《孙子算经》:“今有物不知其数,三三数之剩二;五五数之剩三;七七数之剩二。问物几何?”。本题要求:设某物数量是 N,且三三数剩 x,五五…

如何在Ubuntu20上离线安装joern(包括sbt和scala)

在Ubuntu 20上离线安装Joern,由于Joern通常需要通过互联网从其官方源或GitHub等地方下载,但在离线环境中,我们需要通过一些额外的步骤来准备和安装。(本人水平有限,希望得到大家的指正) 我们首先要做的就是…

Excel 快速查询工具 2023.7.1 更新

Excel 快速查询工具作者表示这个软件是因为有时候需要在 Excel 和网站之间进行切换非常的麻烦,这款软件可以以半透明的方框位于桌面上。 特点 软件窗口半透明并至于顶部,无需来回切换界面。 实时查询,不用点击查询或者按回车之类的&#x…

什么是Cookie?有什么用?如何清除浏览器中的Cookie?

互联网上的每一次点击和每一个选择都可能被一种名为Cookie的技术记录下来。但Cookie是什么?我们在网站上登录时,为什么经常会被问及是否接受Cookie?接受Cookie登录会不会影响我们的在线隐私? Cookie是什么? Cookie是一…

vue3 全局引入 onMounted, reactive, ref 的插件全局引入

webpack 的引入 npm install -D unplugin-auto-import const AutoImport require(unplugin-auto-import/webpack).default;configureWebpack: {devtool: source-map,module: {rules: [{test: /\.mjs$/,include: /node_modules/,type: javascript/auto}],}, plugins: [Aut…

LLM——10个大型语言模型(LLM)常见面试题以及答案解析

今天我们来总结以下大型语言模型面试中常问的问题 1、哪种技术有助于减轻基于提示的学习中的偏见? A.微调 Fine-tuning B.数据增强 Data augmentation C.提示校准 Prompt calibration D.梯度裁剪 Gradient clipping 答案:C 提示校准包括调整提示,尽量减少产生…

基于大津阈值法和二值化与联通区域标记进行图像目标计数

1 建模 A.读取图像: 1.使用imread函数读取图像文件。 2.如果图像是彩色的,通常需要先转换为灰度图像,因为大津阈值法通常应用于灰度图像。 B.灰度化: 1.如果图像是彩色的,使用rgb2gray函数将其转换为灰度…

Data-Driven Reinforcement Learning for Robotic Manipulation

意思是 不同的任务以及机器人都有单独的数据和模型 未来需要整合 一个大的数据集包含所有的 然后训练一个大模型 以后具体的任务只需要针对这个模型进行微调 challenge bootstrapping with large data 2 3 4 高清图补充

uniapp, ‍[⁠TypeError⁠]‍ “Failed to fetch dynamically imported module“ 报错解决思路

文章目录 1. 背景2. 报错3. 解决思路4. 思考参考1. 背景 最近基于uniapp开发一款设备参数调试的APP软件,在使用第三方插件的过程中,出现下面的报错。 2. 报错 [plugin:vite:import-analysis] Cannot find module ‘D:/leaning/uniapp/demo/jk-uts-udp示例/uni_modules/uts-…

安装maven与nexus

安装maven与nexus Maven官网下载地址:http://maven.apache.org cd /data/software/wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.8-bin.tar.gz# 解压 tar xf apache-maven-3.8.1-bin.tar.gz -C /opt/[rooth…

在Clion使用CubeMX Stm32的步骤

Step1 准备软件,安装环境: 1. cubemx v6.5.0(可以兼容以前版本的project) https://www.st.com.cn/zh/development-tools/stm32cubemx.html STM32CubeMX 默认安装目录, 6.5版本可以兼容老版本 C:\Program Files\STMicroelectroni…

关于响应式编程的理解与SpringCloudGateway的理解

关于响应式编程的理解与SpringCloudGateway的理解 一. 响应式编程与函数式编程的区别二. 响应式编程中常用的组件2.1 RxJava定义2.2 Rxjava基本概念2.3 RxJava 用法 三 SpringcloudGateway四 常见的四种限流规则 一. 响应式编程与函数式编程的区别 总的来说,响应式编…

WEB攻防【4】——JavaWeb项目/JWT身份攻击/组件安全/访问控制

一、知识点 1、Javaweb常见安全及代码逻辑 Javaweb的架构: 如何通过包查找到文件,通过URL对应源码的文件,或者通过源码文件对应URL地址。 2、目录遍历&身份验证&逻辑&JWT Javaweb里面有身份认证的JWT的技术,pyth…

ctfshow-web入门-命令执行(web66-web70)

目录 1、web66 2、web67 3、web68 4、web69 5、web70 1、web66 show_source 被禁用 highlight_file 发现 flag 不在 flag.php 里面 先使用 scandir() 进行目录扫描: cprint_r(scandir("./")); 当前目录下只有 index.php 和 flag.php 扫一下根目…

DAMA学习笔记(三)-数据架构

1.引言 架构是构建一个系统(如可居住型建筑)的艺术和科学,以及在此过程中形成的成果——系统本身。用通俗的话说,架构是对组件要素有组织的设计,旨在优化整个结构或系统的功能、性能、可行性、成本和用户体验。 对于架…

树莓派安装windows系统

第1步: https://uupdump.net/下载对应的系统文件,所有选择项都默认选择。 第2步: 解压下载后的文件,双击运行下面文件。等待下载完成,等待过程很漫长,很考验耐心。 第3步: 提示已经finish了&…