You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js使用yarn export部署后new Date返回缓存值如何解决

问题根本原因

你使用yarn export做Next.js静态站点导出时,所有页面的HTML会在构建阶段预先生成并固化,所有构建阶段执行的JS逻辑(包括组件内直接调用的new Date()、useState的初始值)都会在打包时运行,返回的自然是构建当日的日期,这个结果会直接写死在静态HTML文件里。

现有修改版未生效的原因

你加了useEffect的代码逻辑本身是正确的,useEffect只会在客户端浏览器完成页面挂载后才运行,正常会触发一次状态更新把日期替换成访问者的当前实时日期。如果仍看到旧日期,通常是两个原因:

  • 页面刚加载时你看到的是静态HTML里固化的旧日期,useEffect触发更新有极短的延迟,感知不明显的话可以通过初始占位符的方式避免旧日期露出
  • 浏览器缓存了旧的静态资源,强制刷新页面清理缓存即可验证
最终修复代码

调整后的代码可以同时避免旧日期闪现和hydration不匹配警告:

import { useEffect, useState } from 'react';

export function MyComponent() {
  // 初始值设为null,避免构建阶段生成旧日期
  const [now, setNow] = useState(null);

  useEffect(() => {
    // 仅在客户端环境设置当前真实日期
    setNow(new Date());
    // 如需页面不刷新跨天也自动更新,可保留下面的定时器,不需要直接删除即可
    const updateTimer = setInterval(() => {
      setNow(new Date());
    }, 60000); // 每分钟更新一次

    return () => clearInterval(updateTimer);
  }, []);

  // 客户端挂载前显示占位内容,避免hydration mismatch
  if (!now) return <div>-/-/----</div>;

  return (
    <div>{now.getDate()}/{now.getMonth() + 1}/{now.getFullYear()}</div>
  );
}

内容的提问来源于stack exchange,提问作者Germano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:36:04