摘要:所以單頁應(yīng)用的部署,需要將所有的頁面請(qǐng)求都返回,瀏覽器下載了后會(huì)自動(dòng)解析并導(dǎo)航到對(duì)應(yīng)頁面??偨Y(jié)單頁應(yīng)用與以前的常規(guī)多頁面應(yīng)用還是有區(qū)別的,開發(fā)過程與后端解耦了,同時(shí)會(huì)出現(xiàn)跨域鑒權(quán)以及應(yīng)用部署的問題。
本文同步發(fā)布于我的個(gè)人博客上 - 單頁應(yīng)用的部署方案
本文主要簡(jiǎn)單講一下單頁應(yīng)用的開發(fā)及部署方法,默認(rèn)你懂一些服務(wù)端知識(shí)及nginx知識(shí),如果有任何可以在下方評(píng)論留言。單頁應(yīng)用
SPA(單頁應(yīng)用)可以說是這幾年前端領(lǐng)域的一個(gè)技能棧了。
單頁應(yīng)用不同與傳統(tǒng)的多頁面應(yīng)用,顧名思義,單頁應(yīng)用整個(gè)應(yīng)用架構(gòu)中只有一個(gè)實(shí)際頁面運(yùn)行,再借助于H5的History API或hash路由來實(shí)現(xiàn)前端路由,從而實(shí)現(xiàn)了前后端的解耦,或者前后端分離。不同于以前,前端頁面都是放在后端項(xiàng)目的模板目錄下的,由服務(wù)端來渲染模板,并且由后端路由來決定一個(gè)請(qǐng)求應(yīng)該渲染哪個(gè)模板,可以說前端對(duì)后端的依賴是非常大的。
單頁應(yīng)用實(shí)現(xiàn)了前后端分離,頁面的渲染與路由跳轉(zhuǎn)都由前端同學(xué)自行控制,后端只提供API接口。這種模式下看似前端同學(xué)實(shí)現(xiàn)了一個(gè)大獨(dú)立,但是很多同學(xué)面對(duì)這種開發(fā)模式完全不知道如何搭建開發(fā)環(huán)境以及線上部署。
開發(fā)環(huán)境開發(fā)環(huán)境的搭建一般來說比較簡(jiǎn)單,常見的單頁應(yīng)用框架都提供了腳手架,比如vue的vue-cli,只需要安裝后,一個(gè)vue create project就可以初始化一個(gè)項(xiàng)目,然后就可以開發(fā)了。
這里主要關(guān)注,與后端的調(diào)用關(guān)系。一般來說,項(xiàng)目里面直接去調(diào)用后端接口就可以了,但是單頁應(yīng)用由于是前后端分離的,所以前后端的域名一般來說都不一樣,這樣就會(huì)出現(xiàn)一個(gè)跨域問題。
使用CORS可以很好的解決這個(gè)問題,但是這個(gè)是需要后端同學(xué)配合的,前端同學(xué)沒辦法干預(yù)。而且有些后端同學(xué)可能根本不了解CORS,這時(shí)候你就需要去跟后端同學(xué)扯皮,讓他給你支持跨域問題,碰到不好合作的同學(xué)真的很浪費(fèi)時(shí)間。別笑,我還真遇到過這種問題,后端同學(xué)完全不知道CORS,學(xué)習(xí)半天,好不容易能支持了,又寫的亂七八糟的,后面改域名跟帶cookie時(shí),又搞了好幾天,真的浪費(fèi)時(shí)間。
這里咱們可以使用vue-cli的轉(zhuǎn)發(fā)功能來解決開發(fā)時(shí)的跨域問題:
// vue.config.js module.exports = { devServer: { proxy: { "/api": { target: "http://127.0.0.1:7002", changeOrigin: true }, } } }
這樣,前端發(fā)請(qǐng)求/api/user/detail這樣的請(qǐng)求就會(huì)轉(zhuǎn)發(fā)到后端的http://localhost:7002/api/user/detail了。由于前端不是直接請(qǐng)求后端接口,所以也就不會(huì)跨域了。
可以看到前端發(fā)出的請(qǐng)求會(huì)自動(dòng)轉(zhuǎn)發(fā)到后端,并且不會(huì)觸發(fā)跨域。
線上部署開發(fā)完成后面臨一個(gè)部署問題,一般來說部署的工作是輪不到前端來做的,一般會(huì)交給運(yùn)維或者后端同學(xué)。但是咱們前端同學(xué)也要自強(qiáng)不息啊,開個(gè)玩笑,實(shí)際上很多情況下,小公司的運(yùn)維同學(xué)可能自己都不知道怎么部署單頁應(yīng)用,有些時(shí)候還是要自己上。
跟開發(fā)的時(shí)候一個(gè)思路,也可以將后端請(qǐng)求做一個(gè)轉(zhuǎn)發(fā),這個(gè)時(shí)候就沒辦法通過devServer.proxy來轉(zhuǎn)發(fā)了。咱們可以通過NGINX來做一下轉(zhuǎn)發(fā)。
先看看單頁應(yīng)用的部署,單頁應(yīng)用開發(fā)完只有一個(gè)index.html,頁面的渲染及其他頁面都通過js來生成和控制。同時(shí)瀏覽器刷新頁面的時(shí)候,是會(huì)發(fā)請(qǐng)求到服務(wù)器的,所以如果按照常規(guī)方式來部署,就會(huì)出現(xiàn)在/user/detail這樣的頁面刷新的時(shí)候,會(huì)出現(xiàn)404錯(cuò)誤,因?yàn)闉g覽器將頁面發(fā)到服務(wù)器,卻發(fā)現(xiàn)服務(wù)器上根本沒有這個(gè)資源,所以就404了。所以單頁應(yīng)用的部署,需要將所有的頁面請(qǐng)求都返回index.html,瀏覽器下載了index.html后js會(huì)自動(dòng)解析并導(dǎo)航到對(duì)應(yīng)頁面。
# nginx.conf server { listen 80; server_name www.yuexiaohao.com; root /home/yuexiaohao/project/spa/fe/dist; index index.html index.htm; location / { etag on; expires max; try_files $uri $uri/ /index.html; } }
配置好nginx啟動(dòng)可以看到這時(shí)候網(wǎng)站以及可以在線上運(yùn)行起來了。前端路由以及頁面刷新都沒有任何問題,但是數(shù)據(jù)請(qǐng)求肯定是有問題的,因?yàn)檫@個(gè)時(shí)候線上域名下可沒有/api/xxx接口,因?yàn)閱雾搼?yīng)用打包出來的其實(shí)是一個(gè)只包含一個(gè)index.html的靜態(tài)網(wǎng)站,沒有任何動(dòng)態(tài)語言能力的。
我們使用nginx來轉(zhuǎn)發(fā)一下數(shù)據(jù)請(qǐng)求:
# nginx.conf server { listen 80; server_name www.yuexiaohao.com; root /home/yuexiaohao/project/spa/fe/dist; index index.html index.htm; location /api/ { # 這里的接口地址自行修改即可,后端項(xiàng)目跟前端項(xiàng)目在一個(gè)機(jī)器上可以使用本地地址,或者使用內(nèi)網(wǎng)地址,公網(wǎng)地址都沒有問題 proxy_pass http://127.0.0.1:7002/api/; } location / { etag on; expires max; try_files $uri $uri/ /index.html; } }
這個(gè)時(shí)候可以看到數(shù)據(jù)請(qǐng)求也OK了,整個(gè)部署過程就完成了。
總結(jié)單頁應(yīng)用與以前的常規(guī)多頁面應(yīng)用還是有區(qū)別的,開發(fā)過程與后端解耦了,同時(shí)會(huì)出現(xiàn)跨域、鑒權(quán)以及應(yīng)用部署的問題。但是通過工具以及nginx提供的代理或轉(zhuǎn)發(fā)功能,還是可以很好的跨域問題的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/40420.html
摘要:另外,單頁應(yīng)用因?yàn)閿?shù)據(jù)前置到了前端,不利于搜索引擎的抓取。所以我們需要對(duì)自己的單頁應(yīng)用進(jìn)行一些優(yōu)化。 前言 最近秋招之余空出時(shí)間來按自己的興趣動(dòng)手做了一個(gè)項(xiàng)目,一個(gè)基于vue-cli3.0, vue,typescript的移動(dòng)端pwa,現(xiàn)在趁熱打鐵,將這個(gè)項(xiàng)目從開發(fā)到部署整個(gè)過程記錄下來,并將從這個(gè)項(xiàng)目中學(xué)習(xí)到的東西分享出來,如果大家有什么意見或補(bǔ)充也可以在評(píng)論區(qū)提出。先介紹一下這個(gè)項(xiàng)...
摘要:所以前端使用壓縮是沒有起作用的。影響,選項(xiàng)顯示警告在刪除沒有用到的代碼時(shí)不輸出警告刪除所有的語句還可以兼容瀏覽器內(nèi)嵌定義了但是只用到一次的變量提取出出現(xiàn)多次但是沒有定義成變量去引用的靜態(tài)值此方法有待實(shí)踐,留待下次分享 單頁應(yīng)用會(huì)隨著項(xiàng)目越大,導(dǎo)致首屏加載速度很慢?。。∫韵陆o出在下知道的幾種優(yōu)化方案 使用CDN資源,減小服務(wù)器帶寬壓力 路由懶加載 將一些靜態(tài)js css放到其他地方(如...
摘要:所以前端使用壓縮是沒有起作用的。影響,選項(xiàng)顯示警告在刪除沒有用到的代碼時(shí)不輸出警告刪除所有的語句還可以兼容瀏覽器內(nèi)嵌定義了但是只用到一次的變量提取出出現(xiàn)多次但是沒有定義成變量去引用的靜態(tài)值此方法有待實(shí)踐,留待下次分享 單頁應(yīng)用會(huì)隨著項(xiàng)目越大,導(dǎo)致首屏加載速度很慢?。?!以下給出在下知道的幾種優(yōu)化方案 使用CDN資源,減小服務(wù)器帶寬壓力 路由懶加載 將一些靜態(tài)js css放到其他地方(如...
摘要:介紹種相同端口部署多個(gè)單頁應(yīng)用前端路由的方法。使用子域名區(qū)分,此種方法最是簡(jiǎn)單。子域名訪問時(shí)路徑,盤下面文件為的服務(wù)器目錄。采用與作為區(qū)分,分別表示不同的項(xiàng)目。 目前web開發(fā) 使用一般前后端分離技術(shù),并且前端負(fù)責(zé)路由。為了美觀,會(huì)采用前端會(huì)采用h5 history 模式的路由。但刷新頁面時(shí),前端真的會(huì)按照假路由去后端尋找文件。此時(shí),后端必須返回index(index.html)文件才...
摘要:介紹種相同端口部署多個(gè)單頁應(yīng)用前端路由的方法。使用子域名區(qū)分,此種方法最是簡(jiǎn)單。子域名訪問時(shí)路徑,盤下面文件為的服務(wù)器目錄。采用與作為區(qū)分,分別表示不同的項(xiàng)目。 目前web開發(fā) 使用一般前后端分離技術(shù),并且前端負(fù)責(zé)路由。為了美觀,會(huì)采用前端會(huì)采用h5 history 模式的路由。但刷新頁面時(shí),前端真的會(huì)按照假路由去后端尋找文件。此時(shí),后端必須返回index(index.html)文件才...
閱讀 2996·2021-09-01 10:30
閱讀 1760·2019-08-30 15:52
閱讀 1060·2019-08-29 18:40
閱讀 1235·2019-08-28 18:30
閱讀 2484·2019-08-23 17:19
閱讀 1496·2019-08-23 16:25
閱讀 2845·2019-08-23 16:18
閱讀 3078·2019-08-23 13:53