一、前言:为什么用 Spring Boot 类比?

很多前端开发者可能同时接触过 Java 后端,而 Vue 3 和 Spring Boot 作为前后端各自的主流框架,在工程化设计理念上高度一致(比如「配置与业务分离」「组件复用」「标准化目录」)。

用 Spring Boot 类比 Vue 3 目录,能帮你跳过「纯前端概念」的壁垒,从熟悉的后端视角快速掌握 Vue 3 代码组织逻辑——毕竟,前后端的工程化本质是相通的。

二、根目录核心文件:Vue 3 vs Spring Boot

根目录是项目的「配置中枢」,包含依赖管理、构建配置、静态资源等核心文件。两者的对应关系如下:

Vue 3 根目录文件/目录

作用描述

Spring Boot 对应物

核心共性(为什么能对应?)

package.json

1. 声明项目依赖(dependencies 生产依赖、devDependencies 开发依赖)
2. 定义脚本命令(如 npm run dev 启动开发服务、npm run build 打包)

pom.xml(Maven)或 build.gradle(Gradle)

依赖管理中心:两者都负责「告诉工具需要哪些依赖」「怎么执行构建命令」。比如 npm install 对应 mvn clean install,都是下载依赖的操作。

vite.config.js

1. 配置 Vite 构建工具(如开发服务器端口 server.port: 8080、跨域代理 server.proxy
2. 集成插件(如 @vitejs/plugin-vue 解析 Vue 组件)

application.propertiesapplication.yml

框架核心配置:两者都用来定制框架行为。比如 Vite 配置代理解决跨域,对应 Spring Boot 配置 server.portspring.datasource 数据库连接。

index.html

1. 前端唯一入口 HTML 文件
2. 通过 <script type="module" src="/src/main.js"> 关联 Vue 入口 JS

src/main/resources/templates/index.html(若用 Thymeleaf/Freemarker)

应用入口页面:都是用户访问时的「第一个页面文件」。Vue 的 index.html 负责加载 JS 启动前端应用,Spring Boot 的模板页面负责渲染后端数据。

public/

存放「无需 Vite 编译」的静态资源(如 favicon.ico、第三方 JS/CSS、未压缩图片),构建时原样复制到 dist/

src/main/resources/static/

未编译静态资源目录:两者存放的资源都不会被构建工具处理(比如 Vite 不压缩 public/ 里的图片,Maven 不处理 static/ 里的 JS),直接原样输出。

dist/(构建后生成)

生产环境打包产物(包含优化后的 HTML、压缩后的 CSS/JS、处理后的图片),可直接部署到 Nginx 等服务器

target/(Maven)或 build/(Gradle)

构建输出目录:两者都是「打包后可直接部署的产物」。Vue 的 dist/ 是静态资源包,Spring Boot 的 target/ 是 JAR/WAR 可执行包。

.gitignore

配置 Git 忽略的文件/目录(如 node_modules/dist/、IDE 配置文件)

.gitignore(后端项目同样存在)

版本控制忽略规则:前后端通用,避免将依赖包、构建产物等冗余文件提交到 Git。

三、src 目录:开发核心区的类比

src/ 是 Vue 3 开发的「主战场」,对应 Spring Boot 的 src/main/java/ + src/main/resources/,是业务代码和核心资源的存放地。

3.1 src 目录整体结构

先看 Vue 3 标准 src/ 结构:

src/
├── main.js          # 入口 JS(启动 Vue 应用)
├── App.vue          # 根组件(全局布局)
├── assets/          # 可编译的静态资源(SCSS、需要优化的图片)
├── components/      # 通用 UI 组件(可复用,如 Button、Card)
├── views/           # 页面级组件(对应路由,如 Home.vue、About.vue)
├── router/          # 路由配置(Vue Router)
├── store/           # 状态管理(Pinia,替代 Vuex)
└── utils/           # 工具函数(如请求封装、日期格式化)

3.2 逐个拆解:Vue 3 vs Spring Boot

1. src/main.js → Spring Boot 启动类(如 DemoApplication.java

Vue 3 中作用:前端应用的「启动入口」,负责初始化 Vue 实例、挂载核心功能(路由、状态管理)。
代码示例:

// src/main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router' // 导入路由
import { createPinia } from 'pinia' // 导入 Pinia

// 1. 创建 Vue 实例 → 2. 注册路由和 Pinia → 3. 挂载到 index.html 的 #app 元素
createApp(App)
  .use(router)
  .use(createPinia())
  .mount('#app')

Spring Boot 对应物
src/main/java/com/example/DemoApplication.java(启动类),负责初始化 Spring 容器、扫描组件。
代码示例:

// Spring Boot 启动类
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication // 扫描当前包及子包的组件(@Controller、@Service 等)
public class DemoApplication {
    public static void main(String[] args) {
        // 启动 Spring 容器
        SpringApplication.run(DemoApplication.class, args);
    }
}

共性:都是「应用启动入口」,负责初始化框架核心实例(Vue 实例 vs Spring 容器),并集成核心功能(路由/Pinia vs Controller/Service)。

2. src/App.vue → Spring Boot 全局布局模板(如 layouts/main.html

Vue 3 中作用:前端「根组件」,定义全局布局(如导航栏、页脚),通过 <router-view/> 承接不同页面组件。
代码示例(简化版):

<!-- src/App.vue -->
<template>
  <!-- 全局导航栏 -->
  <nav>
    <router-link to="/">首页</router-link>
    <router-link to="/about">关于我们</router-link>
  </nav>
  <!-- 路由出口:匹配的页面组件会渲染到这里 -->
  <router-view/>
  <!-- 全局页脚 -->
  <footer>© 2024 Vue 3 Demo</footer>
</template>
<style>
/* 全局样式 */
body { margin: 0; padding: 0; }
</style>

Spring Boot 对应物
src/main/resources/templates/layouts/main.html(全局布局模板),通过 th:replace 等语法引入子页面。
共性:都是「全局顶层结构」,统一应用的整体布局,避免每个页面重复编写导航栏、页脚等公共部分。

3. src/components/ → Spring Boot 通用组件(@Component 注解类)

Vue 3 中作用:存放「可复用的 UI 组件」(如按钮、表单、弹窗),供多个页面(views/)调用。
示例:src/components/Button/Button.vue(封装一个自定义按钮),可在 Home.vueAbout.vue 中重复使用。

Spring Boot 对应物
src/main/java/com/example/component/ 目录下的 @Component 注解类(如 DateUtilsComponent.java),封装通用业务逻辑,供多个 Controller/Service 调用。

共性:都是「复用性组件」,将独立功能封装成模块,减少代码重复(前端 UI 复用 vs 后端逻辑复用)。

4. src/views/ → Spring Boot Controller(@Controller 注解类)

Vue 3 中作用:存放「页面级组件」,每个组件对应一个路由(如 Home.vue 对应 /About.vue 对应 /about),是前端对外的「页面入口」。

Spring Boot 对应物
src/main/java/com/example/controller/ 目录下的 @Controller@RestController 类(如 UserController.java),每个接口对应一个 URL(如 /api/user/list),是后端对外的「接口入口」。

共性:都是「对外入口」—— views/ 对应前端 URL 与页面的映射,Controller 对应后端 URL 与接口的映射,直接承接用户请求。

5. src/router/ → Spring Boot @RequestMapping 注解

Vue 3 中作用:通过 Vue Router 配置「URL 与页面组件的映射关系」,控制页面跳转。
代码示例(src/router/index.js):

import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
import About from '../views/About.vue'

const routes = [
  { path: '/', name: 'Home', component: Home }, // URL / → 渲染 Home.vue
  { path: '/about', name: 'About', component: About } // URL /about → 渲染 About.vue
]

const router = createRouter({
  history: createWebHistory(), // 无 # 号的 HTML5 历史模式
  routes
})

export default router

Spring Boot 对应物
@RequestMapping@GetMapping 注解(如在 Controller 中配置 URL 与方法的映射):

@RestController
@RequestMapping("/api/user")
public class UserController {
    // URL /api/user/list → 调用 list() 方法
    @GetMapping("/list")
    public List<User> list() {
        return userService.getUserList();
    }
}

共性:都是「路由映射规则」—— 前端通过 router/ 定义 URL 到页面的映射,后端通过注解定义 URL 到接口方法的映射。

6. src/store/(Pinia)→ Spring Boot Service(@Service 注解类)

Vue 3 中作用:通过 Pinia 管理「全局状态」(如用户登录信息、购物车数据),供多个组件共享(无需通过 props 传递)。
代码示例(src/store/userStore.js):

import { defineStore } from 'pinia'

// 定义用户状态存储
export const useUserStore = defineStore('user', {
  state: () => ({
    username: '', // 用户名
    isLogin: false // 是否登录
  }),
  actions: {
    // 登录方法:修改状态
    login(username) {
      this.username = username
      this.isLogin = true
    },
    // 登出方法
    logout() {
      this.username = ''
      this.isLogin = false
    }
  }
})

Spring Boot 对应物
src/main/java/com/example/service/ 目录下的 @Service 类(如 UserService.java),封装核心业务逻辑,供多个 Controller 共享(如用户登录、数据查询)。

共性:都是「全局数据/逻辑中心」—— Pinia 存储前端全局状态,Service 处理后端全局业务逻辑,避免数据/逻辑分散在各个组件/Controller 中。

7. 其他目录类比

Vue 3 目录

作用

Spring Boot 对应物

src/assets/

存放「需 Vite 编译的静态资源」(如 SCSS 样式、需要压缩的图片),构建时会被优化(如图片压缩、SCSS 转 CSS)

src/main/resources/assets/(如需要编译的 Less 样式、模板片段)

src/utils/

存放「通用工具函数」(如 Axios 请求封装、日期格式化 formatDate()

src/main/java/com/example/util/(如 DateUtils.javaHttpUtils.java

四、核心逻辑总结:前后端工程化的共性

通过类比你会发现,Vue 3 和 Spring Boot 的目录设计,本质都是为了解决「大型项目如何组织代码」的问题,核心思路高度一致:

  1. 配置与业务分离
    根目录(package.jsonvite.config.js)负责配置,src/ 负责业务代码;对应 Spring Boot 的 pom.xmlapplication.yml 负责配置,src/main/java/ 负责业务代码。
  2. 组件化/模块化复用
    前端用 components/ 复用 UI,后端用 @Component 复用逻辑;前端用 utils/ 封装工具函数,后端用 util/ 封装工具类。
  3. 入口与实现分离
    前端用 views/ + router/ 定义页面入口,后端用 Controller + @RequestMapping 定义接口入口;核心逻辑分别放在 store/Service 中,解耦入口与实现。

五、最后:一张图搞定对应关系

为了方便记忆,整理了一张「Vue 3 vs Spring Boot 目录对应关系图」(文字版):

Vue 3 项目                ↔  Spring Boot 项目
├─ package.json           ↔  pom.xml / build.gradle(依赖管理)
├─ vite.config.js         ↔  application.yml(框架配置)
├─ index.html             ↔  templates/index.html(入口页面)
├─ public/                ↔  static/(未编译静态资源)
├─ dist/                  ↔  target/(构建输出)
└─ src/                   ↔  src/main/java/ + src/main/resources/
   ├─ main.js             ↔  DemoApplication.java(启动入口)
   ├─ App.vue             ↔  layouts/main.html(全局布局)
   ├─ components/         ↔  component/(@Component 通用组件)
   ├─ views/              ↔  controller/(@Controller 接口入口)
   ├─ router/             ↔  @RequestMapping(路由映射)
   ├─ store/              ↔  service/(@Service 业务逻辑)
   ├─ assets/             ↔  resources/assets/(可编译资源)
   └─ utils/              ↔  util/(工具类)

如果这篇文章帮你理清了 Vue 3 目录结构,欢迎点赞收藏~ 若有疑问(如 Pinia 具体用法、Vite 配置细节),可以在评论区留言讨论!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐