前端学习之旅(二)如何读懂一份新的vue3项目代码

一、Vue 3 项目的典型目录结构

在 Vue 3 项目中通常会有一个约定俗成的目录结构,以便于组织代码和管理项目。以下是一个常见的 Vue 3 项目目录结构示例:

my-vue-app/
├── node_modules/       // 项目依赖包
├── public/             // 公共资源目录,不经过构建工具处理
│   ├── favicon.ico     // 网站图标
│   └── index.html      // 入口 HTML 文件
├── src/                // 源代码目录
│   ├── assets/         // 静态资源,如图片、字体等
│   ├── components/     // 全局共享的组件
│   ├── views/          // 页面级组件
│   ├── router/         // 路由配置
│   ├── store/          // 状态管理(如 Pinia)
│   ├── utils/          // 工具函数
│   ├── api/            // 接口请求封装
│   ├── styles/         // 全局样式
│   ├── directives/     // 自定义指令
│   ├── plugins/        // 插件
│   ├── App.vue         // 根组件
│   └── main.js         // 入口 JavaScript 文件
├── .gitignore          // Git 忽略文件配置
├── package.json        // 项目依赖和脚本配置
├── README.md           // 项目说明文档
└── vite.config.js      // Vite 的配置文件(如果使用 Vite)

目录说明:

  • public/:存放不需要经过构建工具处理的静态资源,index.html 通常放在这里。

  • src/:项目的源代码目录,所有需要经过编译的代码都放在这里。

    • assets/:存放需要经过构建工具处理的静态资源,例如样式文件、图片等。

    • components/:存放可复用的全局组件,这些组件通常是无业务逻辑的纯组件。

    • views/:存放页面级组件,对应路由,一个视图通常代表一个完整的页面。

    • router/:存放路由配置,例如 index.js 文件。

    • store/:存放全局状态管理相关的代码,例如使用 Pinia 或 Vuex。

    • utils/:存放工具函数,例如请求封装、日期处理等。

    • api/:存放与后端交互的接口请求封装。

    • styles/:存放全局的样式文件,如变量定义、混入等。

    • directives/:存放自定义指令。

    • plugins/:存放插件的初始化配置。

    • App.vue:根组件。

    • main.js:应用的入口文件,负责创建 Vue 实例,挂载应用。


二、如何熟悉一份新的 Vue 3 代码

可以按照以下步骤来熟悉和理解项目的结构和工作原理。

1. 阅读 package.json

  • 了解项目依赖:查看 dependenciesdevDependencies,了解项目使用了哪些主要的库和工具。

  • 查看脚本命令:在 scripts 中可以看到项目的启动、构建、测试等脚本命令。

2. 查看 README.md

  • 项目概览README.md 通常包含项目的介绍、安装和运行说明。

  • 特殊注意事项:如果项目有特殊的配置或需要注意的地方,通常会在这里提到。

3. 理解项目的入口文件

  • public/index.html

    • 作为应用的模板文件,可以看到根元素 <div id="app"></div>,Vue 应用会挂载到这里。
  • src/main.jssrc/main.ts

    • 这是应用的入口文件,创建 Vue 应用实例,并挂载到 DOM。

    • 示例

      import { createApp } from 'vue';
      import App from './App.vue';
      import router from './router';
      import store from './store';
      
      const app = createApp(App);
      
      app.use(router);
      app.use(store);
      app.mount('#app');
      
  • 分析

    • 插件注册:查看是否有使用 app.use() 注册插件,如路由、状态管理、第三方插件等。

    • 全局配置:是否有全局的组件、指令、混入等注册。

4. 了解路由配置

  • 查看 src/router/index.js

    • 路由模式:是使用的 history 模式还是 hash 模式。

    • 路由表:查看定义了哪些路由,以及对应的组件。

    • 路由守卫:是否有全局的 beforeEachafterEach 守卫,了解路由跳转的逻辑控制。

  • 示例

    import { createRouter, createWebHistory } from 'vue-router';
    import Home from '../views/Home.vue';
    
    const routes = [
      { path: '/', name: 'Home', component: Home },
      { path: '/about', name: 'About', component: () => import('../views/About.vue') },
      // 更多路由
    ];
    
    const router = createRouter({
      history: createWebHistory(),
      routes,
    });
    
    export default router;
    

5. 理解状态管理

  • 查看 src/store/

    • Pinia 或 Vuex:确定项目使用的是哪种状态管理工具。

    • 模块化:如果状态管理是模块化的,需要查看各个模块的状态、actions 等。

  • 示例(使用 Pinia)

    // src/store/index.js
    import { createPinia } from 'pinia';
    
    const store = createPinia();
    
    export default store;
    
    // src/store/modules/user.js
    import { defineStore } from 'pinia';
    
    export const useUserStore = defineStore('user', {
      state: () => ({
        name: '',
        token: '',
      }),
      actions: {
        login(userInfo) {
          // 登录逻辑
        },
        logout() {
          // 登出逻辑
        },
      },
    });
    

6. 浏览组件和页面

  • src/components/

    • 全局组件:通常放置可复用的、通用的组件,如按钮、表单元素、模态框等。

    • 查看组件命名:了解组件的命名规则,便于理解组件的职责。

  • src/views/

    • 页面组件:对应路由的页面级组件。

    • 分析页面结构:查看页面组件的模板、脚本和样式,理解页面的布局和逻辑。

7. 理解 API 请求封装

  • src/api/

    • 请求工具:查看是否使用了 Axios、Fetch 或其他请求库。

    • 封装方式:了解请求的封装方式,是统一封装了请求方法,还是每个模块独立封装。

    • 示例

      // src/api/request.js
      import axios from 'axios';
      
      const instance = axios.create({
        baseURL: '/api',
        timeout: 5000,
      });
      
      // 请求拦截器
      instance.interceptors.request.use(config => {
        // 添加 token 或其他请求头
        return config;
      });
      
      // 响应拦截器
      instance.interceptors.response.use(
        response => response.data,
        error => Promise.reject(error)
      );
      
      export default instance;
      
      // src/api/user.js
      import request from './request';
      
      export function login(data) {
        return request.post('/user/login', data);
      }
      
      export function getUserInfo() {
        return request.get('/user/info');
      }
      

8. 查看全局样式和主题

  • src/styles/

    • 全局样式:如 reset.csscommon.css

    • 变量和混入:如果使用了预处理器(如 SCSS、LESS),可能会有变量和混入的定义。

  • 主题配置:如果项目支持主题切换,查看主题相关的配置文件。

9. 检查自定义指令和插件

  • src/directives/

    • 自定义指令:查看是否有注册全局的自定义指令,如权限控制、懒加载等。
  • src/plugins/

    • 第三方插件:如引入了 Element Plus、Ant Design Vue 等 UI 库,或者其他插件的配置。

10. 理解项目的业务逻辑

  • 业务模块划分:根据路由和页面组件,了解项目的业务模块,如用户管理、商品管理等。

  • 数据流向:从组件的交互,API 的调用,状态的更新,理解数据在项目中的流动。

11. 运行项目进行调试

  • 启动项目

    npm install
    npm run dev
    
  • 实际体验:在浏览器中访问项目,体验各个功能和页面。

  • 调试工具:使用浏览器的开发者工具和 Vue Devtools,查看组件树、状态变化等。


三、串起项目的主线流程

为了更好地理解项目的整体流程,可以尝试串起以下主线:

  1. 应用启动

    • main.js 创建 Vue 应用实例,注册插件,挂载根组件 App.vue
  2. 路由加载

    • 路由匹配:根据 URL,路由器加载对应的页面组件。

    • 路由守卫:在路由切换前后,执行相应的逻辑,如权限验证、数据预加载。

  3. 组件渲染

    • 页面组件:页面组件加载所需的数据,渲染页面。

    • 子组件:页面组件引用的子组件,完成各自的功能。

  4. 数据交互

    • API 请求:组件中调用封装的 API 方法,与后端进行数据交互。

    • 状态更新:将获取的数据更新到组件的状态或全局状态管理中。

  5. 事件处理

    • 用户交互:监听用户的操作,如点击、输入等,触发相应的事件处理函数。

    • 数据变化:响应式系统监听数据的变化,更新视图。

  6. 全局状态

    • 状态管理:全局状态的变化可能会影响多个组件,需要了解状态的管理方式。

    • 订阅和监听:组件可能会订阅状态的变化,做出相应的更新。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

友情链接更多精彩内容