Vite 打包构建的产物

当我们谈到现代前端工具时,Vite 是一个不可忽视的名字。它以极快的开发速度和高效的生产构建而闻名。不知道朋友们有没有跟我有一样好奇,当 Vite 将你的代码打包时,它究竟会生成什么样的文件?又是如何智能地找到入口文件和资源文件的?或者是在开发环境中遇到了很多路径问题报错,然后不知道出什么问题了,找 bug 半天一天就过去了……不说了,想起来就痛苦😭,还是先来讲一下 Vite 构建前后的项目结构有什么区别,以及在开发环境和生产环境部署的时候,如何找到这些文件路径的,为什么开发环境这样写路径,他到了生产环境就也能找到这个路径下的资源呢?

一、Vite 构建前的项目结构

在开发环境中,你的项目可能会长这样:

Alt

├── node_modules/        # 相关包文件夹
├── public/              # 静态资源文件,原封不动地复制到 dist
├── src/                 # 源代码文件夹
│   ├── assets/          # 样式、图片等资源
│   ├── components/      # 组件
│   ├── App.vue          # 根组件
│   ├── main.ts          # 应用入口文件
└── index.html            # 项目入口文件
├── vite.config.ts       # Vite 配置文件
└── package.json         # 项目配置
└── ......               # 其他配置

开发环境中的路径是如何工作的?

在开发环境中,Vite 使用的是原生的 ES 模块支持。你的文件路径(如 /src/main.ts/src/assets/logo.png)会直接按需加载,不需要打包。Vite 内部有一个基于 esbuild 的高速开发服务器,处理这些模块的解析。

比如你在 main.ts 中导入了一张图片:

import logo from './assets/logo.png';

在开发环境下,你的主机域名加开发服务器的指定的端口号指向这个项目文件夹的根目录,Vite 会直接将 logo 解析为一个动态生成的 URL,比如:

http://localhost:3000/src/assets/logo.png

这就是为什么在开发环境中,你可以直接使用相对路径,而不需要担心编译、打包等问题。

二、Vite 构建后的产物

Vite 会将代码打包成适合部署的静态文件,这些文件最终生成在 dist/ 目录下,可以直接部署到生产环境中。主要包括:

1.HTML 文件

入口文件,如 index.html,用于引导加载其他资源。

示例:

  <script type="module" src="/assets/entry.123abc.js"></script>

2.CSS 文件

  • 样式被提取为独立的文件,例如 style.456def.css,便于浏览器缓存和优化加载。

3.JavaScript 文件

  • 入口文件entry.[hash].js 是应用的主入口。
  • 分包模块:通过代码分割生成的按需加载模块,例如 chunk.[hash].js
  • Vendor 文件:常用的外部库(如 Vue 或 React)被单独打包为 vendor.[hash].js,提高缓存效率。

4.静态资源文件

每一个图片、字体文件等默认会被优化后存放在 assets/ 目录中,文件名通常带有哈希值(例如 logo.789ghi.png)。

开发环境

  • 静态资源直接通过原生 ESM 加载。

  • 路径相对于项目根目录或配置的 root。例如:

 /src/assets/images/logo.png

生产环境

静态资源被打包到 dist/assets 目录,并带有哈希值。例如:

 /assets/logo.456def.png

这里不是我忘了写images路径,而是打包之后图片会脱离去原来的文件层级,直接存放在assets下。

HTML 文件会更新引用路径以匹配 base 配置(默认为 / 或自定义路径)。


当我们运行 npm run build,Vite 会生成一个 dist 文件夹,这就是打包后的产物。它的结构通常如下:

image-20241211145233177

├── dist/
│   ├── assets/            # 打包后的静态资源文件
│   │   ├── index.xxx.js
│   │   ├── index.xxx.css
│   │   ├── bg.xxx.jpg
│   ├── index.html         # 打包后的入口 HTML 文件

1. 静态资源的优化

  • 所有的 JS 和 CSS 文件都会被合并、压缩,并生成带有哈希值的文件名(如 index.abcd1234.jsindex.abcd1234.css),用来避免缓存问题。

    给各位看看压缩后的产物,我们不需要看懂,只需要知道他帮我们做了一些优化,比如将一些函数合并了,还有变成立即执行函数,以及对空行空格等进行了压缩之类的:

  • 图片资源同样会被优化,比如压缩体积或者直接内嵌成 base64。

2. 入口 HTML 文件

构建后的 index.html 文件是整个应用的入口,它会自动注入打包后的 JS 和 CSS:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><link rel="stylesheet" href="/assets/index.abcd1234.css">
</head>
<body><div id="app"></div><script type="module" src="/assets/vendor.abcd1234.js"></script>
</body>
</html>

3. 路径的处理

在生产环境下,Vite 会根据你的 base 配置,调整文件路径。默认情况下,所有资源路径都是相对根路径的(/assets/...)。如果你的项目部署在子路径下,比如 https://example.com/my-app/,需要在 vite.config.ts 中配置 base

export default defineConfig({base: '/my-app/',
});

三、为什么开发路径能在生产环境正常工作?

在开发环境中,Vite 使用的是原生路径加载,src 中的资源可以直接通过相对路径引用。而在生产环境中,Vite 的打包工具会自动调整路径,把相对路径转换成生产环境可以解析的绝对路径(如 assets 文件夹)。

在生产模式下,Vite 通过以下方式分析依赖关系:

  • 扫描 HTML 文件:读取 <script><link> 标签。
  • 递归解析:构建依赖图,找到所有被引用的资源文件。
  • 打包优化:将这些文件打包为高效、可缓存的静态资源。

同时,Vite 提供了内置的路径别名功能。例如你可以在 vite.config.ts 中配置 @ 指向 src

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';export default defineConfig({resolve: {alias: {'@': '/src',},},
});

这样,你在开发中可以直接用 @ 引用模块:

import Component from '@/components/MyComponent.vue';

而在生产构建时,Vite 会自动解析这些别名,让它们适配打包后的结构。

四、部署生产环境时的注意事项

1. 确保正确的资源路径

如果你的项目部署在非根路径下,一定要在 base 中配置正确的路径,否则资源文件可能加载失败。

2. 正确配置服务器

生产环境通常会使用 Nginx、Node.js 等作为静态文件服务器。确保你的 dist 文件夹中的 index.htmlassets 文件夹都可以被正确访问。

Nginx 示例配置:

server {listen 80;server_name your-domain.com;location / {root /path/to/your/dist;index index.html;}
}

五、总结

Vite 在开发环境下,项目文件根目录就是资源访问的根路径;在生产部署环境下,通过配置文件中的 base 配置项中指定的路径为资源访问根路径,默认为"/",就是将你的那个dist文件夹作为根路径

Vite 的打包过程将你的开发代码转化成高性能的生产代码,包含优化后的 HTML、JS 和资源文件。在开发环境和生产环境之间,Vite 通过路径的智能解析和调整,帮你省去了很多繁琐的配置工作。但同时,我们也需要注意正确配置 base 和部署路径,以确保资源能在生产环境中正常加载。

希望大家看完这篇文章后,再遇到类似路径问题,能够冷静分析,快速找到解决方法!😊

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JVM】JVM基础教程(四)

上一章&#xff1a;【JVM】JVM基础教程&#xff08;三&#xff09;-CSDN博客 目录 自动垃圾回收 方法区的回收 方法区回收条件 手动触发回收 堆回收 如何判断堆上的对象可以回收&#xff1f; 可以给对象引用赋值null&#xff0c;切断引用 引用计数法 循环引用缺点 查…

rabbitMq的rabbitmqctl status报错

Error: unable to perform an operation on node rabbitASUS-PC. Please see diagnostics information and suggestions below. 遇到上图这个错大部分问题可能是由于 RabbitMQ CLI 工具的 Erlang Cookie 与服务器上的不匹配而导致连接问题。Erlang Cookie 在 RabbitMQ 节点之间…

解读数据资产管理实践白皮书(5.0版)深入学习掌握数据资产管理知识体系。

本文介绍了数据资产管理的重要性及其概述&#xff0c;详细阐述了数据资产管理的活动职能包括数据模型管理、数据标准管理、数据质量管理等&#xff0c;并强调了数据安全管理的重要性。文章还讨论了数据资产管理的保障措施和实践步骤&#xff0c;以及发展趋势和总结展望。 重点内…

玩《剑灵》提示d3dx9_43.dll缺失怎么解决?找不到d3dx9_43.dll文件是什么原因?

《剑灵》d3dx9_43.dll缺失解决方案 在畅游《剑灵》这款深受玩家喜爱的游戏时&#xff0c;有时可能会遇到一些令人头疼的问题&#xff0c;比如提示“d3dx9_43.dll缺失”。这个错误不仅让游戏无法正常启动&#xff0c;还可能让玩家对游戏体验产生挫败感。作为一名软件开发从业者…

linux网络编程 | c | select实现多路IO转接服务器

select实现多路IO转接服务器 基于该视频完成 15-select实现多路IO转接设计思路_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 文章目录 select实现多路IO转接服务器1.思路&功能2.代码实现warp.hwarp.cmulti_select_sever.c运行图 3.代码解释&#xff08;细节&#xf…

【有啥问啥】大语言模型Prompt中的“System指令”:深入剖析与误区澄清

大语言模型Prompt中的“System指令”&#xff1a;深入剖析与误区澄清 引言 在与大语言模型&#xff08;LLM&#xff09;交互时&#xff0c;“prompt”&#xff08;提示符&#xff09;这一概念已不再陌生。Prompt是引导模型生成特定类型文本的关键输入&#xff0c;决定了模型的…

【大模型】ChatGPT 创作各类高质量文案使用详解

目录 一、前言 二、ChatGPT文案创作的优势 三、ChatGPT 各类文案创作操作实战 3.1 ChatGPT创作产品文案 3.1.1 ChatGPT创作产品文案基本思路 3.1.2 ChatGPT 创作产品文案案例一 3.1.2.1 操作过程 3.1.3 ChatGPT 创作产品文案案例二 3.2 ChatGPT 创作视频脚本 3.2.1 Ch…

前端自己也能开启HTTPS

目录 前言 使用mkcert 安装 创建证书 利用 mkcert 创建 ca 根据 ca 创建 cert 安装证书 项目开启HTTPS 安装插件 配置 vitecofnig.js 最终效果 前言 今天我发现了一个宝藏&#xff0c;兄弟们&#xff01;就是前端开发阶段是可以使用https来开发的。对不懂前端的后端兄…

预言机调研

预言机 1. 概述 预言机主要承担两个工作&#xff0c;一是验证信息可靠性&#xff0c;二是传递信息。 如果没有预言机&#xff0c;区块链的信息来源将仅限于其内部数据&#xff0c;其广泛使用的潜力和可能性将会大大降低。 区块链预言机是区块链与外部世界之间的桥梁。它们使区…

Geometric Estimation via Robust Subspace Recovery_译文ECCV2020

目录 摘要&#xff1a; 1 引言 2 相关工作 3 方法 3.1 DLT 简介 3.2 鲁棒泛化 3.3 线性结构的扩展探索 3.4 实现细节 4 实验结果 4.1 线性嵌入的定性分析 4.2 基本和单应性估计 4.3 对离群值率的敏感性 5 结论 摘要&#xff1a; 根据图像点对应关系进行几何估计是许多 …

Linux入门攻坚——41、Linux集群系统入门-lvs(2)

lvs-dr&#xff1a;GATEWAY Director只负责请求报文&#xff0c;响应报文不经过Director&#xff0c;直接由RS返回给Client。 lvs-dr的报文路线如上图&#xff0c;基本思路就是报文不会回送Director&#xff0c;第①种情况是VIP、DIP、RIP位于同一个网段&#xff0c;这样&…

中粮凤凰里共有产权看房记

中粮凤凰里看房是希望而来&#xff0c;失望而归。主要是对如下失望&#xff0c;下述仅个人看房感受&#xff1a; 1. 户型不喜欢&#xff1a;三房的厨房和餐厅位置很奇葩 2. 样板间在25楼&#xff1a;湖景一言难尽和有工厂噪声 3. 精装修的交房质量:阳台的推拉门用料很草率 …

信奥赛CSP-J复赛集训(bfs专题)(5):洛谷P3395:路障

信奥赛CSP-J复赛集训&#xff08;bfs专题-刷题题单及题解&#xff09;&#xff08;5&#xff09;&#xff1a;洛谷P3395&#xff1a;路障 题目描述 B 君站在一个 n n n\times n nn 的棋盘上。最开始&#xff0c;B君站在 ( 1 , 1 ) (1,1) (1,1) 这个点&#xff0c;他要走到 …

OpenCV的图像矫正

一、原理 图像矫正的原理是透视变换&#xff0c;下面来介绍一下透视变换的概念。 透视变换&#xff08;Perspective Transform&#xff09;基于一个4对点的映射关系&#xff08;4个源点到4个目标点&#xff09;&#xff0c;通过这些点之间的映射&#xff0c;可以计算一个变换…

vscode 打开 setting.json

按下Ctrl Shift P&#xff08;Windows/Linux&#xff09;或Cmd Shift P&#xff08;Mac&#xff09;来打开命令面板。输入open settings&#xff0c;然后选择 Open User Settings(JSON)。打开settings.json文件 ------修改设置-----&#xff1a; 1、 html代码的行长度&am…

打电话玩手机识别-支持YOLO,COCO,VOC格式的标记,超高识别率可检测到手持打电话, 非接触式打电话,玩手机自拍等

打电话玩手机识别-支持YOLO&#xff0c;COCO&#xff0c;VOC格式的标记&#xff0c;超高识别率可检测到手持打电话&#xff0c; 非接触式打电话&#xff0c;玩手机自拍等1275个图片。 手持打电话&#xff1a; 非接触打电话 玩手机 数据集下载 yolov11:https://download.csdn…

外卖开发(八)—— SpringTask(定时任务) 和 WebSocket网络协议

外卖开发&#xff08;八&#xff09;—— SpringTask 和 WebSocket 一、利用SpringTask完成定时任务1、cron表达式2、springtask实现 二、使用webSocket实现接单、催单提醒1、代码分析2、催单提醒 一、利用SpringTask完成定时任务 Spring Task是Spring框架提供的任务调度工具&…

嵌入式系统中的并行编程模型:汇总解析与应用

概述&#xff1a;随着嵌入式系统处理能力的不断提升&#xff0c;并行编程在其中的应用愈发广泛。本文深入探讨了多种专门为嵌入式设计的并行编程模型&#xff0c;包括任务队列模型、消息传递模型、数据并行模型、异构多核并行模型、实时任务调度模型以及函数式并行模型。详细阐…

MTK 配置文件梳理

文章目录 MTK 日常配置总结屏幕默认横竖屏显示ro.build.characteristics 属性修改修改点一&#xff1a;build\core\product_config.mk修改点二&#xff1a;build\make\core\main.mk修改是否成功&#xff0c;adb 验证 配置部分系统app handheld_product.mk配置系统属性、第三方应…

CentOS 上如何查看 SSH 服务使用的端口号?

我们知道&#xff0c;linux操作系统中的SSH默认情况下&#xff0c;端口是使用22&#xff0c;但是有些线上服务器并不是使用的默认端口&#xff0c;那么这个时候&#xff0c;我们应该如何快速知道SSH使用的哪个端口呢&#xff1f; 1、通过配置文件查看 cat /etc/ssh/sshd_confi…