使用 NextJS 减少 JS 执行时间

Posted

技术标签:

【中文标题】使用 NextJS 减少 JS 执行时间【英文标题】:reduce JS execution time with NextJS 【发布时间】:2020-08-10 11:50:49 【问题描述】:

我有一个网站,我正在尝试优化灯塔页面速度排名。我刚刚从使用 nginx 缓存的 s-s-r 切换到使用 exportPathMapgetInitialPropsnext export(也使用 nginx 缓存)。

感兴趣的特定页面访问量很大

切换到静态后,第一个内容图像会在 2-2.5 秒内出现加载“慢 3G”。但是 JS 的执行时间大概需要 3-6 秒。

问题:

    为什么我使用静态导出时脚本评估需要 3-6 秒,我的印象是它会很快?

    有没有办法优化nextjs JS执行时间?或者可能是 webpack 设置?

【问题讨论】:

当我在禁用 javascript 的情况下打开该页面时,我确实获得了所有内容,脚本在用户可以与页面交互之前加载并执行,但所有静态 html 内容似乎在初始加载时都存在。 也许尝试延迟导入一些您知道可能非常大的模块,以便您的用户可以进行较低的脚本评估。我还建议通过分析开发工具进行一些审计。 我认为这包括所有额外的广告服务脚本,对吧? 是的,这包括广告服务脚本,它们会减慢页面速度,对此我无能为力。 @HMR我确实在除重写器部分之外的所有内容上添加了延迟加载,它没有任何不同,我认为这只是重写器部分的逻辑。看看能不能懒加载一部分,不确定静态导出是否支持懒加载,值得研究。 想尝试使用lazyload吗? 【参考方案1】:

尝试像这样包装一些繁重的模块:

import dynamic from 'next/dynamic';
import PreDynamicState from './PreDynamicState';

const DynamicInnerComp = dynamic(() => import('./MyHeavyModule'), 
  s-s-r: false,
  loading: () => <PreDynamicState />
);

export const MyQuicklyLoadingPage: FC = () => 
  return (
    <div>
      <h1>Welcome to the page!</h1>
      <p>You'll see this text</p>
      <p>Before we load the heavy stuff below</p>
      <p>Large markdown files containing lots of images, etc.</p>
      <DynamicInnerComp />
    </div>
  );
;

我有时也会将它用于无法使用 s-s-r 呈现的模块。

此外,评估尝试使用 Preact 之类的方法是否会提高性能。我不知道使用 nextJS 做到这一点有多容易。我找到了这个https://github.com/developit/nextjs-preact-demo

【讨论】:

嘿查理,我接受了,因为赏金只剩下 30 分钟,但它实际上并没有对我有太大帮助。我实际上已经在 90% 的应用程序上使用了这种动态设置,但没有成功,我将尝试在 10% 的较重部分上使用它,看看会发生什么。至于 preact,我已经考虑过了,但是我在某些位置有一些复杂的钩子逻辑,我认为 preact 不支持这些逻辑,特别是在一页上。我的页面是完全静态的,并且逻辑仅在您使用不应该太重的文本输入区域时运行。任何其他建议表示赞赏:) 可悲的是,我试图用这个来改进它,但什么也没做很多。 @KevinDanikowski 你找到解决这个问题的办法了吗? @Mayank-Dolphin nope :/ 我实现了静态导出但没有成功。我还没有尝试过useStaticProps,我打算在未来尝试。

以上是关于使用 NextJS 减少 JS 执行时间的主要内容,如果未能解决你的问题,请参考以下文章

无法导出带有 getServerSideProps 的 nextjs 页面

带有回调的 Nextjs 侦听器自行执行

如何让 Next JS 动态路由与 RelayJS 一起使用

nextjs - 在开发模式下使用 _error.js

使用 NextJS 路由器时的 useEffect 依赖项

所有 NextJS 页面都有几乎相同的 JS 包大小