摘要:預(yù)渲染構(gòu)建階段生成匹配預(yù)渲染路徑的文件注意每個(gè)需要預(yù)渲染的路由都有一個(gè)對(duì)應(yīng)的。使用安裝中引入代碼打包目錄模板頁(yè)面要預(yù)渲染的頁(yè)面路由默認(rèn)掛在對(duì)象上,可以通過(guò)在預(yù)渲染頁(yè)面取值渲染時(shí)顯示瀏覽器窗口。
prerender-spa-plugin預(yù)渲染:構(gòu)建階段生成匹配預(yù)渲染路徑的 html 文件(注意:每個(gè)需要預(yù)渲染的路由都有一個(gè)對(duì)應(yīng)的
html)。構(gòu)建出來(lái)的 html 文件已有部分內(nèi)容。
prerender-spa-plugin使用
安裝prerender-spa-plugin
npm install prerender-spa-plugin --save
webpack.prod.config.js中引入
const PrerenderSPAPlugin = require("prerender-spa-plugin")
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer
plugins: [ new PrerenderSPAPlugin({ staticDir: path.join(__dirname, "../dist"), // outputDir: path.join(__dirname, "../prerendered"), indexPath: path.join(__dirname, "../dist", "index.html"), routes: ["/mobile/home.html", "/mobile/doctor_team.html", "/mobile/about.html"], renderer: new Renderer({ inject: { foo: "bar" }, headless: false, renderAfterDocumentEvent: "render-active" // renderAfterElementExists: ".container", // renderAfterTime: 5000 }) }) ]
staticDir:代碼打包目錄
indexPath:模板頁(yè)面
routes:要預(yù)渲染的頁(yè)面路由
inject:默認(rèn)掛在window.__PRERENDER_INJECTED對(duì)象上,可以通過(guò)window.__PRERENDER_INJECTED.foo在預(yù)渲染頁(yè)面取值
headless:渲染時(shí)顯示瀏覽器窗口。對(duì)調(diào)試很有用。
renderAfterDocumentEvent:等到事件觸發(fā)去渲染,此處我理解為是Puppeteer獲取頁(yè)面的時(shí)機(jī)
renderAfterDocumentEvent 這個(gè)則很關(guān)鍵,這個(gè)是監(jiān)聽 document.dispatchEvent
事件,決定什么時(shí)候開始預(yù)渲染。需要在鉤子函數(shù)中觸發(fā)事件,如
new Vue({ el: "#app", router, render: h => h(App), mounted () { // You"ll need this for renderAfterDocumentEvent. document.dispatchEvent(new Event("render-active")) } });
renderAfterElementExists:等到dom元素出現(xiàn)時(shí)去渲染
renderAfterTime:5000ms后去渲染
webpack打包編譯
結(jié)合項(xiàng)目,執(zhí)行打包編譯命令
npm run build:prod
在dist目錄下生成以下頁(yè)面,雖然生成了兩層目錄,但是還是映射到"/mobile/home.html", "/mobile/doctor_team.html", "/mobile/about.html"
查看打包以后的頁(yè)面,body內(nèi)容已經(jīng)渲染好了
啟動(dòng)http-server訪問(wèn)http://127.0.0.1:8080/mobile/about.html,效果跟正常訪問(wèn)一致
原理
prerender-spa-plugin 利用了 Puppeteer 的爬取頁(yè)面的功能。 Puppeteer 是一個(gè) Chrome官方出品的 headlessChromenode 庫(kù)。它提供了一系列的 API, 可以在無(wú) UI 的情況下調(diào)用 Chrome 的功能, 適用于爬蟲、自動(dòng)化處理等各種場(chǎng)景。它很強(qiáng)大,所以很簡(jiǎn)單就能將運(yùn)行時(shí)的 HTML 打包到文件中。原理是在 Webpack 構(gòu)建階段的最后,在本地啟動(dòng)一個(gè) Puppeteer 的服務(wù),訪問(wèn)配置了預(yù)渲染的路由,然后將 Puppeteer 中渲染的頁(yè)面輸出到 HTML 文件中,并建立路由對(duì)應(yīng)的目錄。
圖片描述(最多50字)
具體代碼可以結(jié)合render-puppeteer下的代碼來(lái)看
圖片描述(最多50字)
在render.js中,啟動(dòng)本地服務(wù),通過(guò)page.goto依次訪問(wèn)
http://localhost:8000/mobile/about.html,
http://localhost:8000/mobile/home.html
http://localhost:8000/mobile/doctor_team.html
通過(guò)page.content()獲取html
總結(jié)
結(jié)合項(xiàng)目實(shí)踐了下這個(gè)插件,也有不少坑
1.在config/index.js中assetsPublicPath原先寫的是/dist,導(dǎo)致預(yù)渲染的頁(yè)面body沒(méi)有渲染出來(lái),是空白頁(yè)面,改成/就能預(yù)渲染出來(lái),但是這樣導(dǎo)致不需要預(yù)渲染的頁(yè)面資源路徑不對(duì)
2.該插件在webpack此版本下不支持路由懶加載,
"webpack": "^4.6.0",
網(wǎng)上提到npm i webpack@4.28.4可以解決,果然升級(jí)了webpack版本后支持路由懶加載
3.在需要請(qǐng)求動(dòng)態(tài)數(shù)據(jù)的頁(yè)面中,預(yù)渲染只能保證靜態(tài)部分不更改,如果不想寫死,要做動(dòng)態(tài)數(shù)據(jù)代理,webpack的devserver代理數(shù)據(jù)無(wú)效,需要用nginx或者其他代理工具代理線上數(shù)據(jù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/101779.html
摘要:官方地址設(shè)置單頁(yè)面信息,如果需要單頁(yè)面,可以和形成更優(yōu)的配合單頁(yè)面應(yīng)用在前端正大放光彩。隨著單頁(yè)面應(yīng)用的普及,人們?cè)诟惺芷鋷?lái)的完美的用戶體驗(yàn),極強(qiáng)的開發(fā)效率的同時(shí),也似乎不可避免的要去處理的需求。 vue-meta-info 官方地址: https://github.com/monkeyWang... (設(shè)置vue 單頁(yè)面meta info信息,如果需要單頁(yè)面SEO,可以和 prer...
摘要:官方地址設(shè)置單頁(yè)面信息,如果需要單頁(yè)面,可以和形成更優(yōu)的配合單頁(yè)面應(yīng)用在前端正大放光彩。隨著單頁(yè)面應(yīng)用的普及,人們?cè)诟惺芷鋷?lái)的完美的用戶體驗(yàn),極強(qiáng)的開發(fā)效率的同時(shí),也似乎不可避免的要去處理的需求。 vue-meta-info 官方地址: https://github.com/monkeyWang... (設(shè)置vue 單頁(yè)面meta info信息,如果需要單頁(yè)面SEO,可以和 prer...
摘要:眾所周知單頁(yè)面應(yīng)用不利于,為了解決這個(gè)問(wèn)題網(wǎng)上所給出的個(gè)解決方案服務(wù)器端渲染預(yù)渲染由于頁(yè)面較少,且預(yù)渲染相對(duì)于比較簡(jiǎn)單,于是選擇預(yù)渲染頁(yè)面,預(yù)渲染可以極大的提高網(wǎng)頁(yè)訪問(wèn)速度。 眾所周知單頁(yè)面應(yīng)用不利于SEO,為了解決這個(gè)問(wèn)題網(wǎng)上所給出的2個(gè)解決方案**1、SSH服務(wù)器端渲染2、預(yù)渲染**由于頁(yè)面較少,且預(yù)渲染相對(duì)于SSH比較簡(jiǎn)單,于是選擇預(yù)渲染頁(yè)面,預(yù)渲染可以極大的提高網(wǎng)頁(yè)訪問(wèn)速度。而...
摘要:好了,項(xiàng)目啟動(dòng)了,目錄結(jié)構(gòu)也清楚了,接下來(lái)就是整個(gè)現(xiàn)有項(xiàng)目的遷移了目前正在改造項(xiàng)目,文章尚未寫完,會(huì)抽時(shí)間不定期的繼續(xù)更新項(xiàng)目的改造過(guò)程及分享改造過(guò)程中遇到的問(wèn)題 公司項(xiàng)目,最初只為了實(shí)現(xiàn)前后端分離式開發(fā),直接選擇了vue框架進(jìn)行開發(fā),然而現(xiàn)在項(xiàng)目基本完成了,發(fā)現(xiàn)蜘蛛根本就抓取不到網(wǎng)站數(shù)據(jù),搜索引擎搜出來(lái),都是一片空白沒(méi)有數(shù)據(jù),需要對(duì)項(xiàng)目做SEO優(yōu)化。 本人第一次接觸SEO的優(yōu)化,完全...
摘要:配置方式找到文件如需添加路由則在里面添加,同時(shí)需要后端更改配置除了上面的路徑,其他路徑全部指向單頁(yè)應(yīng)用多路由預(yù)渲染指南使用說(shuō)明源碼為方便快速構(gòu)建項(xiàng)目,本例所有配置的代碼均放在項(xiàng)目中。 寫在前面 每次構(gòu)建react項(xiàng)目的時(shí)候都會(huì)配置一大堆東西,時(shí)間久了就會(huì)忘記怎么配置。為了方便自己記憶也為了其他開發(fā)者在構(gòu)建react應(yīng)用時(shí)能夠快速開發(fā),故作此記錄。 本項(xiàng)目基于 create-react-...
閱讀 3265·2021-09-02 15:41
閱讀 2827·2021-09-02 09:48
閱讀 1368·2019-08-29 13:27
閱讀 1157·2019-08-26 13:37
閱讀 832·2019-08-26 11:56
閱讀 2477·2019-08-26 10:24
閱讀 1636·2019-08-23 18:07
閱讀 2615·2019-08-23 15:16