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

news/2024/10/3 18:14:13 标签: 前端, 部署

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盘下的dist
  index  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


http://www.niftyadmin.cn/n/5688790.html

相关文章

SpringBoot介绍及整合Mybatis Plus

目录 SpringBoot背景及特点 SpringBoot整合Mybatis Plus SpringBoot背景及特点 SpringBoot的设计目是抛弃之前Spring、SpringMVC繁杂的配置过程,简化开发过程。之前的Spring框架需要大量的手动配置,包括XML配置文件或Java配置类,配置过程繁…

数值分析作业(第二章):代码+手写计算

《数值计算方法》丁丽娟-数值实验作业-第二章(MATLAB) 作业P58: 1 ,2,3,6,8(1), 12, 13 数值实验P61: 2, 3 数值实验(第二章) 代码仓库:https://github.com/sylvanding/b…

使用 Vue3 和 Axios 实现 CRUD 操作

文章目录 1、准备工作2、创建 Vue 3 项目3、项目结构4、实现 CRUD 操作5、运行项目6、小结在当今的前端开发中,Vue.js 作为一款流行的 JavaScript 框架,正在被越来越多的开发者所青睐。尤其是 Vue 3 引入了 Composition API 和更优雅的响应式处理,使得模板编写和状态管理变得…

Python、C++、java阶乘算法

最近,我除了Python还学了C和Java,然后在网上看到编程考题:阶乘。 首先,我们先理解什么是阶乘。 阶乘是数学中的一个概念,通常定义为从1乘到指定的数。具体来说,一个正整数的阶乘(记作n!&#…

RAC被修改权限及相关问题

RDBMS : 19.19 修改RAC权限及相关问题 修改RAC权限,参考文档: How to check and fix file permissions on Grid Infrastructure environment (Doc ID 1931142.1) Script to capture and restore file permission in a directory (for eg. O…

接口 抽象类

接口和抽象类都是用来实现面向对象编程中的抽象概念的工具。 接口是一种抽象的数据类型,它定义了一组抽象方法。接口中的方法没有具体的实现,只有方法的声明。类可以实现一个或多个接口,并实现接口中的方法。接口提供了一种规范,…

uniapp实战教程:如何封装一个可复用的表单组件

在uniapp开发过程中,表单组件的使用场景非常广泛。为了提高开发效率,我们可以将常用的表单组件进行封装。本文将带你了解如何在uniapp中封装一个表单组件,让你只需要通过属性配置轻松实现各种表单,效果图如下: 一、准备…

JavaScript break与continue语句

break语句和continue语句都具有跳转作用&#xff0c;可以让代码不按既有的顺序执行。 break break语句用于跳出代码块或循环 for(i0;i<100;i){if(i5){break;}console.log(i);} continue continue语句用于应即终止本轮循环,返回循环结构的头部&#xff0c;开始下一轮循环。…