惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Last Watchdog
The Last Watchdog
博客园_首页
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
美团技术团队
小众软件
小众软件
V
V2EX
博客园 - Franky
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
Attack and Defense Labs
Attack and Defense Labs
S
Security Affairs
Simon Willison's Weblog
Simon Willison's Weblog
I
Intezer
T
The Exploit Database - CXSecurity.com
有赞技术团队
有赞技术团队
S
Schneier on Security
人人都是产品经理
人人都是产品经理
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
K
Kaspersky official blog
PCI Perspectives
PCI Perspectives
AI
AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
罗磊的独立博客
O
OpenAI News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The Register - Security
The Register - Security
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
博客园 - 【当耐特】
C
Cisco Blogs
大猫的无限游戏
大猫的无限游戏
Help Net Security
Help Net Security
Google DeepMind News
Google DeepMind News
S
Securelist
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Proofpoint News Feed
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
L
LangChain Blog
SecWiki News
SecWiki News
博客园 - 叶小钗
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V2EX - 技术
V2EX - 技术
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
L
LINUX DO - 热门话题
Cisco Talos Blog
Cisco Talos Blog

前端开发

万能的 AI,有什么实现高保真 UI 的途径吗? - V2EX taro 还有人用吗? 是不是要黄了,官网证书到期了都没人管,而且物料市场都打不开了 - V2EX Better Auth 也被 Vercel 收购了 - V2EX “前端大神在大厂里写广告”是真的吗? - V2EX V2EX › 登录 前端转 ai-agent 有什么好的课程么 angular21 好用吗? - V2EX 全 AI 开发安卓 ios 双端行业内 BOSS 直聘 APP,求技术方案 前端如何学习 AI?我发现所有文章都是教你怎么写个 agent 或者讲 agent 实现原理什么的,就没有能在日常工作中 提效的吗?比如 skill 怎么搞。怎么在工作中使用各种技巧 3D 全域高清一张图制作,有没有懂行的高手会啊!需求放在下面了 - V2EX 开源了一个 Notion/飞书 风格的编辑器 - V2EX 大家用 uniappx 开发的时候,都选择什么 ui 框架呢 - V2EX 探索了一下 Agent Native 的 UI 应该怎么做,附带项目链接 - V2EX 开发抖音 pc 网页的 100%都是些草包。 - V2EX Solid 作者重新審視 React 做對了的兩件事,以及將會在 Solid 2.0 採用 - V2EX 有大佬认识这是哪个图标库吗? - V2EX 请教关于不发版动态更新 APP 的 LOGO 方案 - V2EX 关于如何正确的在 React 或 Vue 中使用链接 - V2EX 逆向专题:对于 web 端采用 wasm+protobuf 的架构,还有逆向的可能性吗 - V2EX AI 时代你们是怎么开发前端页面的? 有大佬在 qiankun 中结合联邦模块的吗 - V2EX Tailwind CSS 在本周裁员 75% 原因是受 AI 冲击 - V2EX 有没有前端组件实现变量是个标签,其他字是黑色文字的组件库 - V2EX 1.5 小时用 ai 写了个 web 恐怖小游戏 - V2EX 30USD 月度开发预算,前端 er 都在用什么 AI 编程工具? - V2EX 现在有些网站还要求 ie 访问 - V2EX 工作了 5 年以上的前端,无法快速答出 animation、transform、transition 的区别算菜吗? - V2EX 做 WYSIWYG Markdown 编辑器时,我为什么没继续用 zustand,而是写了 Zenith - V2EX 请教一下 AI 如何写前端代码 - V2EX 最近搞了个 Vue 的 babel 插件,可以让 Vue 的 jsx 语法更加接近 React - V2EX 想在写的免费 chrome 插件中增加内购,求赚到钱的大佬解答 - V2EX V2EX 这种线框叫什么风格的 UI - V2EX Canvas FPS 只有 10 几 求助 - V2EX Antd V6 版本发布了! - V2EX 你是 AI 的主人,还是 AI 的 Debugger? - V2EX 想把一个图片变成动图用什么模型好啊 - V2EX 求一份转正答辩 PPT 模板 - V2EX 有没有大佬知道小红书 小程序 开放能力 open-type="contact" 打开客服会话 咋用? - V2EX 开发求助,小白要做前端是不是使用 electron - V2EX 询问下钉钉 H5 应用样式兼容性问题 - V2EX Q: 我是真的好奇,这网站(lusion)是怎么做的,都用了什么东西? - V2EX 学习网页富文本编辑器有什么比较好的资料吗 - V2EX 前端样式兼容求助 - V2EX 求助: Figma Make 项目的交互代码如何让 ai 编辑器读取到? - V2EX 困惑,网站长期 GSC 不被收录,谁能帮帮我 - V2EX 为了不误导别人,我决定还是发贴说明下 - V2EX 最適合 ai 的前端技術選擇 有建議嗎? - V2EX 如何界定前端和后台的工作职责。 - V2EX rslib 有没有类似 rollup-plugin-serve 的插件。。 - V2EX uni-app H5 项目想复用到微信小程序,多端适配与多项目复用怎么设计? - V2EX 关于 AI 助力脚本(Userscript)开发 - V2EX 世界观崩塌了,十年老前端今天突然发现 CSS 里的 green 不是纯绿 - V2EX 我终于找到了 safari26 工具栏背景色的识别方法 - V2EX LeetCode 的一个算法帮我解决了工作棘手问题 - V2EX Vue ECharts 8.0 发布了 mantine UI 库和 shadcn UI 库 选哪个? 大家现在让 AI 写代码,交互页面,一般让用什么 JavaScript 呢?原生, Svelte,还是 Vue,还是其他 webpack 开发静态页面
Next.js 多语言路由性能优化:从 5.8s LCP 到极致体验 - V2EX
hazellin549 · 2026-02-20 · via 前端开发

为什么你的英文版比中文版慢 3 倍?


01 一个诡异的性能问题

上周,我在检查网站的性能报告时,发现了一个诡异的现象:

语言版本 LCP CLS
中文 (默认) 2.3s ✅ 0.06 ✅
英语 /en/ 5.8s ❌ 0.68 ❌

同一套代码,同一个页面,为什么英文版比默认语言慢了整整 2.5 倍?

这篇文章记录我的排查过程和最终解决方案。


02 先搞清楚 LCP 是什么

LCP (Largest Contentful Paint) 是 Core Web Vitals 的核心指标之一。

简单说,它测量的是:页面主要内容出现的时间

Google 的标准是:

  • < 2.5s — 良好
  • ⚠️ 2.5s - 4s — 需要改进
  • > 4s — 较差

我的英文版 5.8s ,妥妥的「红牌警告」。


03 第一个嫌疑人:缓存策略

在 Next.js 的多语言路由中,默认语言和非默认语言的处理逻辑是不同的。

默认语言: example.com/product
非默认语言: example.com/en/product

我检查了 CDN 缓存命中率:

路由 缓存命中率
/product 89% ✅
/en/product 31% ❌

问题出现了:非默认语言的缓存命中率低得可怜。

原因分析

Next.js 默认生成的 Cache-Control 头对于动态路由是这样的:

Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate

而我的多语言路由 /[locale]/... 被识别为「动态路由」,导致 CDN 几乎不缓存。

解决方案

next.config.js 中显式配置缓存策略:

async headers() {
  return [
    {
      source: '/:locale(en|es|fr)/:path*',
      headers: [
        {
          key: 'Cache-Control',
          value: 'public, s-maxage=3600, stale-while-revalidate=86400',
        },
      ],
    },
  ];
}

效果:缓存命中率从 31% 提升到 **85%**。


04 第二个嫌疑人:关键资源预加载

优化缓存后,LCP 从 5.8s 降到了 3.9s ,但还是不达标。

Lighthouse 报告给了一个提示:

⚠️ Preload key requests
Fonts and critical CSS are not being preloaded

我检查了页面的资源加载顺序:

1. HTML 文档
2. 等待解析...
3. 发现 CSS 引用
4. 下载 CSS
5. 发现字体引用
6. 下载字体
7. 渲染文字 ← LCP 发生在这里

问题是:字体要等到 CSS 加载完才开始下载,形成了瀑布流。

解决方案

<head> 中添加预加载标签:

<Head>
  {/* 预加载关键字体 */}
  <link
    rel="preload"
    href="/fonts/inter-variable.woff2"
    as="font"
    type="font/woff2"
    crossOrigin="anonymous"
  />
  
  {/* 预加载关键 CSS */}
  <link
    rel="preload"
    href="/_next/static/css/app.css"
    as="style"
  />
</Head>

效果:LCP 从 3.9s 降到 2.7s


05 第三个嫌疑人:图片加载

还差 0.2s 才能达到 2.5s 的「良好」标准。

Lighthouse 又给了提示:

⚠️ Largest Contentful Paint element
<img src="/hero-banner.png" ...>

原来 LCP 元素是首屏的大图。

问题

图片使用了 Next.js 的 <Image> 组件,默认是懒加载的:

<Image src="/hero-banner.png" ... />
// 默认 loading="lazy"

但对于首屏图片,懒加载反而拖慢了显示速度。

解决方案

对 LCP 元素禁用懒加载,并添加 priority 属性:

<Image
  src="/hero-banner.png"
  priority  // 关键!
  loading="eager"
  ...
/>

效果:LCP 从 2.7s 降到 2.2s


06 CLS 问题:页面为什么在「抖动」?

解决完 LCP ,再看 CLS 。

CLS (Cumulative Layout Shift) 测量的是:页面元素的意外位移

我的英文版 CLS 是 0.68 ,而标准是 < 0.1 。

打开页面慢动作回放,发现了两个问题:

问题 1:字体加载导致的「闪烁」(FOUT)

页面先用系统字体渲染,字体加载完后「闪」一下变成自定义字体。

由于两种字体的 metrics 不同,文字位置发生偏移。

解决方案:使用 font-display: optional

@font-face {
  font-family: 'Inter';
  src: url('/fonts/inter-variable.woff2') format('woff2');
  font-display: optional; /* 如果字体没及时加载,就不换了 */
}

问题 2:图片没有指定尺寸

// ❌ 错误写法
<img src="/card.png" />

// ✅ 正确写法
<img src="/card.png" width={300} height={400} />

Next.js 的 <Image> 组件会自动处理这个问题,但我有几个地方用了原生 <img>

效果:CLS 从 0.68 降到 0.04


07 优化前后对比

指标 优化前 优化后 改善
LCP 5.8s ❌ 2.2s ✅ -62%
CLS 0.68 ❌ 0.04 ✅ -94%
缓存命中率 31% 85% +174%
Lighthouse 52 91 +75%

08 核心经验总结

多语言路由的性能优化,核心要点:

🎯 缓存策略

非默认语言路由容易被当作「动态页面」而跳过缓存。显式配置 Cache-Control

🎯 预加载关键资源

字体和关键 CSS 形成瀑布流是 LCP 的常见杀手。<link rel="preload"> 打破瀑布。

🎯 LCP 元素优先加载

首屏图片不要懒加载。priority 属性告诉 Next.js 这是关键资源。

🎯 防止布局偏移

  • 图片必须指定尺寸
  • 字体使用 font-display: optionalswap + 预加载
  • 避免动态插入内容到首屏

09 一个容易忽略的细节

最后分享一个容易忽略的点:

不同语言版本的字体 metrics 可能不同。

比如中文字体通常比英文字体更高,如果你用同一套 CSS ,line-height 可能导致不同语言的布局高度不一致。

我的做法是为每种语言定义 bodyfont-family 后备栈:

/* 英语/西班牙语 */
body[lang="en"], body[lang="es"] {
  font-family: 'Inter', system-ui, sans-serif;
}

/* 中文 */
body[lang="zh"] {
  font-family: 'Inter', 'PingFang SC', 'Microsoft YaHei', sans-serif;
}

10 写在最后

性能优化是一个「挤牙膏」的过程:

  • 第一轮优化(缓存):5.8s → 3.9s
  • 第二轮优化(预加载):3.9s → 2.7s
  • 第三轮优化(图片):2.7s → 2.2s

每一轮看起来改动不大,但累积下来效果惊人。

如果你的多语言网站也有性能问题,不妨按这个顺序排查:

  1. 缓存是否生效?
  2. 关键资源是否预加载?
  3. LCP 元素是否优先加载?
  4. 有没有布局偏移?

希望这篇文章对你有帮助!