NuxtJS 在使用服务端渲染时,会自动往HTML注入当前页面使用的数据,对于只有渲染的页面,在客户端根本用不到这些数据,如果是列表页面,这些数据会偏大,导致整个页面体积变大,造成传输耗时。
诉求是:把用不到的这些数据在页面渲染时去掉。
方案是:利用 NuxtJS 提供的渲染 Hook 解决,代码如下:
hooks: {
'vue-renderer': {
'ssr:templateParams': (templateParams, renderContext) => {
const { APP } = templateParams;
const { nuxt } = renderContext;
const { ...state } = nuxt;
const { config } = state;
// 去掉 window.__NUXT__ 没有用的信息,只保留环境信息,减少页面体积
// 环境信息是必须的,不能去掉
const PATTERN = /<script>window\.__NUXT__=([\s\S]*?)<\/[^>]*script>/i;
const replaceHTML = APP.replace(PATTERN, () => {
const stateScript = `window.__NUXT__=${devalue({
config,
})};`;
return `<script>${stateScript}</script>`;
});
Object.assign(templateParams, {
APP: replaceHTML,
});
},
},
},