前端项目打包、部署的基础 (vue)

news2024/11/24 19:50:19

详细请看B站视频 BV19n4y1d7Gr 《禹神:前端项目部署指南,前端项目打包上线》,本博客为自用视频笔记。

目录

  • 项目打包
    • vue打包
    • 打包前分析项目请求
  • 本地服务器部署
    • 问题 & 解决
      • 问题1:刷新页面404问题
      • 问题2:ajax请求废了
  • nginx部署
    • ① 解决刷新页面404问题
    • ② 解决ajax请求废了问题
  • 云服务器部署

实例中的vue项目,使用的 api 是尚硅谷提供的在线 api。

项目打包

  • 我们开发时用的脚手架(比如vue-cli)其实就是一个微型服务器,用于支撑开发环境、运行代理服务器等。
  • 打包完的文件中不存在 .vue .jsx .less等文件,而是 html css js等。
  • 打包后的文件,不再借助脚手架运行,而是需要部署到服务器上运行。
  • 打包前,请务必梳理好前端项目的ajax封装(请求前缀、代理规则等)。

vue打包

vue中npm run build对项目打包,打包后会新生成一个dist文件,直接打开是空白的,需要放到服务器上才能运行。
有本地服务器部署、nginx服务器部署、云服务器部署三种方式。

打包前分析项目请求

怎么分析?随便找一个组件,分析其最后请求是怎么发送出去的。
也许会有二次封装的axios(拦截器)、baseURL

  • 分析

浏览器发送请求的时候一定是一个完整的URL(协议+主机+端口号+路由),如果没有说明协议+主机+端口号,会自动看你的所属位置(比如vue项目运行时的所属位置是http://www.localhost:8080)。因此在发送请求的时候如果没有说明,就会自动带上http://www.localhost:8080发送请求。

假设baseURL=‘/dev’,axios.get(‘/api/product/getBaseCategoryList’),那么浏览器发送请求时的完整URLhttp://www.localhost:8080/dev/api/product/getBaseCategoryList

但数据明显不是从本机拿来的 => 脚手架帮我们配置了代理

总结: 浏览器发送的请求是 http://www.localhost:8080/dev/api/product/getBaseCategoryList,但发送给了脚手架的代理,代理转发请求到真正有数据的服务器。而我们知道vue配置代理的位置在 vue.config.js文件

以视频中这个配置为例。意思是匹配请求前缀为 /dev 的请求,命中之后把这个请求转发给 target 配置里的服务器,并且我在转发的时候去掉了 dev (pathRewrite)
在这里插入图片描述

注意:如果你是用vue3+vite重写,那么按照下面的重写方式:
在这里插入图片描述

本地服务器部署

首先你得有服务器,比如node写的服务器。把打包好的dist文件夹中的内容替换到public目录下。

问题 & 解决

出现两个问题:

问题1:刷新页面404问题

打开8088端口的一瞬间(node服务器开辟的端口),加载了整个网页,网页引入JS,靠前端的JS完成了一次路由跳转,来到了首页/home。当我们刷新的时候,浏览器误以为/home是后端路由,但是服务器中没有这个路由。
解决方案:
① 在前端项目中,把路由mode:'history'模式(路径中没有#那个)改成 mode:'hash'。然后重新构建前端项目,放到node服务器中。
② 因为浏览器地址栏中发送的请求都属于GET,所以在服务器代码中添加下述代码。意思是“当我什么都匹配不上的时候,我就把前端页面/public/index.html给你,一旦给你之后,里面引入的JS就可以工作,JS工作证明前端路由可以奏效”

app.get('*',(req,res)=>{
  res.sendFile(__dirname + '/public/index.html')
})

③ 在服务器项目中安装包connect-history-api-fallback并使用该中间件。这个方法很灵活

npm i --save connect-history-api-fallback
const history = requie('connect-history-api-fallback')
app.use(history())

这个方法很灵活,灵活在他的一些配置
在这里插入图片描述

问题2:ajax请求废了

打包完之后,是纯文件了(html css js),没有脚手架了,不能使用脚手架的代理服务器了。此时发送的请求为:http://www.localhost:3000/dev/api/product/getBaseCategoryList,这里的http://www.localhost:3000是假设为express默认开启的端口。因为当页面发送请求的时候,没有说明协议+域名+端口,就会默认为当前位置。

解决方法
① http-proxy-middleware包。

npm i  http-proxy-middleware
const { createProxyMiddleware } = require('http-proxy-middleware')
app.use({
	'/dev',
	createProxyMiddleware({
		target: '尚硅谷api网站',
		changeOrigin: true,
		pathRewrite: { '^/dev' : '' }
    })
})

nginx部署

注意:修改了nginx下的文件之后需要重启nginx服务。

把打包完的dist文件夹的内容 替换掉nginx/html下的index.html,此时前两个问题又出现了。

① 解决刷新页面404问题

在conf/ nginx.conf 文件中添加这句话:

try_files $uri $uri/ /index.html;

在这里插入图片描述

② 解决ajax请求废了问题

在conf/ nginx.conf 文件中添加:
不要在nginx.conf中加注释,分号记得切换为英文模式。

location /dev {
	proxy_pass http://sph-h5-api.atguigu.cn;
}

这里怎么设置路径带不带 /dev ?写上两个斜杠,就是干掉dev,不写就是不干掉

location /dev/ {
	proxy_pass http://sph-h5-api.atguigu.cn/;
}

在这里插入图片描述

云服务器部署

详情请看B站视频 BV19n4y1d7Gr 《禹神:前端项目部署指南,前端项目打包上线》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新下载:PDFFactoryFinePrint【软件附加安装教程】

简介: pdfFactory是一款无须 Acrobat 创建 Adobe pdf 文件的打印机驱动程序, 提供的创建 PDF 文件的方法比其他方法更方便和高效。 pdfFactory 支持从所有应用程序轻松、可靠地创建 PDF 文件。 支持将单页或两页的文档,直接打印为PDF文件&a…

信息学奥赛初赛天天练-24-二叉树、N叉树遍历技巧与前缀表达式、中缀表达式、后缀表达式应用实战演练

PDF文档公众号回复关键字:20240609 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 5 根节点的高度为1,一根拥有2023个节点的三叉树高度至少为( )。 A 6 B 7 C 8 D 9 8 后缀表达式 6 2 3 + - 3 8 2 / + * 2 ^ 3 + 对应的中缀表达式是( ) A ((…

[Linux]内网穿透nps

文章目录 基础文件下载项目地址下载地址 客户端安装解压文件客户端启动客户端注册到linux系统服务客户端注册到windows系统服务windows bat 一键管理员注册windows bat 一键管理员取消 基础文件下载 项目地址 https://github.com/ehang-io/nps 下载地址 Releases ehang-io…

12.打渔还是晒网

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/17 题目描述 有句俗话叫“三天打渔,两天…

VBA高级应用30例应用2实现在列表框内及列表框间实现数据拖动

《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…

AI大模型学习(非常详细)零基础入门到精通,收藏这一篇就够了

前言 随着人工智能技术的快速发展,AI大模型学习正成为一项备受关注的研究领域。为了提高模型的准确性和效率,研究者们需要具备深厚的数学基础和编程能力,并对特定领域的业务场景有深入的了解。通过不断优化模型结构和算法,AI大模…

【西瓜书】9.聚类

聚类任务是无监督学习的一种用于分类等其他任务的前驱过程,作为数据清洗,基于聚类结果训练分类模型 1.聚类性能度量(有效性指标) 分类任务的性能度量有错误率、精度、准确率P、召回率R、F1度量(P-R的调和平均)、TPR、FPR、AUC回归…

关系数据库标准查询语言-SQL-SQL语言概述

一、SQL(Structured Query Language)语言 1、是高度非过程化的语言 2、关系数据库管理系统(RDBMS)都支持SQL标准 3、具有定义、查询、更新、控制四大功能 4、数据库对象由数据库(Database)、基本表(Table)、视图(V…

Spark参数配置不合理的情况

1.1 内存设置 💾 常见的内存设置有两类:堆内和堆外 💡 我们作业中大量的设置 driver 和 executor 的堆外内存为 4g,造成资源浪费 📉。 通常 executor 堆外内存在 executor.cores1 的时候,1g 足够了&…

都怪我当初没有好好了解你,Java虚拟机(JVM)

初始JVM JVM本质是一个运行在计算机上的程序,作用是运行Java字节码文件。 下面是它的运行流程: 看完上述运行过程,现在提出一个问题:Java是编译型语言还是解释型语言? 这里先补充什么是编译,什么是解释&am…

电子阅览室有何作用

随着互联网的快速发展,电子阅览室逐渐成为人们获取知识的新方式。它为读者提供了便捷、高效的阅读体验,具有诸多作用。首先,电子阅览室拥有丰富的电子书籍资源,涵盖了各个领域的知识。无论是文学作品还是学术论文,读者…

(Proteus仿真设计)基于51单片机的电梯程序控制系统

(Proteus仿真设计)基于51单片机的电梯程序控制系统 一.项目介绍 本设计模拟的是一个五层的,各楼层间隔为4.5m的电梯程序控制系统,能够完成各楼层乘客的接送任务。形象地说,就是要对不同楼层乘客的不同需求&#xff0…

Python第二语言(八、Python包)

目录 1. 什么是Python包 2. 创包步骤 2.1 new包 2.2 查看创建的包 2.3 拖动文件到包下 3. 导入包 4. 安装第三方包 4.1 什么是第三方包 4.2 安装第三方包-pip 4.3 pip网络优化 1. 什么是Python包 包下有__init__.py就是包,无__init__.py就是文件夹。于Ja…

Python中报错提示:TypeError: Student() takes no arguments

Python中报错提示:TypeError: Student() takes no arguments 在Python编程中,类是创建对象的蓝图。每个类都可能包含一个特殊的方法__init__,我们称之为构造函数,它在创建新实例时被调用。如果你在尝试创建一个类的实例时遇到了Ty…

SpringBoot+Vue墙绘产品展示交易平台(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户管理员 功能截图

想在VBA软件中做个登录验证会员授权,用什么云服务器好?

想在VBA中做个登录验证会员授权,用什么服务器好? 腾讯云99起,百度云50元起,不过也不知道到底是一整个虚拟机服务器, 装了WIN2012系统的,还是只是一个虚拟网站只给你一个文件夹可以上传PHP,ASP网页后台。 价…

知识图谱的应用---智慧交通

文章目录 智慧交通典型应用 智慧交通 现代城市发展过程中的一大问题是交通拥堵,为解决城市发展中的这一顽疾,有必要以现代化高科技技术为支撑,建造城市中的智慧交通系统,从源头入手缓解城市拥挤问题。当前,“智慧交通”…

6月7号作业

1, 搭建一个货币的场景,创建一个名为 RMB 的类,该类具有整型私有成员变量 yuan(元)、jiao(角)和 fen(分),并且具有以下功能: (1)重载算术运算符…

商城项目【尚品汇】08异步编排-01基础篇

文章目录 1.线程的创建方式1.1继承Thread类,重写run方法1.2实现Runnable接口,重写run方法。1.3实现Callable接口,重新call方法1.4以上三种总结1.5使用线程池创建线程1.5.1线程池创建线程的方式1.5.2线程池的七大参数含义1.5.3线程池的工作流程…

html写一个table表

HTML代码&#xff1a; <div class"table_box w-full"><div class"title_top">XX表</div><div class"title_btm">(<input class"input input_1" type"text">xxxx)</div><table class…