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

如何在Next.js 13中适配电商多语言动态路由结构?

在Next.js中匹配多语言多级分类及产品详情的动态路由方案

根据你提供的URL结构,我们可以利用Next.js的动态路由特性(支持可选catch-all和多段动态参数)来实现匹配,以下是具体方案:

一、路由目录结构设计(App Router 推荐)

Next.js App Router通过文件目录直接映射路由,按以下结构创建文件即可覆盖所有URL场景:

app/
  [lang]/
    layout.js          # 语言级布局,可做语言合法性校验
    [category1]/
      page.js          # 匹配 单语言/一级分类(如/en-us/categoryLevel1)
      [[...category2]]/
        page.js        # 匹配 单语言/一级分类/二级分类(如/en-uk/categoryLevel1/categoryLevel2)
      [productId]/
        page.js        # 匹配 单语言/一级分类/产品ID(如/en-us/categoryLevel1/abc-1234567788)

路由优先级说明

Next.js会优先匹配更具体的路由段,因此产品详情的[productId]/page.js会优先于二级分类的[[...category2]]/page.js,不会出现路由冲突。

二、各页面组件实现示例

1. 语言布局([lang]/layout.js)

用于校验语言合法性,拦截无效语言访问:

export default function LangLayout({ children, params }) {
  // 定义支持的语言列表
  const validLangs = ['en-us', 'en-ca', 'en-uk', 'fr-fr'];
  
  if (!validLangs.includes(params.lang)) {
    return <div>404: 不支持的语言</div>;
  }
  
  return <div className="lang-container">{children}</div>;
}

2. 一级分类列表页([category1]/page.js)

获取语言和一级分类参数,渲染对应列表:

export default function CategoryLevel1Page({ params }) {
  const { lang, category1 } = params;
  
  // 这里根据lang和category1请求后端数据
  return (
    <div>
      <h1>{category1} 分类列表({lang})</h1>
      {/* 产品列表内容 */}
    </div>
  );
}

3. 二级分类列表页([[...category2]]/page.js)

可选catch-all路由会将二级分类放入数组中,取出后使用:

export default function CategoryLevel2Page({ params }) {
  const { lang, category1, category2 } = params;
  // category2是数组,取第一个元素即为二级分类名称
  const subCategory = category2?.[0];
  
  // 请求对应二级分类的数据
  return (
    <div>
      <h1>{category1} > {subCategory} 分类列表({lang})</h1>
      {/* 产品列表内容 */}
    </div>
  );
}

4. 产品详情页([productId]/page.js)

获取产品ID参数,可额外校验ID格式确保合法性:

export default function ProductDetailPage({ params }) {
  const { lang, category1, productId } = params;
  
  // 校验产品ID格式(匹配xxx-数字的结构)
  const productIdRegex = /^[a-zA-Z]+-\d+$/;
  if (!productIdRegex.test(productId)) {
    return <div>404: 无效的产品ID</div>;
  }
  
  // 请求对应产品的详情数据
  return (
    <div>
      <h1>产品详情:{productId}({category1} | {lang})</h1>
      {/* 产品详情内容 */}
    </div>
  );
}

三、Pages Router 兼容方案(旧版本Next.js)

如果使用Pages Router,目录结构类似,通过文件命名实现动态路由:

pages/
  [lang]/
    [category1].js          # 一级分类列表
    [category1]/
      [[...category2]].js   # 二级分类列表
      [productId].js        # 产品详情

以产品详情页为例,通过getServerSideProps获取参数:

export default function ProductDetailPage({ lang, category1, productId }) {
  // 渲染逻辑同App Router
}

export async function getServerSideProps(context) {
  const { lang, category1, productId } = context.params;
  // 可在此处做参数校验、数据请求
  return {
    props: { lang, category1, productId }
  };
}

四、优化建议

  • 静态生成:如果路由可提前预知,在App Router中使用generateStaticParams预渲染所有路由,提升页面加载速度
  • 统一数据请求:可在语言布局或分类组件中封装数据请求逻辑,避免重复代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:17:25