静态生成的 Next.js 页面中的动态 HTML lang 属性

2023-12-28

我正在 Next.Js 项目中开发多语言静态登录页面。 我的目标是具有以下结构:

  • / -> 英文主页
  • /de -> 德语主页
  • /it -> 意大利语主页

我按以下方式构建它:

页面/index.js

export default function Home() {
  return <div>English Homepage</div>
}

页面/de.js

export default function Home() {
  return <div>German page</div>
}

为了使网站可以访问,我想相应地设置 html lang。

页面/_document.js

class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const initialProps = await Document.getInitialProps(ctx)
    return { ...initialProps }
  }

  render() {
    return (
      <Html lang={???}>
        <Head />
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    )
  }
}

如何指定每页的语言? 我尝试过getInitialProps,但这迫使我的网站成为 SSR。


你确实是正确的使用getInitialProps. Unlike getInitialProps在将禁用自动静态优化的普通页面中,getInitialProps in _document.js没有这样的效果。

这是因为Document仅在服务器中呈现。Document's getInitialProps在客户端转换期间或页面静态优化时不会调用函数。更多关于其技术细节 https://nextjs.org/docs/advanced-features/custom-document#caveats

这就是为什么你可以用它来注入langprop 到页面中,仍然可以获得静态优化的好处。

// _document.js
...
static async getInitialProps(ctx) {
  const initialProps = await Document.getInitialProps(ctx);
  const { pathname } = ctx;
  const lang = pathname.startsWith("/de") ? "de" : "en";
  return { ...initialProps, lang };
}
...

为了拥有lang属性也在客户端转换期间更新,您还必须设置一个useRouter挂钩_app.js观察路线变化:

// _app.js
import React, { useEffect } from "react";
import { useRouter } from "next/router";

export default function MyApp({ Component, pageProps }) {
  const { pathname } = useRouter();
  const lang = pathname.startsWith("/de") ? "de" : "en";
  useEffect(() => {
    document.documentElement.lang = lang;
  }, [lang]);

  return <Component {...pageProps} />;
}

我为您创建了这个 CodeSandbox 作为演示。

将其下载到本地计算机并检查代码。后npm install, run npm run build。您将从构建日志中看到“/”和“de”都是静态的。跑步npm start然后查看页面源码,你会看到lang属性在 HTML 中设置正确。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态生成的 Next.js 页面中的动态 HTML lang 属性 的相关文章

随机推荐