”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用镜像部署 Vite/React 应用程序:完整指南

使用镜像部署 Vite/React 应用程序:完整指南

发布于2024-11-07
浏览:879

Deploying a Vite/React Application with Images: A Complete Guide

在 GitHub Pages 上部署 Vite/React 应用程序是一个令人兴奋的里程碑,但这个过程有时会带来意想不到的挑战,特别是在处理图像和资产时。这篇博文将引导您完成整个过程,从最初的部署到解决常见问题并找到有效的解决方案。

无论您是初学者还是有经验的人,本指南都将帮助您避免常见的陷阱,并成功部署您的 Vite/React 应用程序,并正确渲染所有资源。


先决条件

在我们深入之前,请确保您具备以下条件:

  • Vite/React 项目:本指南假设您已使用 Vite 作为构建工具并使用 React 作为框架来设置项目。
  • GitHub 存储库:您应该有一个现有的 GitHub 存储库,您可以在其中推送应用程序进行部署。
  • 已启用 GitHub Pages:确保在用于部署的存储库设置中启用 GitHub Pages。

第 1 步:初始化项目和 GitHub Pages 部署

首先,确保您的 Vite/React 应用程序已正确初始化并在本地主机上运行。您可以按照如下方式创建一个基础的Vite项目:


npm create vite@latest


安装依赖项:


npm install


在本地运行项目以确认一切正常:


npm run dev


项目准备就绪后,将其推送到 GitHub 存储库。

为 GitHub Pages 创建 vite.config.js

GitHub Pages 期望从特定的基本 URL 提供应用程序,该 URL 通常是您的存储库名称。更新 vite.config.js 文件以反映这一点:


import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
  base: process.env.NODE_ENV === 'production' ? '/your-repo-name/' : '/',
  plugins: [react()],
})


base 选项确保应用程序在部署时使用正确的基本路径。


第 2 步:构建和部署项目

您需要安装 gh-pages 包来处理部署。


npm install gh-pages --save-dev


在 package.json 中,添加以下脚本以自动执行部署过程:


"scripts": {
  "predeploy": "npm run build",
  "deploy": "gh-pages -d dist"
}


运行部署:


npm run deploy


此时,您的项目应该位于 https://.github.io//,但如果您像我一样,您可能会遇到一些问题应用程序无法正确渲染,或图像未显示。


第三步:常见问题及解决方案

问题一:部署后出现空白页

部署后,您可能会注意到应用程序加载了一个空白页面。这通常是由路由问题引起的。默认情况下,使用react-router-dom中的BrowserRouter,它依赖于服务器端路由,但GitHub Pages提供静态文件,不处理客户端路由。

解决方案:使用HashRouter

要解决此问题,请在 index.js 或 main.jsx 文件中从 BrowserRouter 切换到 HashRouter。

注意:您没有必要拥有它,它只是一个我在项目中经常使用的方便的 UI 库。


import { HashRouter } from 'react-router-dom';

createRoot(document.getElementById('root')).render(
  
    
      
        
      
    
  
);


HashRouter 在 URL 中使用井号 (#) 来跟踪导航状态,允许 GitHub Pages 正确服务不同的路由,而不会返回 404。


问题2:刷新或其他路由出现404错误

修复空白页问题后,您可能面临的另一个问题是应用程序在主页上运行,但在导航到其他路线时显示 404 错误,特别是当您直接访问 /blogs 或 /projects 等路线时。

发生这种情况是因为 GitHub Pages 只知道如何提供 index.html 文件,而无法识别由 React Router 管理的路由。

解决方案:在 GitHub Pages 设置中处理 404 错误

要解决此问题,您需要在 public/ 文件夹中创建一个 404.html 文件。该文件将确保 GitHub Pages 为您的 index.html 文件提供它无法识别的任何路由,从而允许 React Router 处理路由:

  1. 将您的index.html复制到名为404.html的新文件中。
  2. 将此文件放入您的 public/ 文件夹中。
  3. 重建并重新部署项目。

问题 3:生产环境中图像未加载

最常见的部署问题之一是图像加载不正确。虽然它们在本地主机上运行良好,但在部署到 GitHub Pages 后您可能会注意到图像链接损坏。

例如,您可以在组件中引用如下图像:


thumbnail


问题:图像路径不正确

这里的问题是,当应用程序部署在子目录(例如 /your-repo-name/)中时,绝对路径(以 / 开头)无法正常工作。 GitHub Pages 尝试在 https://.github.io/Images/myImage.png 而不是 https://.github.io/your-repo-name/Images/myImage.png 查找图像,导致 404 错误。

解决方案:使用 BASE_URL

要解决此问题,请将所有图像移至公共/图像中,虽然这是可选的,但我强烈建议您这样做。您将根据环境动态地将 BASE_URL 添加到图像路径:

  1. 定义一个依赖于环境的BASE_URL常量:

   const BASE_URL = import.meta.env.BASE_URL;


  1. 引用图像时使用此 BASE_URL:

   thumbnail


注意:不要忘记删除 Images 前面的 /,否则它会加倍,一个来自 BASE_URL,另一个来自您忘记删除的 /Images。

这可确保在开发 (localhost) 和生产 (GitHub Pages) 中使用正确的路径。


第 4 步:最终部署

实施路由和图像路径修复后,重建并重新部署您的应用程序:


npm run build
npm run deploy


您的 Vite/React 应用程序现在应该已完全部署,所有图像均已正确渲染,所有路由均已正确处理。

总之:

  1. 路由问题:在 GitHub Pages 等静态部署中使用 HashRouter 进行正确路由。
  2. 路由上的 404 错误:创建 404.html 文件以确保 GitHub Pages 正确为您的应用程序提供服务。
  3. 图像未加载:将所有图像移至 Public/Images 并将 BASE_URL 动态附加到您的资源路径以处理开发和生产环境。

通过这些步骤,您的 Vite/React 应用程序应该可以在 GitHub Pages 上正常运行并顺利运行。祝您编码和部署愉快!

版本声明 本文转载于:https://dev.to/usooldatascience/deploying-a-vitereact-application-with-images-a-complete-guide-12p3?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-07-04
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-07-04
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
    编程 发布于2025-07-04
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-07-04
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-07-04
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-07-04
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-07-04
  • 如何在Chrome中居中选择框文本?
    如何在Chrome中居中选择框文本?
    选择框的文本对齐:局部chrome-inly-ly-ly-lyly solument 您可能希望将文本中心集中在选择框中,以获取优化的原因或提高可访问性。但是,在CSS中的选择元素中手动添加一个文本 - 对属性可能无法正常工作。初始尝试 state)</option> < op...
    编程 发布于2025-07-04
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确预期操作结果的火灾和...
    编程 发布于2025-07-04
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-07-04
  • Python中何时用"try"而非"if"检测变量值?
    Python中何时用"try"而非"if"检测变量值?
    使用“ try“ vs.” if”来测试python 在python中的变量值,在某些情况下,您可能需要在处理之前检查变量是否具有值。在使用“如果”或“ try”构建体之间决定。“ if” constructs result = function() 如果结果: 对于结果: ...
    编程 发布于2025-07-04
  • 解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    编程 发布于2025-07-04
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-07-04
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-07-04
  • 如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    编程 发布于2025-07-04

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3