【问题标题】:Google PageSpeed Insights showing unused javascript but it is usedGoogle PageSpeed Insights 显示未使用的 javascript 但已使用
【发布时间】:2020-12-07 06:42:21
【问题描述】:

使用了 Javascript,但谷歌页面速度洞察显示它没有被使用。无论如何我可以删除它。我在这里分享PageSpeedInsight报告的屏幕截图。

在上面的截图中你可以看到 8 个 js 文件未被使用。但它正在我的应用程序中使用。

【问题讨论】:

  • 我猜谷歌告诉你页面的开始不需要它?因此,您可以决定仅在第一次使用时才加载它。这并不是说它完全未使用,而是说这些文件中的某些代码未使用。
  • 我想它也告诉你你只使用部分文件。它建议您拆分文件并仅导入您实际需要的块。
  • 您可以动态加载javascript文件。加载滚动文件。并在将它们附加到 head 标签后删除您的事件侦听器
  • “无论如何我可以删除它” - 是的,只需编辑您的标记并删除加载此文件的 <script> 标记。否则,如果需要,请忽略警告。主要问题可能是您正在从 multiple 加载 multiple 文件
  • @DhanushKumarS 你能分享更多关于你如何加载脚本文件的细节吗?以便答案更具体。

标签: javascript google-pagespeed google-pagespeed-insights-api


【解决方案1】:

您可以在滚动时加载脚本文件。当用户开始向下滚动时,您将脚本标签附加到您的头部并再次删除事件侦听器。

仅在开头添加不在视口中的脚本,例如 recaptchas。它们通常位于底部。

function dynamicLoad(url) {
  var script = document.createElement("script");
  script.type = "text/javascript";
  script.src = url;
  document.getElementsByTagName("head")[0].appendChild(script);
}
window.addEventListener("scroll", loadScripts);

function loadScripts() {
  //load here as many dynamic scripts as you want
  dynamicLoad("recaptcha url");
  dynamicLoad("facebook.net url");
  //end ------
  window.removeEventListener("scroll", loadScripts);
}

【讨论】:

  • 我认为我们可以在 DOM 加载完成后加载脚本的其余部分,而不是滚动事件。
  • @ashiish.me 如果您这样做,那么您可以将defer 放在脚本属性上,其行为几乎相同。这不会解决他的问题,它仍然会被视为未使用的 js 脚本
  • 我可以试试这个方法
  • 明白了,这是有道理的。我想知道我是否需要来自 JS 的特定功能,该功能不在视口之外,但不必在渲染时加载。
  • @ashiish.me 是的,recaptchas 之类的东西通常在表单的底部
【解决方案2】:

注意:这个答案是由于混淆。 OP 没有使用 React,但报告中包含了 React 示例。这可能对其他人有帮助 无论如何。

如果您的组件是动态加载的(仅在用户请求之后)。

您可以按照报告中的建议使用React.lazy() 进行代码拆分,这样您就不会在不需要时加载大包。

此解决方案适用于非 SSR。

之前:

import ComponentB from './ComponentB';

function ComponentA() {
  return (
    <>
        {/* After certain action probably like routes switch or any? */}
        <ComponentB />
    </>
  );
}

之后:

import React, { lazy } from 'react';
const ComponentB = lazy(() => import("./ComponentB.js"));

function ComponentA() {
  return (
    <>
        {/* After certain action probably like routes switch or any? */}
        <ComponentB />
    </>
  );
}

参考:https://reactjs.org/docs/code-splitting.html

【讨论】:

  • 感谢您的回答。该应用程序是使用 Django BTW 开发的。绝对你的回答有助于做出反应。
  • 由于报告中的建议,我认为您可能已将 React 用于前端。无论如何,您使用的是默认的 Django 模板吗?您可以做的是,延迟加载渲染页面所不需要的脚本。
猜你喜欢
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 2019-07-09
  • 2021-07-17
  • 1970-01-01
  • 2020-09-09
  • 2016-06-30
相关资源
最近更新 更多