自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Vue 項(xiàng)目打包部署總結(jié)

開發(fā) 前端
使用Vue做前后端分離項(xiàng)目時(shí),通常前端是單獨(dú)部署,用戶訪問的也是前端項(xiàng)目地址,因此前端開發(fā)人員很有必要熟悉一下項(xiàng)目部署的流程與各類問題的解決辦法了。

 使用Vue做前后端分離項(xiàng)目時(shí),通常前端是單獨(dú)部署,用戶訪問的也是前端項(xiàng)目地址,因此前端開發(fā)人員很有必要熟悉一下項(xiàng)目部署的流程與各類問題的解決辦法了。

Vue項(xiàng)目打包部署本身不復(fù)雜,不過一些前端同學(xué)可能對(duì)服務(wù)器接觸不多,部署過程中還是會(huì)遇到這樣那樣的問題。本文介紹一下使用nginx服務(wù)器代理前端項(xiàng)目的方法以及項(xiàng)目部署的相關(guān)問題,內(nèi)容概覽:

一、準(zhǔn)備工作——服務(wù)器和nginx使用

1. 準(zhǔn)備一臺(tái)服務(wù)器

我的是ubuntu系統(tǒng),linux系統(tǒng)的操作都差不多。沒有服務(wù)器怎么破?

如果你只是想體驗(yàn)一下,可以嘗試各大廠的云服務(wù)器免費(fèi)試用套餐,比如華為云免費(fèi)試用,本文相關(guān)操作即是在華為云上完成的。

不過如果想時(shí)常練練手,我覺得可以購(gòu)買一臺(tái)云服務(wù)器,比如上面的華為云或者阿里云都還挺可靠。

2. nginx安裝和啟動(dòng)

輕裝簡(jiǎn)行,這部分不作過多贅述(畢竟網(wǎng)上相關(guān)教程一大堆),正常情況下僅需下面兩個(gè)指令: 

  1. # 安裝,安裝完成后使用nginx -v檢查,如果輸出nginx的版本信息表明安裝成功  
  2. sudo apt-get install nginx  
  3. # 啟動(dòng)  
  4. sudo service nginx start 

啟動(dòng)后,正常情況下,直接訪問 http://服務(wù)器ip 或 http://域名 (本文測(cè)試用的服務(wù)器沒有配置域名,所以用ip,就本文而言,域名和ip沒有太大區(qū)別)應(yīng)該就能看到nginx服務(wù)器的默認(rèn)頁(yè)面了——如果訪問不到,有可能是你的云服務(wù)器默認(rèn)的http服務(wù)端口(80端口)沒有對(duì)外開放,在服務(wù)器安全組配置一下即可。

3、 了解nginx: 修改nginx配置,讓nginx服務(wù)器代理我們創(chuàng)建的文件

查看nginx的配置,linux系統(tǒng)下的配置文件通常會(huì)存放在/etc目錄下,nginx的配置文件就在/etc/nginx文件夾,打開文件/etc/nginx/sites-available/default(nginx可以有多個(gè)配置文件,通常我們配置nginx也是修改這個(gè)文件):

可以看到默認(rèn)情況下,nginx代理的根目錄是/var/www/html,輸入 http://服務(wù)器ip會(huì)訪問這個(gè)文件夾下的文件,會(huì)根據(jù)index的配置值來找默認(rèn)訪問的文件,比如index.html、index.htm之類。

我們可以更改root的值來修改nginx服務(wù)代理的文件夾:

1)、創(chuàng)建文件夾/www,并創(chuàng)建index.html,寫入"Hello world"字符串 

  1. mkdir /www  
  2. echo 'Hello world' > /www/index.html 

2)、修改root值為 /www

3)、sudo nginx -t 檢查nginx配置是否正確

4)、加載nginx配置:sudo nginx -s reload

再次訪問頁(yè)面,發(fā)現(xiàn)頁(yè)面內(nèi)容已經(jīng)變成了我們創(chuàng)建的index.html:

二、Vue項(xiàng)目打包同步文件到遠(yuǎn)程服務(wù)器

1、 打包

默認(rèn)情況下,使用vue-cli創(chuàng)建的項(xiàng)目,package.json里的script應(yīng)該已經(jīng)配置了build指令,直接執(zhí)行yarn build 或者 npm run build即可。

2、 同步到遠(yuǎn)程服務(wù)器

我們使用nginx部署Vue項(xiàng)目,實(shí)質(zhì)上就是將Vue項(xiàng)目打包后的內(nèi)容同步到nginx指向的文件夾。之前的步驟已經(jīng)介紹了怎樣配置nginx指向我們創(chuàng)建的文件夾,剩下的問題就是怎么把打包好的文件同步到服務(wù)器上指定的文件夾里,比如同步到之前步驟中創(chuàng)建的/www。

同步文件可以在git-bash或者powershell使用scp指令,如果是linux環(huán)境開發(fā),還可以使用rsync指令: 

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

注意這里以及后續(xù)步驟是root使用用戶遠(yuǎn)程同步,應(yīng)該根據(jù)你的具體情況替換root和ip(ip換為你自己的服務(wù)器IP)。

為了方便,可以在package.json腳本中加一個(gè)push命令,以使用yarn為例(如果你使用npm,則push命令中yarn改成npm  run即可): 

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

這樣就可以直接執(zhí)行yarn push 或者npm run push直接發(fā)布了。不過還有一個(gè)小問題,就是命令執(zhí)行的時(shí)候要求輸入遠(yuǎn)程服務(wù)器的root密碼(這里使用root來連接遠(yuǎn)程的,你可以用別的用戶,畢竟root用戶權(quán)限太高了)。

為了避免每次執(zhí)行都要輸入root密碼,我們可以將本機(jī)的ssh同步到遠(yuǎn)程服務(wù)器的authorized_keys文件中。

3、 同步ssh key

    a. 生成ssh key:使用git bash或者powershell執(zhí)行ssh-keygen可以生成ssh key。會(huì)詢問生成的key存放地址,直接回車就行,如果已經(jīng)存在,則會(huì)詢問是否覆蓋:    

    b. 同步ssh key到遠(yuǎn)程服務(wù)器,使用ssh-copy-id指令同步 

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

輸入密碼后,之后再次同步就不需要輸入密碼了。其實(shí)ssh_key是同步到了服務(wù)器(此處是root用戶家目錄)~/.ssh/authorized_keys文件里:

當(dāng)然你也可以手動(dòng)復(fù)制本地~/.ssh/id_rsa.pub(注意是pub結(jié)尾的公鑰)文件內(nèi)容追加到服務(wù)器~/.ssh/authorized_keys的后面(從命名可以看出該文件可以存儲(chǔ)多個(gè)ssh key)

注意:這里全程使用的是root用戶,所以沒有文件操作權(quán)限問題。如果你的文件夾創(chuàng)建用戶不是遠(yuǎn)程登錄用戶,或許會(huì)存在同步文件失敗的問題,此時(shí)需要遠(yuǎn)程服務(wù)器修改文件夾的讀寫權(quán)限(命令 chmod)。

創(chuàng)建了一個(gè)測(cè)試項(xiàng)目(點(diǎn)擊本鏈接可以在gihub查看)試一下,打包、文件上傳一句指令搞定啦:

訪問一下,果然看到了我們熟悉的界面:

至此,常規(guī)情況下發(fā)布Vue項(xiàng)目就介紹完了,接下來介紹非域名根路徑下發(fā)布以及history路由模式發(fā)布方法。

三、非域名根路徑發(fā)布

有時(shí)候同一臺(tái)服務(wù)器同一端口下可能會(huì)根據(jù)目錄劃分出多個(gè)不同的項(xiàng)目,比如我們希望項(xiàng)目部署到http://a.com/test下,這樣訪問http://a.com/test訪問到的是項(xiàng)目的首頁(yè),而非test前綴的地址會(huì)訪問到其它項(xiàng)目。此時(shí)需要修改nginx配置以及Vue打包配置。

1、 nginx配置

只需要添加一條location規(guī)則,分配訪問路徑和指定訪問文件夾。我們可以把/test指向之前創(chuàng)建的/www文件夾,這里因?yàn)槲募A名稱和訪問路徑不一致,需要用到alias這個(gè)配置:

如果文件夾名稱與訪問路徑一致都為test,那這里可以用root來配置:

這里要將/test配置放到/之前,意味著在路由進(jìn)入的時(shí)候,會(huì)優(yōu)先匹配/test。如果根路徑/下的項(xiàng)目有子路由/test,那http://xxxx/test只會(huì)訪問到/www里的項(xiàng)目,而不會(huì)訪問該子路由。

2、項(xiàng)目配置

為了解決打包后資源路徑不對(duì)的問題,需要在vue.config.js中配置publicPath,這里有兩種配置方式,分別將publicPath配置為./和/test:

更新nginx配置,發(fā)布后即可正常訪問啦。這里的兩種配置方式是有區(qū)別的,接下來會(huì)看一下它們的區(qū)別。

如果不進(jìn)行項(xiàng)目配置,直接發(fā)布訪問會(huì)出現(xiàn)JS、CSS等資源找不到導(dǎo)致頁(yè)面空白的問題:

該問題原因是資源引用路徑不對(duì),頁(yè)面審查元素可以看到,頁(yè)面引用的js都是從根路徑下引用的:

查看打包后的文件結(jié)構(gòu),可以看到j(luò)s/css/img/static等資源文件是與index.html處于同級(jí)別的:

對(duì)于兩種配置方式,看看都是怎么生效的:

    a. publicPath配置為./, 打包后資源引用路徑為相對(duì)路徑:

 

     b. publicPath配置為/test,打包后資源相對(duì)路徑為從域名根目錄開始的絕對(duì)路徑:

兩種配置都可以正確地找到JS、CSS等資源。不過還有個(gè)問題,那就是static中的靜態(tài)資源依舊會(huì)找不到。

3、絕對(duì)路徑引用的靜態(tài)資源找不到的問題

因?yàn)樵诖虬^程中,public下的靜態(tài)資源都不會(huì)被webpack處理,我們需要通過絕對(duì)路徑來引用它們。當(dāng)項(xiàng)目部署到非域名根路徑上時(shí),這點(diǎn)非常頭疼,你需要在每個(gè)引用的URL前面加上process.env.BASE_URL(該值即對(duì)應(yīng)上文配置的publicPath),以使得資源能被正常訪問到。我們可以在main.js把這個(gè)變量值綁定到Vue.prototype,這樣每個(gè)Vue組件都可以使用它: 

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

在模板中使用: 

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

然而,更加頭疼并且沒有良好解決方案的問題是在組件style部分使用public文件夾下的靜態(tài)資源:

  •  如果需要使用圖片等作為背景圖片等,盡量使用內(nèi)聯(lián)方式使用吧,像在模板中使用一樣。
  •  如果需要引入樣式文件,則在index.html中使用插值方式引入吧。

關(guān)于靜態(tài)資源的問題,vue-cli的推薦是盡量將資源作為你的模塊依賴圖的一部分導(dǎo)入(即放到assets中,使用相對(duì)路徑引用),避免該問題的同時(shí)也帶來其它好處:

四、history模式部署

默認(rèn)情況下,Vue項(xiàng)目使用的是hash路由模式,就是URL中會(huì)包含一個(gè)#號(hào)的這種形式。#號(hào)以及之后的內(nèi)容是路由地址的hash部分。

正常情況下,當(dāng)瀏覽器地址欄地址改變,瀏覽器會(huì)重新加載頁(yè)面,而如果是hash部分修改的話,則不會(huì),這就是前端路由的原理,允許根據(jù)不同的路由頁(yè)面局部更新而不刷新整個(gè)頁(yè)面。

H5新增了history的pushState接口,也允許前端操作改變路由地址但是不觸發(fā)頁(yè)面刷新,history模式即利用這一接口來實(shí)現(xiàn)。因此使用history模式可以去掉路由中的#號(hào)。

1、項(xiàng)目配置

在vue-router路由選項(xiàng)中配置mode選項(xiàng)和base選項(xiàng),mode配置為'history';如果部署到非域名根目錄,還需要配置base選項(xiàng)為前文配置的publicPath值(注意:此情況下,publicPath必須使用絕對(duì)路徑/test的配置形式,而不能用相對(duì)路徑./)

2、 nginx配置

對(duì)于history模式,假設(shè)項(xiàng)目部署到域名下的/test目錄,訪問http://xxx/test/about的時(shí)候,服務(wù)器會(huì)去找/test指向的目錄下的about子目錄或文件,很顯然因?yàn)槭菃雾?yè)面應(yīng)用,并不會(huì)存在a這個(gè)目錄或者文件,就會(huì)導(dǎo)致404錯(cuò)誤:

我們要配置nginx讓這種情況下,服務(wù)器能夠返回單頁(yè)應(yīng)用的index.html,然后剩下的路由解析的事情就交給前端來完成即可。

這句配置的意思就是,拿到一個(gè)地址,先根據(jù)地址嘗試找對(duì)應(yīng)文件,找不到再試探地址對(duì)應(yīng)的文件夾,再找不到就返回/test/index.html。再次打開剛才的about地址,刷新頁(yè)面也不會(huì)404啦:

3、history模式部署到非域名根路徑下

非域名根目錄下部署,首先肯定要配置publicPath。需要注意的點(diǎn)前面其實(shí)已經(jīng)提過了,就是這種情況下不能使用相對(duì)路徑./或者空串配置publicPath。

為什么呢?

原因是它會(huì)導(dǎo)致router-link等的表現(xiàn)錯(cuò)亂,使用測(cè)試項(xiàng)目分別使用兩種配置打包發(fā)布,審查元素就能看出區(qū)別。在頁(yè)面上有兩個(gè)router-link,Home和About:

兩種配置打包后的結(jié)果如下。

    a. publicPath配置為./或者空串:    

     b. publicPath配置為/test:

publicPath配置為相對(duì)路徑的router-link打包后地址變成了相對(duì)根域名下地址,很明顯是錯(cuò)誤的,所以非域名根路徑部署應(yīng)該將publicPath配置為完整的前綴路徑。

五、結(jié)語(yǔ)

關(guān)于Vue項(xiàng)目發(fā)布的相關(guān)問題就先總結(jié)這么多,幾乎在每一步都踩過坑才有所體會(huì),有問題歡迎各位同學(xué)一起探討。 

 

責(zé)任編輯:龐桂玉 來源: 前端大全
相關(guān)推薦

2024-11-01 08:10:00

Vue開發(fā)

2023-09-14 20:55:52

NodeJSDocker

2020-12-18 09:15:16

LinuxVue命令

2023-09-12 07:06:04

2024-01-16 08:26:25

Vue項(xiàng)目服務(wù)器

2024-02-19 16:25:29

前端Vue.jsJavaScript

2021-09-01 11:10:55

Spring BootShellJava

2013-12-11 22:08:22

2025-02-07 08:39:32

Shell部署測(cè)試

2022-02-20 19:02:16

RollupVue 2JavaScrip

2021-08-04 08:27:00

VueReact自動(dòng)化部署

2009-08-11 17:39:59

.NET打包項(xiàng)目

2012-08-15 09:22:49

JavaScript

2013-01-21 10:19:50

JavaScript項(xiàng)目管理JS

2024-02-20 08:51:56

PythonFlask工具

2022-09-07 08:00:00

機(jī)器學(xué)習(xí)MLFlow工具

2021-05-26 10:40:28

Vue3TypeScript前端

2015-06-11 16:36:27

ASP.NET

2012-07-11 23:32:33

MVC3項(xiàng)目

2012-07-04 10:47:56

軟件項(xiàng)目項(xiàng)目管理項(xiàng)目流程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)