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

在Next.js中集成ShareThis遇Hydration失败问题求助

解决Next.js集成ShareThis导致的Hydration不匹配错误

这个错误的核心原因是:服务端渲染时返回的HTML里没有ShareThis脚本生成的交互DOM,但客户端加载脚本后会动态创建这些元素,导致客户端 hydration 时的UI和服务端初始渲染的UI不一致。

以下是两种可行的解决方案:

方案一:在客户端组件中动态加载脚本(推荐)

创建一个仅在客户端运行的ShareThis组件,通过useEffect在客户端加载脚本,避免服务端渲染时的DOM不匹配:

'use client';
import { useEffect } from 'react';

const ShareThis = () => {
  useEffect(() => {
    // 动态创建并加载ShareThis脚本
    const script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = `https://platform-api.sharethis.com/js/sharethis.js#property=${process.env.NEXT_PUBLIC_SHARETHIS_PROPERTY_ID}&product=sop`;
    script.async = true;
    script.defer = true;
    document.body.appendChild(script);

    // 组件卸载时清理脚本
    return () => {
      if (script.parentNode) {
        script.parentNode.removeChild(script);
      }
    };
  }, []);

  // ShareThis的容器元素,脚本加载后会自动渲染按钮
  return <div className="sharethis-inline-share-buttons"></div>;
};

export default ShareThis;

之后在需要展示分享按钮的页面或组件中导入并使用这个ShareThis组件即可。

方案二:修改_document.tsx中的脚本加载方式

如果你坚持要在_document.tsx中加载脚本,可以使用Next.js的<Script>组件(需Next.js 11+),并指定strategy="lazyOnload"策略,确保脚本仅在客户端空闲时加载,避免干扰服务端渲染:

import { Html, Head, Main, NextScript } from "next/document";
import Script from 'next/script';

const Document = () => (
  <Html>
    <Head>
      <Script
        type="text/javascript"
        src={`https://platform-api.sharethis.com/js/sharethis.js#property=${process.env.NEXT_PUBLIC_SHARETHIS_PROPERTY_ID}&product=sop`}
        strategy="lazyOnload"
      />
    </Head>
    <body>
      <Main />
      <NextScript />
    </body>
  </Html>
);

export default Document;

注意:这种方式仍需确保ShareThis生成的DOM元素不在服务端渲染的内容中,否则还是可能触发hydration错误,因此方案一更稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:25:26