使用vite打包并部署vue项目到nginx
1 使用 Vite 创建 vue3 项目
Vite 是一个新型的前端构建工具,专为现代浏览器和工具链而设计,提供了极快的冷启动和热模块更新(HMR)速度。以下是使用 Vite 创建 Vue 3 项目的详细步骤:
一、安装 Node.js 和 npm
首先,确保计算机上安装了 Node.js 和 npm(Node 包管理器)。具体安装方法这里不再赘述,可以在命令行中运行 node -v 和 npm -v 来检查它们是否已安装以及安装的版本。
二、全局安装 Vite
接下来,需要全局安装 Vite。打开命令行或终端,并运行以下命令:
npm install -g create-vite
或者,如果使用的是 Yarn,可以运行:
yarn global add create-vite
注意:从 Vite 2.x 版本开始,官方推荐使用 npm init vite@latest 命令来创建新项目,而不是全局安装 create-vite。因此,下面的步骤将基于这种新方法。
三、 创建 Vue 3 项目
现在,可以使用 npm init 命令来创建一个新的 Vite 项目,并指定使用 Vue 作为框架:
npm init vite@latest my-vue3-project -- --template vue
将 my-vue3-project 替换为想要的项目名称。这个命令会创建一个名为 my-vue3-project 的新文件夹,并在其中初始化一个 Vite + Vue 3 的项目。
四、进入项目目录并安装依赖
创建项目后,进入项目目录并安装依赖项:
cd my-vue3-project
npm install
或者,如果使用的是 Yarn:
cd my-vue3-project
yarn
五、运行项目
安装完依赖项后,可以运行项目:
npm run dev
或者,如果使用的是 Yarn:
yarn dev
Vite 会启动一个开发服务器,并在的默认浏览器中打开一个新的标签页,显示的 Vue 3 应用。应该会在浏览器中看到一个欢迎页面,表明项目已成功创建并正在运行。
2 编译并打包基础程序
在终端中运行以下命令来打包你的项目:
npm run build
将打包后的 dist 文件夹拷贝到 nginx 目录下的 html 文件夹中。
注意此时如果直接访问 http://localhost/dist/index.html ,则会提示找不到 index.js 以及 index.css 资源文件。这是由于 Vite 在打包时生成的资源路径是相对于根目录(/)的,而当你将 dist 文件夹放入 Nginx 的 html 目录下后,这些资源的路径就不再正确了。Nginx 默认会将 html 目录作为网站的根目录,所以当访问 http://localhost/dist/index.html 时,浏览器会尝试从网站的根目录(即 Nginx 的 html 目录)下加载 /assets/index.js,但实际上这个文件位于 html/dist/assets/ 目录下。
为了解决这个问题,可以修改 Nginx 的配置文件,将 html/dist 目录设置为网站的根目录。这样,你访问 http://localhost/index.html 时,浏览器就会从正确的位置加载资源。
修改 Nginx 配置文件的示例:
server {listen 80;server_name localhost;root ./html/dist; # 修改为指向 dist 目录index index.html;location / {try_files $uri $uri/ =404;}
}
然后重启 Nginx 使配置生效。
最后访问地址:http://localhost/
3 增加路由
Vue Router 是 Vue.js 的官方路由管理器,它允许开发者通过不同的 URL 访问不同的页面(组件)。在 Vue 3 项目中,Vue Router 的安装与配置过程相对简单且直观。
一、安装 Vue Router
* 在项目根目录下,运行 `npm install vue-router@4` 命令来安装 Vue Router 的最新版本(针对 Vue 3 的版本是 4.x)。
二、配置 Vue Router
-
创建路由配置文件:
- 在项目的
src目录下创建一个router文件夹,并在其中创建一个index.js文件。这个文件将用于定义和配置路由。
- 在项目的
-
定义路由:
-
在
src/router/index.js文件中,使用 Vue Router 提供的 API 来定义路由规则。这通常包括导入组件、定义路由对象数组,并创建路由器实例。例如: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 },
{ path: ‘/about’, name: ‘About’, component: About }
];const router = createRouter({
history: createWebHistory(),
routes
});export default router;
-
-
创建视图组件:
- 在
src/views目录下创建与路由对应的视图组件。例如,创建Home.vue和About.vue组件,并在其中编写模板和脚本。
- 在
-
注册路由:
-
在
src/main.js文件中,导入并注册 Vue Router。这通常是通过创建 Vue 应用实例,并使用.use(router)方法来完成的。例如:import { createApp } from ‘vue’;
import App from ‘./App.vue’;
import router from ‘./router’;const app = createApp(App);
app.use(router);
app.mount(‘#app’);
-
-
配置 App 组件:
-
在
App.vue文件中,添加<router-view>组件。这个组件是 Vue Router 提供的特殊组件,它会根据当前的路由显示不同的视图内容。同时,你还可以使用<router-link>组件来创建导航链接。例如:
-
4 编译并打包带路由的程序
在终端中运行以下命令来打包你的项目:
npm run build
此时如果在浏览器地址栏输入 http://localhost/about,则提示404 Not Found。
这是因为 Nginx 没有正确地配置来处理前端路由。Vue Router 在前端使用 HTML5 History 模式时(这是默认模式,除非显式地设置为 hash 模式),它会尝试使用浏览器的历史记录 API 来模拟传统的服务器端路由。这意味着当用户在浏览器中直接访问一个像 /about 这样的路由时,实际上并没有一个对应的服务器端文件(如 about.html)来响应这个请求。
为了解决这个问题,需要确保 Nginx 配置了适当的重写规则,以便对所有前端路由请求返回同一个 index.html 文件。这样,Vue Router 就可以接管路由并在客户端正确地渲染对应的组件。
以下是一个 Nginx 配置的示例:
修改 Nginx 配置文件的示例:
server {listen 80;server_name localhost;root ./html/dist; # 修改为指向 dist 目录index index.html;location / {try_files $uri $uri/ /index.html;}
}
然后重启 Nginx 使配置生效。
最后访问地址:http://localhost/about
5 处理非import形式引入的资源文件
在 Vue 3 项目中,如果通过父子组件传参的方式传递图片地址,并且这些图片地址指向的是外部资源或者是在 public 目录下的资源,而不是通过 import 语句引入的,那么 Vite 在打包时确实不会自动将这些图片包含到 assets 文件夹中。这是因为 Vite 主要处理的是通过 import 或 require 引入的模块和资源。
对于这种情况,有几个解决方案:
-
将图片放在
public目录中:
如果图片资源不需要经过 Webpack/Vite 的处理(例如,它们不是模块化的或不需要被优化),则可以简单地将它们放在public目录中。然后,可以通过相对路径或根路径来引用这些图片。例如,如果图片在public/images/logo.png,则可以在组件中通过/images/logo.png来引用它(注意,这里使用的是根路径,因为public目录的内容在构建时会被复制到输出目录的根目录下)。 -
使用
import语句引入图片:
如果希望图片被包含在最终的打包文件中,并且能够通过路径别名或其他 Webpack/Vite 提供的特性来引用它们,则应该使用import语句来引入图片。例如:// 在组件中 import logo from '@/assets/logo.png'; // 假设你有一个别名 @ 指向 src 目录export default {data() {return {logoUrl: logo};} };然后,你可以将这个
logoUrl传递给子组件,并在模板中使用它。 -
动态导入图片(如果适用):
如果图片地址是在运行时确定的(例如,从 API 获取),并且无法预先知道所有的图片地址,则可能需要使用动态导入的方法。但是,请注意,这种方法通常用于模块或代码分割,而不是直接用于图片资源。对于图片,可能仍然需要将它们放在public目录中或通过其他方式确保它们可被访问。 -
配置 Vite 以包含这些图片:
如果确实需要 Vite 在打包时包含这些图片,并且有一个明确的图片列表或模式,则需要修改你的 Vite 配置来包含这些资源。然而,这通常不是推荐的做法,因为 Vite 的设计初衷是处理 JavaScript 模块和相关的资源。对于静态资源,通常最好将它们放在public目录中。 -
使用 CDN:
如果图片资源非常大或经常更新,考虑将它们托管在 CDN 上,并从 CDN 加载它们。这样可以减轻你的服务器的负担,并且用户可以从离他们更近的位置加载资源。
在大多数情况下,将图片放在 public 目录中并通过相对或根路径引用它们是最简单和最直接的方法。如果需要更复杂的资源管理或优化,则需要考虑使用其他工具或插件来扩展 Vite 的功能。
相关文章:
使用vite打包并部署vue项目到nginx
1 使用 Vite 创建 vue3 项目 Vite 是一个新型的前端构建工具,专为现代浏览器和工具链而设计,提供了极快的冷启动和热模块更新(HMR)速度。以下是使用 Vite 创建 Vue 3 项目的详细步骤: 一、安装 Node.js 和 npm 首先…...
深度学习笔记之自然语言处理(NLP)
深度学习笔记之自然语言处理(NLP) 在行将开学之时,我将开始我的深度学习笔记的自然语言处理部分,这部分内容是在前面基础上开展学习的,且目前我的学习更加倾向于通识。自然语言处理部分将包含《动手学深度学习》这本书的第十四章,…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十九节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(ClearDiagnosticInformation_0x84服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x84服务、清除诊断信息、ISO 14229-1:2023、ECU测试 一、服…...
自动化测试框架搭建-单次接口执行-三部曲
目的 判断接口返回值和提前设置的预期是否一致,从而判断本次测试是否通过 代码步骤设计 第一步:前端调用后端已经写好的POST接口,并传递参数 第二步:后端接收到参数,组装并请求指定接口,保存返回 第三…...
Spring Bean的生命周期和作用域
一、Bean 生命周期 Bean的定义Bean的实例化属性注入Bean的初始化Bean的使用Bean的销毁 可以增强的位置: PostConstruct:属性注入后,afterPropertiesSet方法 (前提实现:InitializingBean接口)前增强。 Pr…...
DeepSeek R1生成图片总结2(虽然本身是不能直接生成图片,但是可以想办法利用别的工具一起实现)
DeepSeek官网 目前阶段,DeepSeek R1是不能直接生成图片的,但可以通过优化文本后转换为SVG或HTML代码,再保存为图片。另外,Janus-Pro是DeepSeek的多模态模型,支持文生图,但需要本地部署或者使用第三方工具。…...
ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL基本配置和使用
ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL基本配置和使用 📍项目地址:https://github.com/lvgl/lv_port_esp32参考文章:https://blog.csdn.net/chentuo2000/article/details/126668088https://blog.csdn.net/p1279030826/article/details/…...
数据库连接池与池化思想
目录 1. 数据库连接池概述 1.1 什么是数据库连接池? 1.2 为什么需要连接池? 2. 池化思想 2.1 池化思想的优点 2.2 池化思想的典型应用 3. 常见的开源数据库连接池 3.1 DBCP 3.2 C3P0 3.3 Druid 4. Druid连接池的使用 4.1 Druid的特点 4.2 D…...
深度学习和机器学习的本质区别(白话版)
深度学习与机器学习的本质区别 在人工智能的世界里,机器学习和深度学习是两个常被提及的概念,但它们在本质上有着重要区别。简单来说,机器学习依赖于人为设定的数据模式,而深度学习则更依赖于数据本身自动发现模式。 机器学习&a…...
halcon激光三角测量(十七)calibrate_sheet_of_light_3d_calib_object
目录 一、calibrate_sheet_of_light_3d_calib_object例程代码二、标定过程三、校准后的3D模型和原3D模型对齐过程四、获得模型标定结果,并生成3D模型五、set_paint 和 dev_set_paint函数 一、calibrate_sheet_of_light_3d_calib_object例程代码 1、第一部分&#x…...
【笔记】LLM|Ubuntu22服务器极简本地部署DeepSeek+联网使用方式
2025/02/18说明:2月18日~2月20日是2024年度博客之星投票时间,走过路过可以帮忙点点投票吗?我想要前一百的实体证书,经过我严密的计算只要再拿到60票就稳了。一人可能会有多票,Thanks♪(・ω・)&am…...
win11 labelme 汉化菜单
替换 app.py,再重启 #labelme 汉化菜单# -*- coding: utf-8 -*-import functools import os import os.path as osp import re import webbrowserimport imgviz from qtpy import QtCore from qtpy.QtCore import Qt from qtpy import QtGui from qtpy import QtWidgetsfrom l…...
Linux的基础指令和环境部署,项目部署实战(下)
目录 上一篇:Linxu的基础指令和环境部署,项目部署实战(上)-CSDN博客 1. 搭建Java部署环境 1.1 apt apt常用命令 列出所有的软件包 更新软件包数据库 安装软件包 移除软件包 1.2 JDK 1.2.1. 更新 1.2.2. 安装openjdk&am…...
利用Java爬虫精准获取商品SKU详细信息:实战案例指南
在电商领域,SKU(Stock Keeping Unit,库存单位)详细信息是电商运营的核心数据之一。它不仅包含了商品的规格、价格、库存等关键信息,还直接影响到库存管理、价格策略和市场分析等多个方面。本文将详细介绍如何利用Java爬…...
数值积分:通过复合梯形法计算
在物理学和工程学中,很多问题都可以通过数值积分来求解,特别是当我们无法得到解析解时。数值积分是通过计算积分区间内离散点的函数值来近似积分的结果。在这篇博客中,我将讨论如何使用 复合梯形法 来进行数值积分,并以一个简单的…...
【Java计算机毕业设计】基于SSM+VUE保险公司管理系统数据库源代码+LW文档+开题报告+答辩稿+部署教程+代码讲解
源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储:…...
C#之上位机开发---------C#通信库及WPF的简单实践
〇、上位机,分层架构 界面层 要实现的功能: 展示数据 获取数据 发送数据 数据层 要实现的功能: 转换数据 打包数据 存取数据 通信层 要实现的功能: 打开连接 关闭连接 读取数据 写入数据 实体类 作用: 封装数据…...
Pytorch论文实现之GAN-C约束鉴别器训练自己的数据集
简介 简介:这次介绍复现的论文主要是约束判别器的函数空间,作者认为原来的损失函数在优化判别器关于真样本和假样本的相对输出缺乏显式约束,因为在实践中,在优化生成器时,鉴别器对生成样本的输出会增加,但对真实数据保持不变,而优化鉴别器会导致其对真实数据的输出增加…...
vue3.x 的shallowReactive 与 shallowRef 详细解读
在 Vue 3.x 中,shallowReactive 和 shallowRef 是两个用于创建浅层响应式数据的 API。它们与 reactive 和 ref 类似,但在处理嵌套对象时的行为有所不同。以下是它们的详细解读和示例。 1. shallowReactive 作用 shallowReactive 创建一个浅层响应式对…...
MongoDB 常用命令速查表
以下是一份 MongoDB 常用命令速查表,涵盖数据库、集合、文档的增删改查、索引管理、聚合操作等场景: 1. 数据库操作 命令说明show dbs查看所有数据库use <db-name>切换/创建数据库(需插入数据后才会显示)db.dropDatabase()…...
DeepSeek崛起的本质分析:AI变局中的中国机会
DeepSeek崛起的本质分析:AI变局中的中国机会 1. 中国AI发展的大背景 近年来,全球AI技术竞争日趋白热化,而中国作为全球第二大经济体,在AI领域的投入和政策支持力度不断加大。大模型是AI产业的制高点,而美国对中国的高…...
Autojs: 使用 SQLite
例子 let db new SQLiteUtil("/sdcard/A_My_DB/sqlite.db");db.fastCreateTable("user_table",{name: "",online: false,},["name"] // 设置 name 为唯一, 重复项 不会添加成功 );// 新增数据的 ID let row_id db.insert("use…...
读书笔记 - 修改代码的艺术
读书笔记 - 修改代码的艺术 第 1 章 修改软件第 2 章 带着反馈工作系统变更方式反馈方式遗留代码修改方法 第 3 章 感知和分离伪协作程序模拟对象 第 4 章 接缝模型接缝 第 5 章 工具自动化重构工具单元测试用具 第 6 章 时间紧迫,但必须修改新生方法(Sp…...
element-plus树形数据与懒加载的实现
环境 vue版本: 2.6.14 需求 树形表格,默认返回当前登录人拥有权限的一个层级的数据,通过点击load懒加载获取下一层的数据,要求有新增、编辑、删除操作。 树类型的懒加载: 当row中包含children字段时,被…...
仿 Sora 之形,借物理模拟之技绘视频之彩
来自麻省理工学院、斯坦福大学、哥伦比亚大学以及康奈尔大学的研究人员携手开源了一款创新的3D交互视频模型——PhysDreamer(以下简称“PD”)。PD与OpenAI旗下的Sora相似,能够借助物理模拟技术来生成视频,这意味着PD所生成的视频蕴…...
【算法】快排
题目 快排 思路 如果输入为0或1直接返回;否则取一个基准值,可以取中间位置,如果输入是有序的可以避免时间过长,然后移动指针,先让i指针右移,如果小于基准值就继续右移,j指针左移同理。如果指…...
RedisTemplate存储含有特殊字符解决
ERROR信息: 案发时间: 2025-02-18 01:01 案发现场: UserServiceImpl.java 嫌疑人: stringRedisTemplate.opsForValue().set(SystemConstants.LOGIN_CODE_PREFIX phone, code, Duration.ofMinutes(3L)); // 3分钟过期作案动机: stringRedisTemplate继承了Redistemplate 使用的…...
Django REST Framework (DRF) 中用于构建 API 视图类解析
Django REST Framework (DRF) 提供了丰富的视图类,用于构建 API 视图。这些视图类可以分为以下几类: 1. 基础视图类 这些是 DRF 中最基础的视图类,通常用于实现自定义逻辑。 常用类 APIView: 最基本的视图类,所有其…...
Zotero PDF Translate插件配置百度翻译api
Zotero PDF Translate插件可以使用几种翻译api,虽然谷歌最好用,但是由于众所周知的原因,不稳定。而cnki有字数限制,有道有时也不行。其他的翻译需要申请密钥。本文以百度为例,进行申请 官方有申请教程: Zot…...
Redis离线安装
Linux系统Centos安装部署Redis缓存插件 参考:Redis中文网: https://www.redis.net.cn/ 参考:RPM软件包下载地址: https://rpmfind.net/linux/RPM/index.html http://rpm.pbone.net/ https://mirrors.aliyun.com/centos/7/os…...
