学习之前,我们首先一起来学习一下项目的整体结构。
大概的目录如下
10# + 表示文件夹 - 表示文件20+ node_modules30+ public40+ src50- .gitignore60- .eslint.config.js70- index.html80- package.json90- README.md10- tsconfig.json11- vite.config.ts
node_modules
是项目所有依赖包的安装位置。我们的项目依赖配置在 package.json
文件中,当我们执行 npm i
时,所有的依赖包都会安装到 node_modules
文件中去。
当我们在模块中使用如下代码时
1import {useState} from 'react'2import lodash from 'lodash'34...
此时构建工具会模拟 node.js
的模块查找规则,自动从同级目录的 node_modules
文件夹中查找是否存在该模块。他的查找顺序为
在我们的前端项目中,通常情况下仅会在项目根目录中包含 node_modules
文件夹。例如我们要找到的 react
模块放在 node_modules/react
中。
当在 node_modules 文件夹中找到了依赖包文件之后,此时的三方依赖包通常会在自己项目的 package.json
文件中设置模块入口文件。例如在 React 中,通过字段 main
来设置。
10{20"name": "react",30"description": "React is a JavaScript library for building user interfaces.",40"keywords": [50"react"60],70"version": "19.0.0",80"main": "index.js",90...10}
掌握这些基础知识,我们可以非常准确的定位到三方依赖的模块代码。
public 是一个非常特殊的文件夹。用于存放不需要经过构建处理的静态资源,这些资源会直接被复制到构建输出的根目录中,开发者可以通过根路径直接访问它们。
例如,我们有一个 logo.png
存放在 public 目录中
1+ public2+ images3- logo.png4- react.svg5- vite.svg
那么在项目代码中,我们就可以直接使用根目录来访问该图片。注意这里的访问目录是 /images/logo.png
,而不是 public/images/logo.png
。这是因为构建之后,public 下的内容会直接复制到构建根目录中。
<img src="/images/logo.png" alt="" />
在使用的时候,我们一定要住,存放在 public 中的静态资源,一定是你非常明确不需要进行任何处理和优化的静态资源。例如字体文件、已经被压缩过的三方依赖包等
常见的使用场景如下
1+ public2- favicon.ico3+ fonts4- font.woff25- font.tto6+ documents7- manual.pdf
项目构建之后输出结果为
1+ dist2- favicon.ico3+ fonts4- font.woff25- font.tto6+ documents7- manual.pdf
这是项目的核心目录,我们开发项目时,所编写的项目几乎都是存放在该项目中,包括组件、样式、工具函数、配置文件等等。它是开发过程中最主要的目录,所有需要经过 Vite 构建工具处理的代码和资源都应该放在这里。
在自动创建的 react 项目中,src 目录中的 main.tsx
是项目的入口文件
10import { StrictMode } from 'react'20import { createRoot } from 'react-dom/client'30import './index.css'40import App from './App.tsx'5060createRoot(document.getElementById('root')!).render(70<StrictMode>80<App />90</StrictMode>,10)
我们可以看到,在该目录中,代码是通过模块化的方式组织(如 ES Modules 或 CommonJS) 组织起来的。我们会大量运用到 import
export
require
等模块相关的语法。
在项目根目录中,我们还发现了一个比较重要的文件 index.html
. index.html 是项目的入口 HTML 文件,也是 Vite 开发服务器和构建过程的起点。它扮演着至关重要的角色,既是应用的页面骨架,也是 Vite 注入脚本和资源的入口。
vite 会将所有资源打包并注入到该文件中。
1<link rel="stylesheet" href="/assets/style.abc123.css" />2<script type="module" src="/assets/main.xyz456.js"></script>
我们也可以手动在 index.html
中新增一些代码,例如,配置 viewport
,引入第三方已经打包好的静态资源等。
10<!doctype html>20<html lang="zh">30<head>40<meta charset="UTF-8" />50<link href="https://framerusercontent.com/images/YRd2KCq4G2aXNg15aHvl7AtcGQ.png" rel="icon" media="(prefers-color-scheme: light)">60<link rel="stylesheet" href="https://rsms.me/inter/inter.css">70<meta name="viewport" content="width=device-width, initial-scale=1.0 maximum-scale=1, user-scalable=no" />80<meta name="mobile-web-app-capable" content="yes">90<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">10<title>usehook - 这波能反杀</title>11</head>12<body>13<div id="root"></div>14<script type="module" src="/src/main.tsx"></script>15</body>16</html>