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

Next.js中导入JSON/TS静态数据是否必须使用getStaticProps?

在Next.js中渲染静态JSON/TS数据:直接导入vs getStaticProps

核心结论

你完全可以直接导入JSON/TypeScript静态文件来渲染数据,不是必须使用getStaticProps。两种方式各有适用场景,具体选择取决于你的数据规模和需求。


1. 直接导入静态文件(你的当前写法)

这种方式适合数据量小、构建后不会变更的场景,Next.js在构建阶段会将这些数据直接打包进页面组件中,代码简洁直观。

修正你代码中的问题

你的代码存在几个语法错误,需要调整:

  • projects.tsx:数组类型定义语法错误,且两个项目的id重复(会导致map时key冲突),建议改为:
// data/projects.ts
interface Project {
  id: string;
  name: string;
  title: string;
  previewImg: string;
}

const projects: Project[] = [
  {
    id: "6853939",
    name: "Project 01",
    title: "Title 01 ",
    previewImg: "/images/projectThumbnails/image01.jpg",
  },
  {
    id: "6853940", // 修改为唯一id
    name: "Project 02",
    title: "Title 02 ",
    previewImg: "/images/projectThumbnails/image02.jpg",
  }
];

export default projects;
  • names.json:最后一个对象末尾的多余逗号会导致JSON解析失败,需要删除:
{
  "names": [
    { "name": "Full Name 01", "age": 34 },
    { "name": "Full Name 02", "age": 22 }
  ]
}

直接导入的正确用法

修正后你的index.tsx可以正常工作:

import projects from "../data/projects";
import names from "../data/names.json";

const IndexPage = () => {
  return (
    <>
      <div>
        {projects.map((project) => (
          <div key={project.id}>{project.title}</div>
        ))}
      </div>
      <div>
        {names.names.map((person) => (
          <div key={person.name}>{person.name}</div>
        ))}
      </div>
    </>
  );
};

export default IndexPage; // 注意:你原来的代码漏了导出组件

2. 什么时候需要用getStaticProps?

如果出现以下情况,建议使用getStaticProps:

  • 数据量较大:直接导入会增加客户端JS bundle的体积,影响页面加载速度。getStaticProps会在构建时获取数据,仅将渲染后的HTML发送给客户端,不会把原始数据打包进客户端JS。
  • 数据需要动态生成/读取:比如从文件系统读取多个文件、或者从外部静态API拉取数据(即使数据是静态的)。
  • 需要增量静态再生(ISR):如果后续需要在不重新构建整个应用的情况下更新页面数据,getStaticProps配合revalidate参数可以实现增量更新。

使用getStaticProps的示例

把你的代码改成getStaticProps写法:

import type { GetStaticProps } from "next";

interface IndexPageProps {
  projects: typeof import("../data/projects").default;
  names: typeof import("../data/names.json").default;
}

const IndexPage = ({ projects, names }: IndexPageProps) => {
  return (
    <>
      <div>
        {projects.map((project) => (
          <div key={project.id}>{project.title}</div>
        ))}
      </div>
      <div>
        {names.names.map((person) => (
          <div key={person.name}>{person.name}</div>
        ))}
      </div>
    </>
  );
};

export const getStaticProps: GetStaticProps<IndexPageProps> = async () => {
  // 直接导入数据
  const projects = await import("../data/projects").then((mod) => mod.default);
  const names = await import("../data/names.json").then((mod) => mod.default);

  return {
    props: {
      projects,
      names,
    },
    // 如果需要ISR,添加revalidate参数:
    // revalidate: 60, // 60秒后重新生成页面
  };
};

export default IndexPage;

总结

  • 直接导入:适合小体量、固定不变的静态数据,写法简单。
  • getStaticProps:适合大数据量、需要动态读取数据或支持ISR的场景,性能更优且更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:18:38