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

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

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

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

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

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

服務端渲染

服務端渲染和單頁面渲染區(qū)別

查看下面兩張圖,可以看到如果是服務端渲染,那么在瀏覽器中拿到的直接是完整的 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’)// 創(chuàng)建一個 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 回調函數(shù)是可選項。在不傳遞 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 中除了這兩個入口文件,其他的文件都是在客戶端和服務端公用的。來看下這兩個入口文件中分別干了什么。

大體的流程就是:服務端創(chuàng)建 vue 實例,將頁面中的異步請求的數(shù)據(jù)拿到存儲在容器中 --> 客戶端接收到服務端發(fā)送的 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 => { // 因為有可能會是異步路由鉤子函數(shù)或組件,所以我們將返回一個 Promise, // 以便服務器能夠等待所有的內容在渲染前, // 就已經(jīng)準備就緒。 return new Promise((resolve, reject) => { const { app, router, store } = createApp() // 設置服務器端 router 的位置 router.push(context.url) // 等到 router 將可能的異步組件和鉤子函數(shù)解析完 router.onReady(() => { const matchedComponents = router.getMatchedComponents() // 匹配不到的路由,執(zhí)行 reject 函數(shù),并返回 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 現(xiàn)在已經(jīng)填充入渲染應用程序所需的狀態(tài)。 // 當我們將狀態(tài)附加到上下文, // 并且 `template` 選項用于 renderer 時, // 狀態(tài)將自動序列化為 `window.__INITIAL_STATE__`,并注入 HTML。 // 否則會導致客戶端和服務端數(shù)據(jù)不統(tǒng)一造成渲染錯誤 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 服務端渲染內容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
视频一区中文| 麻豆mv在线观看| 麻豆精品在线| 日韩精品1区2区3区| 国产精品日韩久久久| 精品视频在线观看网站| 日韩av中文字幕一区| 亚洲欧美日韩国产| 高清av不卡| 日韩一区二区在线免费| 久久视频精品| 私拍精品福利视频在线一区| 欧美xxxx中国| 超级白嫩亚洲国产第一| 激情五月综合网| 成人av二区| 国产精品毛片一区二区三区| 精品欧美久久| 日本免费一区二区视频| 欧美日韩午夜电影网| 国产精品一区二区三区av麻| 麻豆久久一区| 日本不良网站在线观看| 精品女同一区二区三区在线观看| 国产精品美女午夜爽爽| 亚洲精品**中文毛片| 久久毛片亚洲| 欧洲精品一区二区三区| 日韩高清成人| 天堂av在线一区| 亚洲欧洲专区| 欧美日一区二区在线观看| 国产精品中文字幕亚洲欧美 | 在线国产一区| 快she精品国产999| 日韩av字幕| 久久99青青| 亚洲风情在线资源| 激情综合亚洲| 蜜桃久久久久久久| 欧美日韩精品一区二区三区在线观看| 国产日产精品一区二区三区四区的观看方式 | 日韩精品电影| 欧美.日韩.国产.一区.二区 | 亚洲小说欧美另类婷婷| 欧美日韩国产综合网| 国产精品亚洲欧美| 中文一区在线| 美腿丝袜亚洲一区| 在线日韩一区| 91成人精品观看| 日韩精品一卡| 欧美亚洲免费| 国产综合欧美| 青草综合视频| 日韩欧美一区二区三区在线观看| 欧美激情91| 一区二区国产在线观看| 日本三级亚洲精品| 日韩欧美一区二区三区免费看| 99riav国产精品| 欧美1区二区| 亚洲精品123区| 欧美91在线| 亚洲一区二区三区免费在线观看| 国产欧美一区二区精品久久久 | 石原莉奈一区二区三区在线观看| 给我免费播放日韩视频| 亚洲在线免费| 国产精品调教| 伊人国产精品| 国产乱码午夜在线视频| 亚洲成人日韩| 日本亚洲最大的色成网站www| 日韩高清国产一区在线| 天堂8中文在线最新版在线| 91成人在线网站| 欧美网站在线| 久久国产欧美| 欧美激情一区| 日韩av中文字幕一区二区| 美女毛片一区二区三区四区 | 国产精品2区| 老鸭窝一区二区久久精品| 久久国产日韩| 国产精品91一区二区三区| 国产精品尤物| 久久都是精品| sm捆绑调教国产免费网站在线观看 | 国产一级久久| 国产精品久久久久久久久久齐齐 | 精品国产欧美| 人人精品久久| 国产亚洲欧美日韩精品一区二区三区| 97久久精品| 蜜桃一区二区三区| 亚洲激情另类| 色乱码一区二区三区网站| 国内精品美女在线观看| 久久精品高清| 日韩精品欧美成人高清一区二区| 91成人在线| 国产福利电影在线播放| 97久久精品| 综合激情视频| 精品精品99| 久久美女性网| 亚洲黄页一区| 999国产精品999久久久久久| 丝袜美腿高跟呻吟高潮一区| 成人一二三区| 精品视频亚洲| 欧美经典一区| 日韩福利在线观看| 亚洲理论在线| 热久久久久久久| 亚洲精选成人| 蜜臀精品久久久久久蜜臀| 石原莉奈在线亚洲三区| 国产在线日韩| 亚洲一级二级| 免费看久久久| 日韩国产激情| 久久精品国产福利| 在线视频观看日韩| 国产毛片精品久久| 一区二区电影| 综合激情网...| 久久视频国产| 成人午夜亚洲| 首页国产精品| 美女性感视频久久| 日本久久二区| av资源亚洲| 精品1区2区3区4区| 999久久久亚洲| 久久久成人网| 欧美日韩在线播放视频| 亚洲免费高清| 亚洲欧美一级| 欧美经典一区| 麻豆理论在线观看| 黄色日韩在线| 日本久久综合| 久久中文字幕av| 精品日韩一区| 国产精品免费精品自在线观看| 亚洲精品一级二级| 狠狠干综合网| 日韩精品免费视频人成| 久久狠狠亚洲综合| 国产成人精品亚洲线观看 | 免费观看在线色综合| 亚洲少妇在线| 日韩综合一区二区| 国产情侣久久| 国精品一区二区三区| 日韩美女一区二区三区在线观看| 婷婷综合社区| 国产精品一区2区3区| 国内在线观看一区二区三区| 蜜臀久久久久久久| 肉色欧美久久久久久久免费看| 中文一区一区三区免费在线观 | 亚洲女同一区| 国产精品亚洲四区在线观看| 日韩精品一级| 视频一区视频二区中文字幕| 中文字幕成人| 久久精品免费看| 免费日韩成人| 在线精品小视频| 国产字幕视频一区二区| 激情欧美一区| 亚洲影视一区二区三区| 麻豆久久一区| 999国产精品| 波多野结衣一区| 99久久视频| 好看的亚洲午夜视频在线| 日韩中文字幕不卡| 亚洲三级视频| 国产不卡一区| 正在播放日韩精品| 日日摸夜夜添夜夜添国产精品| 国模精品一区| 亚洲第一区色| 国产一区二区三区视频在线| 日韩福利视频导航| 国产精品字幕| 日韩精品亚洲一区二区三区免费| 国产精品一区二区三区av| 亚洲三级在线| 偷拍欧美精品| 国产成人精品亚洲线观看 | 综合在线一区| 久久精品不卡| 日韩成人午夜精品| 日韩不卡一区二区| 日韩高清不卡一区|