【发布时间】:2021-06-01 08:16:37
【问题描述】:
我正在一个项目中使用 Next JS,并且我正在使用 Google 的 Page Speed Insights 工具进行一些优化。对我的网站性能造成负面影响的主要因素之一是 3rd 方脚本,主要是 Google Tag 脚本(它也加载了我的 Google Analytics)和 Google maps API 脚本。到目前为止,我已经尝试了几种方法来抵消这两个库的加载,但我仍然从该工具中收到以下消息:
删除未使用的 JavaScript
https://maps.googleapis.com/maps/api/js?key=asdafsafasafasfasf&libraries=places&language=en®ion=US
(maps.googleapis.com)
https://www.googletagmanager.com/gtag/js?id=UA-123123-2
(www.googletagmanager.com)
我需要将这些脚本加载到网站的任何地方,因此我尝试延迟加载脚本,直到页面上的所有其他内容加载完毕。这是我最初拥有的:
_document.js
import Document, { Head, Main, NextScript, Html } from "next/document";
export default class MyDocument extends Document {
static async getInitialProps(ctx) {
const initialProps = await Document.getInitialProps(ctx);
return { ...initialProps };
}
render() {
return (
<Html lang="en">
<Head>
<script
defer
src={`https://www.googletagmanager.com/gtag/js?id=UA-123123-2`}
/>
<script
defer
src="https://maps.googleapis.com/maps/api/js?key=asdafsafasafasfasf&libraries=places&language=en®ion=US"
/>
<script
dangerouslySetInnerHTML={{
__html: `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-123123-2');
`,
}}
/>
</Head>
<body>
<Main />
<NextScript />
</body>
</Html>
);
}
}
如您所见,我只是像往常一样使用 defer 属性加载脚本。但是,使用这种方法,谷歌页面速度见解仍然会给我同样的信息。然后我尝试了一种不同的方法,在 Next JS 中使用了一个名为 ScriptLoader 的实验性组件,该组件旨在允许人们推迟脚本。这是该组件的链接:
https://github.com/vercel/next.js/discussions/18172
这是我的实现:
_app.js
import App from "next/app";
import ScriptLoader from "next/dist/client/experimental-script.js";
export default class NextApp extends App {
render() {
return (<>
<ScriptLoader
strategy="defer"
src="https://www.googletagmanager.com/gtag/js?id=UA-123123-2"
/>
<ScriptLoader
strategy="defer"
src="https://maps.googleapis.com/maps/api/js?key=asdafsafasafasfasf&libraries=places&language=en®ion=US"
/>
</>)
}
}
它仍然给我同样的错误信息。我不知道现在该尝试什么!有没有其他人遇到过这个问题并找到了解决方法?
谢谢
【问题讨论】:
-
如果我错了,请纠正我,但推迟脚本加载不会帮助您处理那些外部脚本中未使用的 JavaScript。无论何时加载脚本,您仍然会使用其中的相同代码。
-
在页面加载速度的背景下,我想 Google 并不关心在 DOM 完成加载其他所有内容后加载的脚本,不是吗?
-
在这种情况下,也许您应该尝试使用
async属性? -
我试过异步,但不幸的是它有同样的效果
-
Analytics 在尽早加载时效果最佳。此外,所有分析都会损害性能,因此它始终是一种妥协。这里重要的是用户在每个域中加载此脚本一次。如果可能的话,您可以使用更轻量级的分析工具,例如 Fathom
标签: javascript reactjs next.js