NuxtJS 在渲染页面时,只有固定几个变量,比如:APP、ENV、HEAD 等。而这些远远满足不了自定义的需求。
举个现实的场景:项目中,有些页面使用灵犀系统上报埋点,有些页面不使用,如果把灵犀代码放到统一的页面入口中,对于不使用灵犀的页面而言,反而增加了一个多余的网络请求,影响页面性能。
我们的诉求是,能根据页面路径,动态的追加灵犀代码。
这就需要借助 NuxtJS 提供的 Hooks 来支持。在 nuxt.config.js 增加 hooks ,代码如下:
hooks: {
'vue-renderer': {
'ssr:templateParams': (templateParams, renderContext) => {
const { nuxt } = renderContext;
const { routePath } = nuxt || {};
const whiteList = [
'/light-portal.html',
'/light-portal/material-detail.html',
'/light-portal/material.html',
];
// 只有特定页面才加入灵犀
const shouldAppendLX = whiteList.includes(routePath);
// 追加 IS_APPEND_LX 全局变量,便于在页面中使用
Object.assign(templateParams, {
IS_APPEND_LX: shouldAppendLX,
});
},
},
}
在 app.html 使用 「IS_APPEND_LX」变量动态输出 灵犀脚本:
{% if (IS_APPEND_LX) { %}
<script src="//lx.meituan.net/lx.5.min.js"></script>
<script>
!function(n,t,e){if(n["_MeiTuanALogObject"]=e,!n[e]){var u=function(){let n=function(){let t=function(){t.q.push([arguments,+new Date])};return t.q=[],n.q.push([arguments,t]),t};return n.q=[],n.t=+new Date,u.q.push([arguments,n]),n};u.q=u.q||[],u.l=+new Date,n[e]=u}}(window,document,"LXAnalytics");
LXAnalytics('config', {
defaultCategory:'cs_smart_portal',
defaultCid: 'c_cs_smart_portal_ntwfxrrs',
isSPA: false,
isDev: {{ process.env.ENV !== 'prod' }},
onWebviewAppearAutoPV: false,
onVisibilityChangeAutoPV: false,
onWindowFocusAutoPV: false,
onVCGap: 2,
nativeReport:'off',
use_post: true,
});
</script>
{% } %}