服務(wù)器端渲染現(xiàn)在非常流行。但它也并非沒有缺點。預(yù)渲染是一種替代方法,在某些情況下甚至可能更好。下面我們來看一下如何預(yù)渲染vue.js應(yīng)用程序。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供安徽網(wǎng)站建設(shè)、安徽做網(wǎng)站、安徽網(wǎng)站設(shè)計、安徽網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、安徽企業(yè)網(wǎng)站模板建站服務(wù),十載安徽做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。在本文中,我們將探討預(yù)渲染如何與vue.js一起工作,并看兩個示例:一個是node.js項目,一個是laravel項目。
相關(guān)教程推薦:node js教程 、vue.js教程 、laravel教程
一、服務(wù)端渲染
基于javascript的應(yīng)用程序的一個缺點是,瀏覽器從服務(wù)器接收到的頁面基本上是空的。在下載并運行Javascript之前,無法構(gòu)建DOM。
這意味著用戶必須等待更長的時間才能看到任何東西。如果爬蟲程序不能快速查看頁面內(nèi)容,它也會對SEO產(chǎn)生影響。
服務(wù)器端呈現(xiàn)(SSR)通過在服務(wù)器上呈現(xiàn)應(yīng)用程序來克服這個問題,以便客戶端在加載頁面時(甚至在Javascript運行之前)接收完整的DOM內(nèi)容。
而不是瀏覽器從服務(wù)器接收這個:
<head> ... </head> <body> <div id="app"> <!--This is empty, Javascript will populate it later--> </app> </body>
使用SSR,它接收一個完整的內(nèi)容頁面:
<head> ... </head> <body> <div id="app"> <div class="container"> <h1>Your Server-Side Rendered App</h1> <div class="component-1"> <p>Hello World</p> <!--etc etc. This was all rendered on the server--> </app> </body>
服務(wù)器端渲染缺點
你的應(yīng)用程序需要在服務(wù)器上可執(zhí)行,所以你需要設(shè)計你的代碼是“通用的”,也就是說,它可以在瀏覽器和節(jié)點服務(wù)器上工作。
您的應(yīng)用程序?qū)⑦\行在每一個請求到服務(wù)器,添加一個傳統(tǒng)的負載和緩慢的響應(yīng)。緩存可以部分緩解這種情況。
你只能用Node.js做SSR。如果您的主后端是Laravel、Django等,那么您必須在主后端運行一個節(jié)點服務(wù)器來處理SSR。
二、預(yù)渲染
還有另一種方法可以解決空頁問題:預(yù)渲染。使用這種方法,您可以在部署應(yīng)用程序之前運行應(yīng)用程序,捕獲頁面輸出并用捕獲的輸出替換HTML文件。
它與SSR的概念基本相同,只是它是在開發(fā)環(huán)境中預(yù)先部署的,而不是在活動服務(wù)器中。
預(yù)渲染通常使用PhantomJS這樣的無頭瀏覽器來執(zhí)行,并且可以與Webpack、Gulp等一起集成到構(gòu)建流中。
預(yù)渲染的優(yōu)點
沒有額外的服務(wù)器負載,因此比SSR更快更便宜
更簡單的生產(chǎn)設(shè)置和更簡單的應(yīng)用程序代碼,因此更不容易出錯
不需要Node.js生產(chǎn)服務(wù)器
預(yù)渲染的缺點
對于顯示不斷變化的數(shù)據(jù)的頁面(例如表),不能很好地工作。
不適用于具有特定用戶內(nèi)容的頁面,例如包含用戶個人信息的帳戶頁面。然而,無論如何,這些類型的頁面對于預(yù)呈現(xiàn)都不那么重要;這是我們主要的,經(jīng)常使用的頁面,我們想要提供快速。
你需要在應(yīng)用程序中單獨預(yù)渲染每條路線。
對照表
三、Vue.js預(yù)渲染示例
讓我們做一個簡單的例子來預(yù)渲染一個vue.js應(yīng)用程序,一次在node.js環(huán)境中,一次在laravel環(huán)境中。
在這些示例中,我們將使用webpack和pre render spa插件來執(zhí)行預(yù)渲染。
1、Vue和Node
第1步:項目安裝
我們將使用vue-cli和webpack-simple模板。
$ vue init webpack-simple vue-node-pr-test $ cd vue-node-pr-test $ npm install
我們還需要另外三個模塊,后面還有解釋。
$ npm install --save-dev http-server html-webpack-plugin prerender-spa-plugin
第2步:在Webpack構(gòu)建中包含index.html
Webpack -simple模板在Webpack構(gòu)建輸出中不包含index.html文件。然而,當(dāng)我們預(yù)渲染應(yīng)用程序時,我們需要覆蓋我們的索引。因此,讓我們將它添加到輸出中,以免破壞原始的。
在我們的Webpack .config.js文件中使用html-webpack-plugin將文件包含在Webpack構(gòu)建中:
var HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports.plugins.push( new HtmlWebpackPlugin({ template: './index.html', inject: false }), );
現(xiàn)在我們改變了我們的Webpack公共路徑,因為index.html現(xiàn)在和其他靜態(tài)資產(chǎn)在同一個文件夾中:
output: { path: path.resolve(__dirname, './dist'), filename: 'build.js', publicPath: '/', // was originally 'dist' },
由于路徑的變化,我們還需要將index.html中的<script src="/dist/build.js"></script>更改為<script src=“/build.js”></script>。
第3步:測試Webpack生成版本
現(xiàn)在我們建造:
$ npm run build
我們的dist文件夾應(yīng)該是這樣的:
- dist -- build.js -- index.html -- logo.png
如果我們檢查dist/index.html,它會是這樣的:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>vue-node-pr-test</title> </head> <body> <div id="app"></div> <script type="text/javascript" src="/build.js"></script> </body> </html>
現(xiàn)在我們可以使用http-server并從dist文件夾中提供應(yīng)用程序。默認情況下,它將運行在localhost:8080:
$ ./node_modules/.bin/http-server ./dist
第4步:預(yù)渲染應(yīng)用程序
現(xiàn)在我們的index.html文件在Webpack構(gòu)建中,我們可以使用預(yù)呈現(xiàn)的HTML更新它。
首先,我們需要在webpack配置中添加prerender-spa-plugin。確保它在html-webpack-plugin之后。
var PrerenderSpaPlugin = require('prerender-spa-plugin'); module.exports.plugins.push( new PrerenderSpaPlugin( path.join(__dirname, './dist'), [ '/' ] ) );
PrerenderSpaPlugin的第一個參數(shù)是index.html文件的位置,第二個參數(shù)是應(yīng)用程序中的路由列表。在這個例子中,我們只有一條路徑。
現(xiàn)在我們再次建造:
$ npm run build
我們的構(gòu)建將比以前花費更長的時間,因為預(yù)渲染插件正在做的事情:
它創(chuàng)建一個Phantom JS實例并運行應(yīng)用程序
獲取DOM的快照
將快照輸出到生成文件夾中的HTML文件
它會對每條路徑重復(fù)這個過程,所以如果你有很多頁面,構(gòu)建應(yīng)用程序可能需要相當(dāng)長的時間。
在建立后,我們的dist/index.html現(xiàn)在應(yīng)該包括所有預(yù)渲染的HTML:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>prerender-test</title> <style type="text/css">#app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px } h1, h2 { font-weight: 400 } ul { list-style-type: none; padding: 0 } li { display: inline-block; margin: 0 10px } a { color: #42b983 }</style> </head> <body> <div id="app"><img src="/logo.png?82b9c7a5a3f405032b1db71a25f67021"> <h1></h1> <h2>Essential Links</h2> <ul> <li><a href="https://vuejs.org" target="_blank">Core Docs</a></li> <li><a href="https://forum.vuejs.org" target="_blank">Forum</a></li> <li><a href="https://gitter.im/vuejs/vue" target="_blank">Gitter Chat</a></li> <li><a href="https://twitter.com/vuejs" target="_blank">Twitter</a></li> </ul> <h2>Ecosystem</h2> <ul> <li><a href="http://router.vuejs.org/" target="_blank">vue-router</a></li> <li><a href="http://vuex.vuejs.org/" target="_blank">vuex</a></li> <li><a href="http://vue-loader.vuejs.org/" target="_blank">vue-loader</a></li> <li><a href="https://github.com/vuejs/awesome-vue" target="_blank">awesome-vue</a></li> </ul> </div> <script type="text/javascript" src="/build.js"></script> </body> </html>
2、Vue 和 Laravel
如果您跳過了Vue和Node示例,我建議您先回去閱讀它,因為它包含了對任何常見步驟的更全面的解釋。
第1步:項目安裝
首先,我們將設(shè)置一個新的Laravel項目。
$ laravel new vue-laravel-pr-test $ cd vue-laravel-pr-test $ npm install
我們還將增加兩個我們需要的NPM模塊:
$ npm install --save-dev html-webpack-plugin prerender-spa-plugin
第2步:提供一個普通的HTML文件
默認情況下,Laravel在根URL處提供Blade模板文件。 為了使示例簡單,我們將使用我們將在resources / views / index.html創(chuàng)建的以下純HTML文件替換它
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Laravel</title> <link rel="stylesheet" href="/css/app.css"> <body> <div id="app"> <example></example> </div> <script type="text/javascript" src="/js/app.js"></script> </body> </html>
現(xiàn)在,我們需要在根路徑上提供該文件,而不是刀片服務(wù)器模板。將route /web.php更改為:
Route::get('/', function () { return File::get(public_path() . '/index.html'); });
這實際上指向我們的build文件夾,我們很快就會生成它。
第3步:將HTML文件添加到構(gòu)建中
像在節(jié)點示例中一樣,我們希望在Webpack構(gòu)建中包含index.html,以便稍后使用預(yù)呈現(xiàn)的HTML覆蓋它。
我們需要做一些Webpack配置。在本例中,我使用的是Laravel 5.4,它使用的是Laravel Mix。Mix沒有提供本地webpack配置文件,因為它使用自己的默認文件,所以讓我們從laravel-mix模塊復(fù)制一個配置文件:
$ cp ./node_modules/laravel-mix/setup/webpack.config.js .
我們還需要讓我們的NPM生產(chǎn)腳本指向這個配置文件,因此編輯包。json,并將生產(chǎn)腳本更改為:
cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=webpack.config.js
現(xiàn)在我們將html-webpack-plugin添加到webpack.config.js文件中。把這個添加到文件的底部上面的混合定型部分:
var HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports.plugins.push( new HtmlWebpackPlugin({ template: Mix.Paths.root('resources/views/index.html'), inject: false }); );
第4步:測試Weback生成版本
現(xiàn)在讓我們?yōu)樯a(chǎn)和服務(wù):
$ npm run production $ php artisan serve
不過,在運行應(yīng)用程序時,瀏覽器中可能會出現(xiàn)錯誤,因為我們從未為window.Laravel.csrfToken設(shè)置值。對于這個簡單的例子,注釋掉會更快,所以像這樣修改resources/assets/js/bootsta .js:
window.axios.defaults.headers.common = { 'X-Requested-With': 'XMLHttpRequest' // 'X-CSRF-TOKEN': window.Laravel.csrfToken; };
第5步:預(yù)渲染應(yīng)用程序
我們現(xiàn)在需要在webpack配置中使用prerender spa插件來執(zhí)行預(yù)渲染。確保它在HTML網(wǎng)頁包插件之后。
var PrerenderSpaPlugin = require('prerender-spa-plugin'); module.exports.plugins.push( new PrerenderSpaPlugin( Mix.output().path, [ '/' ] ) );
現(xiàn)在我們可以做一個生產(chǎn)構(gòu)建:
$ npm run production
如果您選中build文件夾,dist/index.html現(xiàn)在應(yīng)該如下所示,并使用預(yù)渲染HTML完成:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Laravel</title> <link rel="stylesheet" href="/css/app.css"> </head> <body> <div id="app"> <div> <div> <div class="col-md-8 col-md-offset-2"> <div class="panel panel-default"> <div>Example Component</div> <div> I'm an example component! </div> </div> </div> </div> </div> </div> <script src="/js/app.js"></script> </body> </html>
相關(guān)推薦:
2020年前端vue面試題大匯總(附答案)
vue教程推薦:2020最新的5個vue.js視頻教程精選
更多編程相關(guān)知識,請訪問:編程入門!!
當(dāng)前文章:node和laravel項目中預(yù)渲染vue.js應(yīng)用程序
分享鏈接:http://vcdvsql.cn/article14/chosge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、關(guān)鍵詞優(yōu)化、App開發(fā)、搜索引擎優(yōu)化、企業(yè)網(wǎng)站制作、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)