日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

vue ssr+koa2構建服務端渲染的示例代碼

瀏覽:211日期:2023-01-30 10:55:00

之前做了活動投放頁面在百度、360等渠道投放,采用 koa2 + 模版引擎的方式。發現幾個問題

相較于框架開發頁面效率較低,維護性差 兼容性問題,在頁面中添加埋點后發現有些用戶的數據拿不到,排查后發現通過各個渠道過來的用戶的設備中仍然包含大量低版本的瀏覽器。

服務端渲染

服務端渲染和單頁面渲染區別

查看下面兩張圖,可以看到如果是服務端渲染,那么在瀏覽器中拿到的直接是完整的 html 結構。而單頁面是一些 script 標簽引入的js文件,最終將虛擬dom去掛在到 #app 容器上。

vue ssr+koa2構建服務端渲染的示例代碼

vue ssr+koa2構建服務端渲染的示例代碼

@vue/cli 4 來構建項目結構

下面代碼使用最精簡的實例完整代碼會放到 github 上

step1 安裝最新的腳手架初始化項目

yarn global add @vue/cli

step2 添加服務端文件

啟動一個 web 服務下方代碼中 http://localhost:9000 就是我們最終要訪問到地址

const Koa = require(’koa’)const path = require(’path’)const resolve = file => path.resolve(__dirname, file)const app = new Koa()const router = require(’./router’)const port = 9000app.listen(port, () => { console.log(`server started at localhost:${port}`)})module.exports = app

這里只是啟動了服務,我們需要在去讀取服務端和客戶端到文件,下面代碼就是服務端渲染的關鍵步驟

const fs = require(’fs’)const path = require(’path’)const send = require(’koa-send’)const Router = require(’koa-router’)const router = new Router()// 獲取當前文件的絕對路徑const resolve = file => path.resolve(__dirname, file)const { createBundleRenderer } = require(’vue-server-renderer’)const bundle = require(’../dist/vue-ssr-server-bundle.json’)const clientManifest = require(’../dist/vue-ssr-client-manifest.json’)// 創建一個 BunleRender 實例用于 renderer.renderToString 將 bundle 渲染為字符串const renderer = createBundleRenderer(bundle, { runInNewContext: false, template: fs.readFileSync(resolve(’../src/index.temp.html’), ’utf-8’), clientManifest: clientManifest})const handleRequest = async ctx => { ctx.res.setHeader(’Content-Type’, ’text/html’) // 在 2.5.0+ 版本中,此 callback 回調函數是可選項。在不傳遞 callback 時,此方法返回一個 Promise 對象,在其 resolve 后返回最終渲染的 HTML。 ctx.body = await renderer.renderToString(Object.assign({}, ctx.state.deliver, { url }))}router.get(’/home’,handleRequest)module.exports = router

vue-server-render 提供一個名為 createBundleRenderer 的 API 使用方法如下

const { createBundleRenderer } = require(’vue-server-renderer’)const renderer = createBundleRenderer(serverBundle, { runInNewContext: false, // 推薦 template, // (可選)頁面模板 clientManifest // (可選)客戶端構建 manifest})

通過上面的 createBundleRenderer 方法生產 render 對象最終將 bunlde 渲染為字符串,將最終的 html 返回給客戶端。

bundleRenderer.renderToString([context, callback]): ?Promise<string>

step3 添加 entry-client.js,entry-server.js 入口文件

在 src 中除了這兩個入口文件,其他的文件都是在客戶端和服務端公用的。來看下這兩個入口文件中分別干了什么。

大體的流程就是:服務端創建 vue 實例,將頁面中的異步請求的數據拿到存儲在容器中 --> 客戶端接收到服務端發送的 html 以激活模式進行掛載,自動給根元素 #app 上添加 data-server-rendered='true' 特殊屬性

main.js

import Vue from ’vue’import App from ’./App.vue’...export function createApp() { // ... const app = new Vue({ router, store, render: h => h(App) }) return { app, router, store }}

entry-server.js

import { createApp } from ’./main.js’export default context => { // 因為有可能會是異步路由鉤子函數或組件,所以我們將返回一個 Promise, // 以便服務器能夠等待所有的內容在渲染前, // 就已經準備就緒。 return new Promise((resolve, reject) => { const { app, router, store } = createApp() // 設置服務器端 router 的位置 router.push(context.url) // 等到 router 將可能的異步組件和鉤子函數解析完 router.onReady(() => { const matchedComponents = router.getMatchedComponents() // 匹配不到的路由,執行 reject 函數,并返回 404 if (!matchedComponents.length) { return reject({ code: 404 }) } Promise.all( matchedComponents.map(component => { if (component.asyncData) { return component.asyncData({ store, context, route: router.currentRoute }) } }) ).then(() => { // 在所有預取鉤子(preFetch hook) resolve 后, // 我們的 store 現在已經填充入渲染應用程序所需的狀態。 // 當我們將狀態附加到上下文, // 并且 `template` 選項用于 renderer 時, // 狀態將自動序列化為 `window.__INITIAL_STATE__`,并注入 HTML。 // 否則會導致客戶端和服務端數據不統一造成渲染錯誤 context.state = store.state resolve(app) }).catch(reject) }, reject) })}

entry-client.js

import { createApp } from ’./main’const { app, router, store } = createApp()if (window.__INITIAL_STATE__) { store.replaceState(window.__INITIAL_STATE__)}router.onReady(() => { router.beforeResolve((to, from, next) => { const matched = router.getMatchedComponents(to) const prevMatched = router.getMatchedComponents(from) let diffed = false const activated = matched.filter((c, i) => { return diffed || (diffed = prevMatched[i] !== c) }) if (!activated.length) { return next() } Promise.all( activated.map(component => { if (component.asyncData) { component.asyncData({ store, route: to }) } }) ) .then(() => { next() }) .catch(next) }) app.$mount(’#app’)})

最后

完整代碼參考 github地址

順便貼上這張圖

vue ssr+koa2構建服務端渲染的示例代碼

到此這篇關于vue ssr+koa2構建服務端渲染的示例代碼的文章就介紹到這了,更多相關vue ssr koa2 服務端渲染內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产伦理久久久久久妇女| 日韩视频1区| 欧美精品观看| 日韩激情一二三区| 综合亚洲视频| 亚洲国产日韩欧美在线| 亚洲va在线| 99久久婷婷| 夜夜嗨一区二区三区| 日韩一级精品| 一级成人国产| 日韩精品亚洲专区| 欧美在线首页| 国产精品毛片久久久| 国产精品欧美三级在线观看| 国产精品一区二区三区美女 | 日韩av一二三| 中文字幕一区二区精品区| 亚洲乱码视频| 欧美久久亚洲| 久久精品九色| 成人久久一区| 欧美在线资源| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产精品久久国产愉拍| 日韩福利视频网| 国产劲爆久久| 不卡福利视频| 日韩午夜一区| 日本午夜精品视频在线观看| 久久免费精品| 欧美成人久久| 日韩精品一区二区三区中文在线| 国产一区 二区| 国产一区二区亚洲| 国产一区清纯| 亚洲18在线| 久久亚洲人体| 女人av一区| 日韩国产在线观看| 精品一区二区三区免费看| 色在线视频观看| 在线亚洲一区| 国产精品xvideos88| 久久精品观看| 亚洲aa在线| 国产福利电影在线播放| 婷婷综合在线| 欧美在线看片| 久久久久久久久99精品大| 麻豆亚洲精品| 国产精久久久| 野花国产精品入口| 国产精品久一| 欧美+亚洲+精品+三区| 午夜精品福利影院| 日韩精品视频中文字幕| 亚洲专区视频| 国产精品蜜芽在线观看| 国产亚洲在线| 久久中文视频| 97久久精品| 久久九九电影| 国产欧美在线| 欧美理论视频| 免费观看亚洲天堂| 国产亚洲在线| 国产一区福利| 婷婷精品在线| 天堂av在线| 久久精品国产99国产| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 国产一区二区久久久久| 欧美日韩激情| 久久精品国产99国产精品| 日韩一区精品视频| 日韩欧美综合| 国产精品综合| 一区二区亚洲视频| 日韩欧美一区二区三区在线视频| 亚洲精品一二| 亚洲www啪成人一区二区| 久久国产婷婷国产香蕉| 999在线观看精品免费不卡网站| 另类欧美日韩国产在线| 亚洲欧美一级| 国产午夜精品一区二区三区欧美| 国产一区2区| 日韩国产精品久久久久久亚洲| 欧美色图国产精品| 成人午夜亚洲| 国产精品欧美一区二区三区不卡| 亚洲免费一区三区| 亚洲欧美网站| 久久精品卡一| 日韩三区免费| 久久久免费人体| 欧美亚洲福利| 在线精品亚洲| 午夜久久免费观看| 午夜久久中文| 精品三级av| 国产精品欧美一区二区三区不卡| 亚洲日产国产精品| 免费视频一区二区| 国产精品婷婷| 国产精品毛片在线看| 在线观看免费一区二区| 99久久激情| 国产美女高潮在线| 91精品国产91久久久久久黑人| 国产精东传媒成人av电影| 欧美一区成人| 日本va欧美va瓶| 亚洲精品激情| 天堂va在线高清一区| 亚洲精品综合| 亚洲美女91| 日本亚洲最大的色成网站www | 国产综合精品| 久久高清精品| 激情六月综合| 国产国产精品| 欧美日韩第一| 欧美日韩国产高清电影| 婷婷综合六月| 久久久777| 久久久天天操| 久久久精品午夜少妇| 在线人成日本视频| 九九精品调教| 99久久久久国产精品| 亚洲欧洲日本mm| 日韩视频二区| 日韩专区一卡二卡| 天堂va欧美ⅴa亚洲va一国产| 日韩精品成人| 欧美日韩国产综合网| 不卡视频在线| 蜜臀va亚洲va欧美va天堂| 久久国产福利| 日韩和欧美一区二区| 亚洲精品动态| 国产精品久久久久av蜜臀| 精品免费视频| 日韩精品网站| 亚洲中午字幕| 婷婷综合福利| 精品亚洲成人| 四虎4545www国产精品| 亚洲午夜精品久久久久久app| 99热精品在线观看| 日韩精品导航| sm捆绑调教国产免费网站在线观看| 国模 一区 二区 三区| 免费日韩av片| 国产精品久久久久久久久久齐齐| 日韩一区电影| 中文无码久久精品| 久久99久久人婷婷精品综合| 国产精品麻豆久久| 今天的高清视频免费播放成人| 久久最新视频| 国产精品99精品一区二区三区∴| 成人国产精品一区二区网站| 久久精品免费一区二区三区| 亚洲伊人精品酒店| 麻豆精品在线| 欧美sm一区| 蜜桃av一区二区三区电影| 日韩av中文字幕一区| 丰满少妇一区| 日韩在线一区二区| 国内不卡的一区二区三区中文字幕| 欧美中文字幕一区二区| 综合激情在线| аⅴ资源天堂资源库在线| 免费精品视频| 国产suv精品一区| 三级亚洲高清视频| 国产成人1区| 综合亚洲色图| 婷婷综合六月| 日本综合精品一区| 日韩高清不卡| 亚洲午夜久久| 91亚洲人成网污www| 综合激情网...| 精品国产免费人成网站| 深夜日韩欧美| 91精品推荐| 国产精品一区二区免费福利视频| 日韩网站中文字幕| 国产欧美欧美| 中文精品视频| 高清av一区| 欧美精品国产一区| 免费日韩av片| 久久国产精品成人免费观看的软件| 国产三级精品三级在线观看国产|