由于之前对前端部署上线这一套不清楚,所以这次通过查找多方资料总结一下。使用Vue作先后端分离项目时,一般前端是单独部署,用户访问的也是前端项目地址,所以前端开发人员颇有必要熟悉一下项目部署的流程与各种问题的解决办法了。
Vue项目打包部署自己不复杂,不过一些前端可能对服务器接触很少,部署过程当中仍是会遇到这样那样的问题。下方主要描述的是使用nginx服务器代理前端项目的方法以及项目部署的相关问题,内容概览:

一、准备工作——服务器和nginx使用

1. 准备一台服务器

使用linux系统,如果没有服务器,可以尝试各大厂的云服务器免费试用套餐,比如华为云免费试用。

不过如果想时常练练手,我觉得可以购买一台云服务器,比如上面的华为云或者阿里云都还挺可靠。

2. nginx安装和启动

2.1下载nginx

nginx官网:http://nginx.org/ > stable version代表稳定版

2.2安装环境

(1)gcc环境

[root@MiWiFi-R3-srv ~]# yum -y install gcc-c++

(2) 第三方开放包Perl库

[root@MiWiFi-R3-srv ~]# yum -y install pcre pcre-devel

(3) zlib库

[root@MiWiFi-R3-srv ~]# yum -y install zlib zlib-devel

(4) openssl

[root@MiWiFi-R3-srv ~]# yum -y install openssl openssl-devel

以上所有安装命令合并成一条命令:

[root@MiWiFi-R3-srv ~]# yum -y install gcc-c++ && yum -y install pcre pcre-devel && yum -y install zlib zlib-devel && yum -y install openssl openssl-devel
2.3 安装nginx

(1)解压缩

[root@MiWiFi-R3-srv ~]# tar -zxvf nginx-1.8.0.tar.gz
[root@MiWiFi-R3-srv ~]# cd nginx-1.8.0

(2) 使用configure创建一个makeFile文件

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi

(3) 创建一个临时文件目录

[root@MiWiFi-R3-srv nginx-1.8.0]# mkdir /var/temp/nginx/client -p

(4) 编译安装nginx

[root@MiWiFi-R3-srv nginx-1.8.0]# make && make install
2.4启动nginx

(1) 进入sbin目录启动nginx

[root@MiWiFi-R3-srv nginx-1.8.0]# cd /usr/local/nginx/sbin/
[root@MiWiFi-R3-srv sbin]# ./nginx

(2) ps命令查看nginx启动进程

[root@MiWiFi-R3-srv sbin]# ps aux|grep nginx
root      13875  0.0  0.0  24840   768 ?        Ss   23:13   0:00 nginx: master process ./nginx
nobody    13876  0.0  0.1  25268  1480 ?        S    23:13   0:00 nginx: worker process
root      13881  0.0  0.0 112664   964 pts/0    R+   23:14   0:00 grep --color=auto nginx
[root@MiWiFi-R3-srv sbin]#

(3) nginx的常用操作命令
关闭nginx命令

./nginx -s stop

推荐使用:

./nginx -s quit

重启nginx命令(刷新配置文件)
命令流程: 先关闭 > 后启动 > 刷新配置文件

./nginx -s reload
2.5 访问nginx

默认端口:80
注意:是否关闭防火墙

(1) 打开80端口

[root@MiWiFi-R3-srv sbin]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
[root@MiWiFi-R3-srv sbin]# firewall-cmd --reload
success

(2)访问nginx

正常情况下仅需下面两个指令:

# 安装,安装完成后使用nginx -v检查,如果输出nginx的版本信息表明安装成功
sudo apt-get install nginx
# 启动
sudo service nginx start

启动后,正常情况下,直接访问 http://服务器ip 或 http://域名 (本文测试用的服务器没有配置域名,所以用ip,就本文而言,域名和ip没有太大区别)应该就能看到nginx服务器的默认页面了——如果访问不到,有可能是你的云服务器默认的http服务端口(80端口)没有对外开放,在服务器安全组配置一下即可。

3.了解nginx: 修改nginx配置,让nginx服务器代理我们创建的文件

查看nginx的配置,linux系统下的配置文件通常会存放在/etc目录下,nginx的配置文件就在/etc/nginx文件夹,打开文件/etc/nginx/sites-available/default(nginx可以有多个配置文件,通常我们配置nginx也是修改这个文件):

可以看到默认情况下,nginx代理的根目录是/var/www/html,输入 http://服务器ip会访问这个文件夹下的文件,会根据index的配置值来找默认访问的文件,比如index.html、index.htm之类。

我们可以更改root的值来修改nginx服务代理的文件夹:

3.1 创建文件夹/www,并创建index.html,写入"Hello world"字符串
mkdir /www
echo 'Hello world' > /www/index.html
3.2 修改root值为 /www

3.3 sudo nginx -t 检查nginx配置是否正确

3.4 加载nginx配置:sudo nginx -s reload

再次访问页面,发现页面内容已经变成了我们创建的index.html:

二、Vue项目打包同步文件到远程服务器

1、 打包

默认情况下,使用vue-cli创建的项目,package.json里的script应该已经配置了build指令,直接执行yarn build 或者 npm run build即可。

2、 同步到远程服务器

我们使用nginx部署Vue项目,实质上就是将Vue项目打包后的内容同步到nginx指向的文件夹。之前的步骤已经介绍了怎样配置nginx指向我们创建的文件夹,剩下的问题就是怎么把打包好的文件同步到服务器上指定的文件夹里,比如同步到之前步骤中创建的/www。

同步文件可以在git-bash或者powershell使用scp指令,如果是linux环境开发,还可以使用rsync指令:

scp -r dist/* root@117.78.4.26:/www
或
rsync -avr --delete-after dist/* root@117.78.4.26:/www

注意这里以及后续步骤是root使用用户远程同步,应该根据你的具体情况替换root和ip(ip换为你自己的服务器IP)。

为了方便,可以在package.json脚本中加一个push命令,以使用yarn为例(如果你使用npm,则push命令中yarn改成npm run即可):

"scripts": {"build": "vue-cli-service build","push": "yarn build && scp -r dist/* root@117.78.4.26:/www"},

这样就可以直接执行yarn push 或者npm run push直接发布了。不过还有一个小问题,就是命令执行的时候要求输入远程服务器的root密码(这里使用root来连接远程的,你可以用别的用户,毕竟root用户权限太高了)。

为了避免每次执行都要输入root密码,我们可以将本机的ssh同步到远程服务器的authorized_keys文件中。

3、 同步ssh key

3.1生成ssh key:使用git bash或者powershell执行ssh-keygen可以生成ssh key。会询问生成的key存放地址,直接回车就行,如果已经存在,则会询问是否覆盖:

3.2同步ssh key到远程服务器,使用ssh-copy-id指令同步

ssh-copy-id -i ~/.ssh/id_rsa.pub root@117.78.4.26


输入密码后,之后再次同步就不需要输入密码了。其实ssh_key是同步到了服务器(此处是root用户家目录)~/.ssh/authorized_keys文件里:

当然你也可以手动复制本地/.ssh/id_rsa.pub(注意是pub结尾的公钥)文件内容追加到服务器/.ssh/authorized_keys的后面(从命名可以看出该文件可以存储多个ssh key)

注意:这里全程使用的是root用户,所以没有文件操作权限问题。如果你的文件夹创建用户不是远程登录用户,或许会存在同步文件失败的问题,此时需要远程服务器修改文件夹的读写权限(命令 chmod)。

打包、文件上传一句指令搞定啦:

访问一下,果然看到了我们熟悉的界面:

至此,常规情况下发布Vue项目就介绍完了,接下来介绍非域名根路径下发布以及history路由模式发布方法。

三、非域名根路径发布

有时候同一台服务器同一端口下可能会根据目录划分出多个不同的项目,比如我们希望项目部署到http://a.com/test下,这样访问http://a.com/test访问到的是项目的首页,而非test前缀的地址会访问到其它项目。此时需要修改nginx配置以及Vue打包配置。

3.1 nginx配置

只需要添加一条location规则,分配访问路径和指定访问文件夹。我们可以把/test指向之前创建的/www文件夹,这里因为文件夹名称和访问路径不一致,需要用到alias这个配置:

如果文件夹名称与访问路径一致都为test,那这里可以用root来配置:

这里要将/test配置放到/之前,意味着在路由进入的时候,会优先匹配/test。如果根路径/下的项目有子路由/test,那http://xxxx/test只会访问到/www里的项目,而不会访问该子路由。

3.2 项目配置

为了解决打包后资源路径不对的问题,需要在vue.config.js中配置publicPath,这里有两种配置方式,分别将publicPath配置为./和/test:

更新nginx配置,发布后即可正常访问啦。这里的两种配置方式是有区别的,接下来会看一下它们的区别。
如果不进行项目配置,直接发布访问会出现JS、CSS等资源找不到导致页面空白的问题:

该问题原因是资源引用路径不对,页面审查元素可以看到,页面引用的js都是从根路径下引用的:

查看打包后的文件结构,可以看到js/css/img/static等资源文件是与index.html处于同级别的:

对于两种配置方式,看看都是怎么生效的:

(1)publicPath配置为./, 打包后资源引用路径为相对路径:

(2)publicPath配置为/test,打包后资源相对路径为从域名根目录开始的绝对路径:

两种配置都可以正确地找到JS、CSS等资源。不过还有个问题,那就是static中的静态资源依旧会找不到。

3.3 绝对路径引用的静态资源找不到的问题

因为在打包过程中,public下的静态资源都不会被webpack处理,我们需要通过绝对路径来引用它们。当项目部署到非域名根路径上时,这点非常头疼,你需要在每个引用的URL前面加上process.env.BASE_URL(该值即对应上文配置的publicPath),以使得资源能被正常访问到。我们可以在main.js把这个变量值绑定到Vue.prototype,这样每个Vue组件都可以使用它:

Vue.prototype.$pb = process.env.BASE_URL

在模板中使用:

<img :src="`${$pb}static/logo.png`">

然而,更加头疼并且没有良好解决方案的问题是在组件style部分使用public文件夹下的静态资源:

  • 如果需要使用图片等作为背景图片等,尽量使用内联方式使用吧,像在模板中使用一样。
  • 如果需要引入样式文件,则在index.html中使用插值方式引入吧。

关于静态资源的问题,vue-cli的推荐是尽量将资源作为你的模块依赖图的一部分导入(即放到assets中,使用相对路径引用),避免该问题的同时也带来其它好处:

四、history模式部署

默认情况下,Vue项目使用的是hash路由模式,就是URL中会包含一个#号的这种形式。#号以及之后的内容是路由地址的hash部分。

正常情况下,当浏览器地址栏地址改变,浏览器会重新加载页面,而如果是hash部分修改的话,则不会,这就是前端路由的原理,允许根据不同的路由页面局部更新而不刷新整个页面。

H5新增了history的pushState接口,也允许前端操作改变路由地址但是不触发页面刷新,history模式即利用这一接口来实现。因此使用history模式可以去掉路由中的#号。

4.1 项目配置

在vue-router路由选项中配置mode选项和base选项,mode配置为’history’;如果部署到非域名根目录,还需要配置base选项为前文配置的publicPath值(注意:此情况下,publicPath必须使用绝对路径/test的配置形式,而不能用相对路径./)

4.2 nginx配置

对于history模式,假设项目部署到域名下的/test目录,访问http://xxx/test/about的时候,服务器会去找/test指向的目录下的about子目录或文件,很显然因为是单页面应用,并不会存在a这个目录或者文件,就会导致404错误:

我们要配置nginx让这种情况下,服务器能够返回单页应用的index.html,然后剩下的路由解析的事情就交给前端来完成即可。

这句配置的意思就是,拿到一个地址,先根据地址尝试找对应文件,找不到再试探地址对应的文件夹,再找不到就返回/test/index.html。再次打开刚才的about地址,刷新页面也不会404啦:

4.3 history模式部署到非域名根路径下

非域名根目录下部署,首先肯定要配置publicPath。需要注意的点前面其实已经提过了,就是这种情况下不能使用相对路径./或者空串配置publicPath。

为什么呢?
原因是它会导致router-link等的表现错乱,使用测试项目分别使用两种配置打包发布,审查元素就能看出区别。在页面上有两个router-link,Home和About:

两种配置打包后的结果如下。
(1)publicPath配置为./或者空串:

(2)publicPath配置为/test:

Vue项目打包部署总结相关推荐

  1. vue项目打包部署-----解决打包后访问资源失败问题

    vue项目打包部署-----解决打包后访问资源失败问题 参考文章: (1)vue项目打包部署-----解决打包后访问资源失败问题 (2)https://www.cnblogs.com/ycsc/p/1 ...

  2. Vue 项目打包部署实战完整流程总结!

    使用Vue做前后端分离项目时,通常前端是单独部署,用户访问的也是前端项目地址,因此前端开发人员很有必要熟悉一下项目部署的流程与各类问题的解决办法了. Vue项目打包部署本身不复杂,不过一些前端同学可能 ...

  3. vue项目打包部署流程

    vue项目打包部署流程 一.打包 二.部署 三.部署多个项目 一.打包 (可选)去除打包后会生成的map文件:在vue.config.js中添加productionSourceMap: false, ...

  4. vue项目打包部署到服务器,Vue项目打包部署到apache服务器的方法步骤

    vue项目在开发环境下,让项目运行起来,是通过npm run dev命令,原理是在本地搭建了一个express服务器. 但是在服务器上就不是这样的,必须要通npm run build命令来对整个项目进 ...

  5. vue项目打包部署nginx跨域

    vue项目打包部署nginx跨域 vue项目连接外部api接口时,打包部署到nginx后出现api404,api跨域问题,这个时候需要给vue项目本身进行跨域,再配置nginx中进行跨域即可解决,详见 ...

  6. Vue项目打包部署到Nginx服务器步骤总结

    前期准备工作: 1. 准备一台服务器: 2. 根据服务器的系统环境安装配置Nginx; 3. 了解Nginx的配置文件,了解常用的linux系统操作命令 4. 进行Vue项目的打包部署 因为我只是单纯 ...

  7. vue项目打包部署linux_Vue项目打包部署到Nginx服务器

    "随着前后端分离项目的流行,vue项目开发部署也成为了前端人员必备技能:本文将带你学习vue项目部署及遇到的各种坑." 关于vue项目部署不得不提的是配置文件vue.config. ...

  8. 【转】vue项目打包部署——nginx代理访问

    我又来了,今天部署了下vue项目,使用nginx做了代理,这样可以解决跨域的问题,这里做一个简单讲解. 1.先看vue项目打包(我这里使用的是vscode开发工具) 这里是我的项目结构: 打包之前需要 ...

  9. vue项目打包部署注意点 + 宝塔面板几步部署项目

    1.vue项目打包 1.1 终端运行打包命令 在编辑器的终端运行vue项目打包命令 yarn run build 打包成功如下: 这时我们可以看到项目目录多出来一个dist文件夹,记住它,后面部署就靠 ...

最新文章

  1. html+css复习之第2篇 | javascript
  2. 如何挂载阿里云Linux服务器的“数据盘”(新购买)
  3. 构建高可用服务器之 Keepalive参数详解
  4. PDFMate PDF Converter Pro
  5. 变压器符号_行输出变压器的结构、符号及电路分析
  6. FreeRTOS学习笔记——互斥型信号量
  7. 分页查询千万级数据慢
  8. OpenCV中基本数据结构(4)_Rect
  9. LeetCode刷题(24)
  10. Mac 被曝存在恶意漏洞:黑客可随意调动摄像头,波及四百万用户!
  11. Silverlight C# 游戏开发:Flyer10完成寻找工作
  12. 使用Spring Boot CLI的Spring Boot Initilizr
  13. Android Button 实现透明 + 圆角按钮效果
  14. 前端基础项目(一)学成在线网站静态网页,HTML+CSS,简单基础,附完整源码
  15. SoapUI接口测试——全流程转载
  16. 06)JDK1.8 新特性学习 重复注解
  17. php-screw 安装,php_screw安装,使用
  18. 《 warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失》
  19. Exif的Orientation信息说明
  20. TTL expired in transit (TTL 传输中过期) ping一个ip却返回另一个ip

热门文章

  1. 计算机网络技能鉴定三级,计算机网络管理员(三级)技能鉴定试题A
  2. Segment Anything Model (SAM) 部分报告汇总
  3. SQL Server学习笔记3——WHERE子句
  4. 77页智慧城市顶层设计方案
  5. 微信小程序之实现常用日期格式-日历格式(二)
  6. CocoaPods could not find compatible versions for pod “JCore“
  7. ipad 共享 计算机,ipad与电脑怎么共享视频
  8. 低功耗芯片间串行媒体总线SLIMbus
  9. Linux查看占用内存最高的进程
  10. 中兴软件编程规范C/C++