mirror of
https://github.com/tenrok/vue-meta.git
synced 2026-06-24 23:20:34 +03:00
feat: add ssr benchmark for v3
This commit is contained in:
@@ -0,0 +1,52 @@
|
|||||||
|
import v2 from './v2'
|
||||||
|
import { v3, v3cached, v3binding } from './v3'
|
||||||
|
|
||||||
|
const metaInfo = {
|
||||||
|
title: 'the title',
|
||||||
|
meta: [
|
||||||
|
{ charset: 'utf-8' },
|
||||||
|
{ name: 'description', content: 'the description' },
|
||||||
|
{ name: 'og:description', content: 'the description' },
|
||||||
|
{ name: 'twitter:description', content: 'the description' },
|
||||||
|
],
|
||||||
|
script: [
|
||||||
|
{ src: '/script.hs' }
|
||||||
|
],
|
||||||
|
noscript: [
|
||||||
|
{ innerHTML: 'no script' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
const count = 10000
|
||||||
|
|
||||||
|
const suites = {
|
||||||
|
v2,
|
||||||
|
v3,
|
||||||
|
v3cached,
|
||||||
|
v3binding
|
||||||
|
}
|
||||||
|
|
||||||
|
async function run() {
|
||||||
|
for (const suite of Object.keys(suites)) {
|
||||||
|
const data = []
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
data.push(JSON.parse(JSON.stringify({
|
||||||
|
...metaInfo,
|
||||||
|
title: metaInfo.title + i
|
||||||
|
})))
|
||||||
|
}
|
||||||
|
|
||||||
|
let s = new Date().getTime()
|
||||||
|
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
const html = await suites[suite](data[i])
|
||||||
|
// console.log(html)
|
||||||
|
}
|
||||||
|
|
||||||
|
const t = new Date().getTime() - s
|
||||||
|
|
||||||
|
console.log(`${suite}:`, t, 'ms')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
run()
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import { defaultOptions as options } from '../src/shared/constants'
|
||||||
|
import generateServerInjector from '../src/server/generateServerInjector'
|
||||||
|
|
||||||
|
export default function v2(metaInfo) {
|
||||||
|
// generate server injectors
|
||||||
|
for (const key in metaInfo) {
|
||||||
|
if (metaInfo.hasOwnProperty(key)) {
|
||||||
|
metaInfo[key] = generateServerInjector('ssr', options, key, metaInfo[key])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let text = ''
|
||||||
|
for (const key in metaInfo) {
|
||||||
|
text += metaInfo[key].text()
|
||||||
|
}
|
||||||
|
|
||||||
|
return `<head>${text}</head>`
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
import Vue from 'vue'
|
||||||
|
import { promisify } from 'util'
|
||||||
|
import LRU from 'lru-cache'
|
||||||
|
import { createRenderer, createBundleRenderer } from 'vue-server-renderer'
|
||||||
|
|
||||||
|
const renderToString = promisify(createRenderer().renderToString)
|
||||||
|
const cachedToString = promisify(createRenderer({
|
||||||
|
cache: new LRU()
|
||||||
|
}).renderToString)
|
||||||
|
|
||||||
|
function renderChilds(h, metaInfo) {
|
||||||
|
const children = []
|
||||||
|
|
||||||
|
Object.keys(metaInfo).forEach(k => {
|
||||||
|
if (Array.isArray(metaInfo[k])) {
|
||||||
|
metaInfo[k].forEach(attrs => {
|
||||||
|
const html = attrs.innerHTML
|
||||||
|
delete attrs.innerHTML
|
||||||
|
children.push(h(k, { attrs }, html))
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (k === 'title') {
|
||||||
|
children.push(h('title', null, metaInfo[k]))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return children
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function v3(metaInfo) {
|
||||||
|
const head = new Vue({
|
||||||
|
render(h) {
|
||||||
|
return h('head', null, renderChilds(h, metaInfo))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return await renderToString(head)
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function v3cached(metaInfo) {
|
||||||
|
const head = new Vue({
|
||||||
|
render(h) {
|
||||||
|
return h('head', null, renderChilds(h, metaInfo))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return await cachedToString(head)
|
||||||
|
}
|
||||||
|
|
||||||
|
const head = new Vue({
|
||||||
|
data: {
|
||||||
|
metaInfo: {}
|
||||||
|
},
|
||||||
|
render(h) {
|
||||||
|
const metaInfo = this.metaInfo
|
||||||
|
return h('head', null, renderChilds(h, metaInfo))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
export async function v3binding(metaInfo) {
|
||||||
|
head.metaInfo = metaInfo
|
||||||
|
return await cachedToString(head)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user