当前位置: 首页 > news >正文

【部署项目】禹神:前端项目部署上线笔记

1.项目打包

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

2.本地服务器部署

2.1.解决刷新 404 问题

问题分析:前端项目的路由,通常分为两种工作模式,分别为:

  1. hash模式

hash 值又称锚点,通常用于指定网页中的某个位置,例如下面的网址:
https://www.cctv.com/#SUBD1605080062959435,其中的#SUBD1605080062959435就是 hash 值,hash 值只在客户端(如浏览器)中使用,是不会带给服务器的,所以使用 hash 模式时,不存在刷新 404 问题。

  1. history模式

history 去掉了URL中的#号,可以让应用的URL看起来更美观,带来的问题就是刷新时,会将前端路由携带给后端,而后端没有对应资源的匹配,就出现了 404 问题。

解决方案一:将前端路由器工作模式改为 hash 模式 —— 不太推荐。
解决方案二:让服务器在收到未配置的GET路由时,都返回index.html即可。
方案二最终其实是把 url 中的 path,交给了前端路由去处理,具体配置如下:

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

也可以借助connect-history-api-fallback中间件完成配置

const history = require('connect-history-api-fallback');app.use(history());
// 配置静态资源
app.use(express.static(__dirname + '/public'))

使用connect-history-api-fallback可以让配置更灵活,比如/login临时不需要作为前端路由处理,就可以按照如下方式配置

app.use(history({verbose:false,rewrites:[{ from: /^\/login.*$/, to: (context) => context.parsedUrl.path },]
}))

2.2.请求无法发送问题

问题分析:脱离脚手架后,就没有了代理服务器,无法转发请求到【提供数据】的服务器。
如何解决?—— 在 Node 服务器中借助http-proxy-middleware中间件配置代理,具体配置如下:

// 引入createProxyMiddleware
const { createProxyMiddleware } = require('http-proxy-middleware')// 配置代理中间件
app.use('/dev', createProxyMiddleware({target: 'http://sph-h5-api.atguigu.cn',changeOrigin: true,pathRewrite: {'^/dev': ''}
}))

3.nginx 服务器部署

3.1.nginx 简介

Nginx(发音为“engine-x”)是一款高性能的 HTTP 服务器和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。Nginx 最初由 Igor Sysoev 编写,于 2004 年发布。它以其高性能、高稳定性、丰富的功能集和低系统资源消耗而闻名,主要功能有:

  • 反向代理
  • 负载均衡
  • 静态内容服务
  • HTTP/2 支持
  • SSL/TLS 支持
  • 高速缓存

3.2.nginx 配置代理练习

nginx 部署前端项目
整体思路:让nginx充当两个角色,既是 静态内容服务器,又是代理服务器

  1. 修改nginx配置如下,注意nginx的根目录最好不是 C 盘(防止权限不足)
# 配置nginx根目录
location / {root   D:\dist; # d盘下的distindex  index.html index.htm;
}
# 配置代理
location /dev/ {# 设置代理目标proxy_pass http://sph-h5-api.atguigu.cn/;
}

/dev/http://sph-h5-api.atguigu.cn/ 后面必须加上斜杠 / 表示请求匹配到/dev时 转发到 http://sph-h5-api.atguigu.cn,并且会去掉 /dev

  1. 修改前端项目,让所有请求都转发给 /dev,随后重新打包
const request = axios.create({baseURL:'/dev',timeout:10000
})
  1. 随后直接访问nginx服务器即可,例如 nginx如果运行在8099端口,则访问:
    http://localhost:8099
  2. 随后会遇到刷新404问题,追加nginx配置来解决
# 配置nginx根目录
location / {root   D:\dist;index  index.html index.htm;try_files $uri $uri/ /index.html; # 解决刷新404
}
# 配置代理
location /dev/ {# 设置代理目标proxy_pass http://sph-h5-api.atguigu.cn/;
}

4.云服务器部署

云服务器上借助nginx完成部署,大致流程与本地nginx部署一致

具体配置如下:
● 给服务器安装nginx

yum install nginx

● 将打包后的前端资源放在:/var/sph文件夹中。
● 使用Xftp配置服务器的 nginx,修改文件:/etc/nginx/nginx.config

配置文件内容如下:

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;events {worker_connections 1024;
}http {log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile            on;tcp_nopush          on;tcp_nodelay         on;keepalive_timeout   65;types_hash_max_size 2048;include             /etc/nginx/mime.types;default_type        application/octet-stream;# Load modular configuration files from the /etc/nginx/conf.d directory.# See http://nginx.org/en/docs/ngx_core_module.html#include# for more information.include /etc/nginx/conf.d/*.conf;server {listen       80 default_server;listen       [::]:80 default_server;server_name  _;root         /usr/share/nginx/html;# Load configuration files for the default server block.include /etc/nginx/default.d/*.conf;location / {root   /var/sph;index  index.html index.htm;try_files $uri $uri/ /index.html; # 解决刷新404}# 配置代理location /dev/ {# 设置代理目标proxy_pass http://sph-h5-api.atguigu.cn/;}error_page 404 /404.html;location = /40x.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}
}

5.资料地址

https://gitee.com/RanGuMo/front-deployment.git

相关文章:

【部署项目】禹神:前端项目部署上线笔记

1.项目打包 ● 我们开发用的脚手架其实就是一个微型服务器,用于:支撑开发环境、运行代理服务器等。 ● 打包完的文件中不存在:.vue、.jsx、.less 等文件,而是:html、css、js等。 ● 打包后的文件,不再借助…...

力扣10.1

983. 最低票价 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。 火车票有 三种不同的销售方式 : 一张 为期一天 的通行证售…...

TypeScript 算法手册 - 【冒泡排序】

文章目录 TypeScript 算法手册 - 冒泡排序1. 冒泡排序简介1.1 冒泡排序定义1.2 冒泡排序特点 2. 冒泡排序步骤过程拆解2.1 比较相邻元素2.2 交换元素2.3 重复过程 3. 冒泡排序的优化3.1 提前退出3.2 记录最后交换位置案例代码和动态图 4. 冒泡排序的优点5. 冒泡排序的缺点总结 …...

计算机网络——http和web

无状态服务器——不维护客户端 怎么变成有状态连接 所以此时本地建立代理—— 若本地缓存了——但是服务器变了——怎么办?...

使用 Light Chaser 进行大屏数据可视化

引言 在当今数据驱动的世界中,数据可视化变得越来越重要。Light Chaser 是一款基于 React 技术栈的大屏数据可视化设计工具,通过简单的拖拽操作,你可以快速生成漂亮、美观的数据可视化大屏和看板。本文将介绍如何使用 Light Chaser 进行数据…...

Java中的异常概念

在Java编程中,异常(Exception)是一种特殊的情况,它在程序执行期间发生,会干扰程序正常的流程。 ## 一、异常的产生原因 1. **用户输入错误** - 例如,当一个程序期望用户输入一个整数,而用户…...

flutter_鸿蒙next_Dart基础②List

目录 代码示例 代码逐段解析 1. 创建和打印列表 2. 强类型列表 3. 创建可扩展的空列表 4. 创建填充列表 5. 列表扩展 6. 使用可选展开操作符 7. 获取列表长度 8. 列表反转 9. 添加多个元素 10. 移除元素 11. 根据索引移除元素 12. 在特定位置插入元素 13. 清空列…...

【2024保研经验帖】武汉大学测绘遥感国家重点实验室夏令营(计算机向)

前言 先说本人背景:末211,rk前5%,无科研,有几个竞赛(数模、机器人等) 武大的国重是我参加的第二个夏令营,武大国重这次有提前开几个分会场,一个在中南大学,一个在吉林大学,还有在兰…...

PyGWalker:让你的Pandas数据可视化更简单,快速创建数据可视化网站

1、PyGWalker应用: 在数据分析的过程中,数据的探索和可视化是至关重要的环节,如何高效地将分析结果展示给团队、客户,甚至是公众,是很多数据分析师和开发者面临的挑战,接下来介绍的两大工具组合——PyGWalker与Streamlit,可以帮助用户轻松解决这个问题,即使没有复杂的代…...

Ubuntu24.04远程开机

近来在几台机器上鼓捣linux桌面,顺便研究一下远程唤醒主机。 本篇介绍Ubuntu系统的远程唤醒,Windows系统的唤醒可搜索相关资料。 依赖 有远程唤醒功能的路由器(当前一般都带这个功能)有线连接主机(无线连接有兴趣朋友…...

网络编程(12)——完善粘包处理操作(id字段)

十二、day12 之前的粘包处理是基于消息头包含的消息体长度进行对应的切包操作,但并不完整。一般来说,消息头仅包含数据域的长度,但是如果要进行逻辑处理,就需要传递一个id字段表示要处理的消息id,当然可以不在包头传i…...

「3.3」虫洞 Wormholes

多组数据不清零——见祖宗 「3.3」虫洞 Wormholes 问题背景 「一本通3.3 练习2」 题目描述 John 在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John 的每…...

网页篡改防御方法

网页篡改防御方法 将服务器安全补丁升级到最新版 操作系统、应用程序、数据库等都需要使用最新的安全补丁,打补丁主要是为防止攻击者利用缓冲溢出和设计缺陷等进行攻击。 封闭未使用但已经开放的网络服务端口及未使用的服务 对于Windows Server 2003操作系统&am…...

Pikachu-Cross-Site Scripting-xss盲打

xss盲打,不是一种漏洞类型,而是一个攻击场景;在前端、或者在当前页面是看不到攻击结果;而是在后端、在别的页面才看到结果。 登陆后台,查看结果;...

JAVA思维提升案例5

抢红包案例: 要求: 一个大V直播时发起了抢红包活动,分别有:9、666、188、520、99999五个红包。 请模拟粉丝来抽奖,按照先来先得,随机抽取,抽完即止,注意:一个红包只能被…...

PostgreSQL的字符集

PostgreSQL的字符集 PostgreSQL 支持多种字符集(character sets),也称为编码(encoding)。字符集决定了数据库存储和处理文本数据的方式。在创建数据库时,可以指定数据库的字符集,或者使用默认的…...

CUDA 参考文章

CUDA:NVCC编译过程和兼容性详解_nvcc把cuda代码转换成什么-CSDN博客https://blog.csdn.net/fb_help/article/details/80462853 1、CUDA:NVCC编译过程和兼容性详解 CUDA:NVCC编译过程和兼容性详解 https://codeyarns.com/2014/03/03/how-to-sp…...

强缓存和协商缓存的区别

强缓存和协商缓存是Web开发中用于优化页面加载性能的两种主要缓存机制,它们之间存在显著的区别。以下是对这两种缓存机制的详细比较: 一、定义与工作原理 强缓存 定义:强缓存是指在浏览器发送请求前,先检查本地缓存中是否存在可用…...

工控系统组成与安全需求分析

目录 工控系统安全威胁与需求分析工业控制系统安全需求分析 工控系统安全威胁与需求分析 工业控制系统是由各种控制组件监测组件数据处理与展示组件共同构成的,对工业生产过程进行控制和监控的业务流程管控系统。 就是现在有很多工厂,它比如说要生产鞋…...

C(十三)for、while、do - while循环的抉择 --- 打怪闯关情景

前言: 继C(十)for循环 --- 黑神话情景之后👉 https://blog.csdn.net/2401_87025655/article/details/142684637 今天,杰哥想用一个打怪闯关的场景让与大家一起初步认识一下for、while、do - while循环的抉择。&#xf…...

C#上位机如何连接西门子S7-1500的Modbus服务器?从PLC配置到.NET代码实战

C#上位机连接西门子S7-1500 Modbus服务器全流程解析 在工业自动化领域,上位机与PLC的通信是实现数据采集和设备控制的关键环节。西门子S7-1500系列PLC作为当前主流控制器,其Modbus TCP服务器功能为C#开发者提供了标准化的通信接口。本文将深入探讨如何从…...

别再手动算潮流了!用MATLAB+Matpower搞定IEEE标准算例(附完整代码)

电力系统潮流计算实战:MATLABMatpower高效解决方案 在电力系统分析与设计中,潮流计算是最基础却至关重要的环节。传统的手工计算方式不仅耗时费力,而且难以应对复杂网络结构的分析需求。本文将带您探索如何利用MATLAB平台上的Matpower工具包&…...

告别卡顿!手把手教你用UltraISO给老旧笔记本装上OpenEuler 22.03 LTS(保姆级BIOS设置指南)

告别卡顿!手把手教你用UltraISO给老旧笔记本装上OpenEuler 22.03 LTS(保姆级BIOS设置指南) 老旧笔记本性能跟不上现代操作系统?别急着淘汰它们!OpenEuler作为一款轻量级Linux发行版,特别适合为老设备注入新…...

VSCode里Code Runner跑Python总报9009?别慌,检查一下你的setting.json文件

VSCode中Code Runner执行Python报错9009的终极排查指南 当你第一次在VSCode中用Code Runner插件运行Python脚本,满心期待看到输出结果时,终端却弹出"Process exited with code 9009"的红色错误提示——这种挫败感我深有体会。这个看似神秘的错…...

告别手动填表!用Python脚本5分钟搞定DSSAT模型批量模拟(附源码)

Python自动化DSSAT模型:从Excel到批量模拟的高效科研实践 在农业科研和气候情景分析中,DSSAT模型作为全球主流的作物生长模拟工具,其价值早已被广泛认可。但真正使用过它的研究者都深有体会:当面对数十种管理方案、上百个气象场景…...

UNet迁移实战:如何用Labelme标注自己的数据,并快速替换官方数据集进行训练

UNet迁移实战:从Labelme标注到自定义数据集训练全流程指南 当你在GitHub上成功运行了UNet的官方Demo后,下一步自然是想让这个强大的语义分割模型为你自己的项目服务——无论是分析医学影像中的病变区域,还是识别卫星图片中的特定地物。本文将…...

独立开发者一人全栈项目中的AI能力集成与运维简化思路

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者一人全栈项目中的AI能力集成与运维简化思路 对于独立开发者而言,一人承担全栈项目的设计、开发和运维是常态…...

百万至千万级参与者的人类暴露组计划,准备好了没

化学暴露组学是否已为人类暴露组计划做好准备? 本文梳理了暴露组学的学科发展历程,阐明化学暴露组是解析环境致病因素、补齐健康研究短板的核心要素;总结了以高分辨质谱为核心的化学暴露组学在检测、采样与数据分析上的技术突破;…...

RISC-V开发板测评实战:从申请到深度评测的完整指南

1. 项目概述:一次深度参与RISC-V生态的绝佳机会最近在电子发烧友论坛上看到了一个挺有意思的活动——“第二届RISC-V开发板测评大赛”,主办方是昊芯。对于咱们这些搞嵌入式、玩单片机、或者对开源硬件和RISC-V架构感兴趣的朋友来说,这绝对是一…...

避坑指南:DataSophon 1.0.0部署中那些官方文档没细说的步骤(防火墙、MySQL、Nginx配置)

DataSophon 1.0.0部署实战:防火墙策略、MySQL优化与Nginx反向代理的深度解析 当你第一次接触DataSophon这个新兴的大数据管理平台时,可能会被它"一小时部署300节点"的宣传所吸引。但真正开始部署时,很多工程师会发现官方文档对一些…...