国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

vue SSR 服務(wù)端渲染記錄

villainhr / 3484人閱讀

摘要:前幾天了解了下服務(wù)端渲染的流程,記錄下。現(xiàn)在我們的服務(wù)器與應(yīng)用程序已經(jīng)解耦處理異常服務(wù)端渲染一些坑對(duì)象找不到,由于前端使用的,在環(huán)境不存在數(shù)據(jù)預(yù)獲取時(shí),組件尚未實(shí)例化無(wú)法使用,數(shù)據(jù)請(qǐng)求及格式化等操作都應(yīng)該放置在處理

前幾天了解了下vue 服務(wù)端渲染的流程,記錄下。首先,什么是ssr(服務(wù)端渲染 Server Side Rendering),為什么需要?

服務(wù)端渲染是什么

前后端分離之后,頁(yè)面加載的流程是,前端異步請(qǐng)求拿到數(shù)據(jù)渲染頁(yè)面。服務(wù)端渲染就是在后端把數(shù)據(jù)取好,拼好頁(yè)面的DOM樹(shù)發(fā)給前端,到瀏覽器解析渲染。有沒(méi)有想到前后端分離之前,由后端把數(shù)據(jù)塞進(jìn)模版,前端負(fù)責(zé)顯示的過(guò)去。(有沒(méi)有種天下之勢(shì),合久必分,分久必合的感慨哈哈哈哈哈)

服務(wù)端渲染優(yōu)點(diǎn)

頁(yè)面的SEO, 異步拿數(shù)據(jù)顯示對(duì)爬蟲(chóng)不友好

首屏渲染速度快,更好的用戶(hù)體驗(yàn)

服務(wù)端渲染原理

接下來(lái),介紹下vue 服務(wù)端實(shí)現(xiàn)原理及流程。

SSR 有兩個(gè)入口文件client-entry,server-entry , webpack打包之后,生成 server-bundle, client-bundle

服務(wù)器收到瀏覽器的請(qǐng)求,創(chuàng)建一個(gè)bundleRenderer,讀取1生成的server-bundle,執(zhí)行代碼(具體做了什么后面會(huì)講到),生成html發(fā)送到前端

把第二步生成的html跟前端的client-bundle進(jìn)行混合(hydrate),混合時(shí)判斷client-bundle 的DOM節(jié)點(diǎn)跟服務(wù)端返回的html里DOM節(jié)點(diǎn)是否相同,是的話掛載(vue中的$mount)到這個(gè)節(jié)點(diǎn)上,頁(yè)面渲染完畢

用白話形容,服務(wù)端獲取頁(yè)面所需的數(shù)據(jù)之后,拼出html,把html轉(zhuǎn)成string發(fā)送到前端,前端把html插入到指定節(jié)點(diǎn),渲染頁(yè)面,OK了。

服務(wù)端數(shù)據(jù)預(yù)取

看看官網(wǎng)的demo,服務(wù)端怎么做的服務(wù)端數(shù)據(jù)預(yù)取。

// entry-server.js
import { createApp } from "./app"
export default context => {
  return new Promise((resolve, reject) => {
    const { app, router, store } = createApp()
    router.push(context.url)
     // 等到 router 將可能的異步組件和鉤子函數(shù)解析完
    router.onReady(() => {
      //獲取相匹配的組件
      const matchedComponents = router.getMatchedComponents()
      if (!matchedComponents.length) {
        return reject({ code: 404 })
      }
      // 對(duì)所有匹配的路由組件調(diào)用 `asyncData()`
      Promise.all(matchedComponents.map(Component => {
        if (Component.asyncData) {
          return Component.asyncData({
            store,
            route: router.currentRoute
          })
        }
      })).then(() => {
        // 在所有預(yù)取鉤子(preFetch hook) resolve 后,
        // 我們的 store 現(xiàn)在已經(jīng)填充入渲染應(yīng)用程序所需的狀態(tài)。
        // 當(dāng)我們將狀態(tài)附加到上下文,
        // 并且 `template` 選項(xiàng)用于 renderer 時(shí),
        // 狀態(tài)將自動(dòng)序列化為 `window.__INITIAL_STATE__`,并注入 HTML。
        context.state = store.state
        resolve(app)
      }).catch(reject)
    }, reject)
  })
}

根據(jù)router拿出相匹配的組件,客戶(hù)端定義asyncData(數(shù)據(jù)預(yù)取函數(shù),拿數(shù)據(jù)),服務(wù)端asyncData,獲取數(shù)據(jù)

把源數(shù)據(jù)和狀態(tài)寫(xiě)進(jìn)store(數(shù)據(jù)和狀態(tài)存儲(chǔ)容器,store獨(dú)立于業(yè)務(wù)組件,詳情可查看Vuex),避免客戶(hù)端和服務(wù)端狀態(tài)不對(duì)等。狀態(tài)寫(xiě)進(jìn)window.__INITIAL_STATE__格式,客戶(hù)端可拿到

bundleRenderder

html渲染好之后,轉(zhuǎn)成string發(fā)到客戶(hù)端,客戶(hù)端插入到對(duì)應(yīng)DOM節(jié)點(diǎn)下就可以啦~

const { createBundleRenderer } = require("vue-server-renderer")
const renderer = createBundleRenderer(serverBundle, {
  runInNewContext: false, // 推薦
  template, // (可選)頁(yè)面模板
  clientManifest // (可選)客戶(hù)端構(gòu)建 manifest
})
// 在服務(wù)器處理函數(shù)中……
server.get("*", (req, res) => {
  const context = { url: req.url }
  // 這里無(wú)需傳入一個(gè)應(yīng)用程序,因?yàn)樵趫?zhí)行 bundle 時(shí)已經(jīng)自動(dòng)創(chuàng)建過(guò)。
  // 現(xiàn)在我們的服務(wù)器與應(yīng)用程序已經(jīng)解耦!
  renderer.renderToString(context, (err, html) => {
    // 處理異常……
    res.end(html)
  })
}
服務(wù)端渲染一些坑

document 對(duì)象找不到,由于前端使用的 window,在 node 環(huán)境不存在

數(shù)據(jù)預(yù)獲取時(shí),組件尚未實(shí)例化(無(wú)法使用 this ),數(shù)據(jù)請(qǐng)求及格式化等操作都應(yīng)該放置在store處理

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/90200.html

相關(guān)文章

  • 手把手教你搭建SSR(vue/vue-cli + express)

    摘要:最近簡(jiǎn)單的研究了一下,對(duì)已經(jīng)有了一個(gè)簡(jiǎn)單的認(rèn)知,主要應(yīng)用于單頁(yè)面應(yīng)用,是很不錯(cuò)的框架。創(chuàng)建好之后,在命令行直接輸入即可,當(dāng)控制臺(tái)顯示服務(wù)已啟動(dòng)則表示該服務(wù)已經(jīng)啟動(dòng)成功了。配置參數(shù)中有一項(xiàng)為這項(xiàng)配置的就是我們即將使用的模板。 最近簡(jiǎn)單的研究了一下SSR,對(duì)SSR已經(jīng)有了一個(gè)簡(jiǎn)單的認(rèn)知,主要應(yīng)用于單頁(yè)面應(yīng)用,Nuxt是SSR很不錯(cuò)的框架。也有過(guò)調(diào)研,簡(jiǎn)單的用了一下,感覺(jué)還是很不錯(cuò)。但是還是...

    liangdas 評(píng)論0 收藏0
  • vue服務(wù)渲染demo將vue-cli生成的項(xiàng)目轉(zhuǎn)為ssr

    摘要:無(wú)需使用服務(wù)器實(shí)時(shí)動(dòng)態(tài)編譯,而是使用預(yù)渲染方式,在構(gòu)建時(shí)簡(jiǎn)單地生成針對(duì)特定路由的靜態(tài)文件。與可以部署在任何靜態(tài)文件服務(wù)器上的完全靜態(tài)單頁(yè)面應(yīng)用程序不同,服務(wù)器渲染應(yīng)用程序,需要處于運(yùn)行環(huán)境。更多的服務(wù)器端負(fù)載。 目錄結(jié)構(gòu) -no-ssr-demo 未做ssr之前的項(xiàng)目代碼用于對(duì)比 -vuecli2ssr 將vuecli生成的項(xiàng)目轉(zhuǎn)為ssr -prerender-demo 使用prer...

    whinc 評(píng)論0 收藏0
  • 理解vue ssr原理,自己搭建簡(jiǎn)單的ssr框架

    摘要:前言大多數(shù)項(xiàng)目要支持應(yīng)該是為了考慮,畢竟對(duì)于應(yīng)用來(lái)說(shuō),搜索引擎是一個(gè)很大的流量入口。引入是一個(gè)構(gòu)建客戶(hù)端應(yīng)用的框架,即組件是在瀏覽器中進(jìn)行渲染的。由于服務(wù)端渲染要用做中間層,所以部署項(xiàng)目時(shí),需要處于運(yùn)行環(huán)境。 前言 大多數(shù)Vue項(xiàng)目要支持SSR應(yīng)該是為了SEO考慮,畢竟對(duì)于WEB應(yīng)用來(lái)說(shuō),搜索引擎是一個(gè)很大的流量入口。Vue SSR現(xiàn)在已經(jīng)比較成熟了,但是如果是把一個(gè)SPA應(yīng)用改造成S...

    Riddler 評(píng)論0 收藏0
  • 從零開(kāi)始搭建一個(gè)vue-ssr(上)

    摘要:從零開(kāi)始搭建一個(gè)背景是什么全拼是,服務(wù)端渲染。大家不妨可以打開(kāi)一些頁(yè)面或者一些公司的網(wǎng)站,查看源代碼,你會(huì)發(fā)現(xiàn),也是有這個(gè)標(biāo)記。這時(shí)候,我們發(fā)現(xiàn)頁(yè)面的路由切換生效了,并且不同頁(yè)面的源代碼也不一樣了。從零開(kāi)始搭建一個(gè)下項(xiàng)目源碼 從零開(kāi)始搭建一個(gè)vue-ssr 背景 What?SSR是什么? SSR全拼是Server-Side Rendering,服務(wù)端渲染。 所謂服務(wù)端渲染,指的是把...

    Winer 評(píng)論0 收藏0
  • Vue.js SSR 內(nèi)容總結(jié)

    摘要:本文只是對(duì)官方文檔和對(duì)官方的個(gè)人學(xué)習(xí)總結(jié),說(shuō)得不夠完整的請(qǐng)見(jiàn)諒本文主要對(duì)以下幾方面內(nèi)容對(duì)的內(nèi)容進(jìn)行分析總結(jié)出現(xiàn)的原因的總體原理當(dāng)中的數(shù)據(jù)預(yù)取在編寫(xiě)代碼時(shí)候的限制的構(gòu)建原理出現(xiàn)的原因單頁(yè)應(yīng)用有一個(gè)很大的缺點(diǎn)就是問(wèn)題,搜索引擎目前只能對(duì)同步的進(jìn) 本文只是對(duì)Vue.js官方SSR文檔和對(duì)官方hackernews demo的個(gè)人學(xué)習(xí)總結(jié),說(shuō)得不夠完整的請(qǐng)見(jiàn)諒 本文主要對(duì)以下幾方面內(nèi)容對(duì)Vue....

    曹金海 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<