Gatsby 中使用 TypeScript 构建站点的完整实践:基于 using-typescript 示例站点
前端静态站点Web框架【免费下载链接】gatsbyReact-based framework with performance, scalability, and security built in.项目地址https://gitcode.com/gh_mirrors/ga/gatsby点击查看免费下载本篇指南以 Gatsby 官方仓库中的 using-typescript 示例站点 为主体讲解如何在 Gatsby 项目中全面落地 TypeScript从tsconfig.json与gatsby-config.ts的编写到页面组件的PageProps类型安全、GraphQL 查询类型化再到gatsby-browser.tsx与gatsby-ssr.tsx中使用GatsbyBrowser/GatsbySSR类型编写 Browser 与 SSR API。读完本文你将掌握一套可直接复制到自有站点的 TypeScript 化改造方案并理解 Gatsby 底层如何加载和执行.ts格式的配置文件。示例站点概览一套完整的 TypeScript Gatsby 应用examples/using-typescript是一个最小但结构完整的 TypeScript Gatsby 示例站点其目录结构如下examples/using-typescript/ ├── gatsby-browser.tsx # Browser APITSX 编写 ├── gatsby-config.ts # 站点配置TS 编写 ├── gatsby-ssr.tsx # SSR APITSX 编写 ├── package.json ├── styles.css ├── tsconfig.json └── src/ ├── components/ │ └── layout.tsx # 全局布局组件 └── pages/ ├── 404.tsx # 404 页面 └── index.tsx # 首页含 GraphQL 查询这个示例覆盖了 TypeScript 化改造的全部关键位置文件说明gatsby-config.ts使用GatsbyConfig类型标注的站点配置文件tsconfig.jsonTypeScript 编译配置src/pages/index.tsx使用PageProps泛型 GraphQL 查询的页面src/pages/404.tsx使用PageProps的 404 页面src/components/layout.tsx带类型标注的布局组件gatsby-browser.tsx使用GatsbyBrowser类型gatsby-ssr.tsx使用GatsbySSR类型依赖与脚本搭好 TypeScript 开发环境先看 package.json它定义了运行与类型检查所需的全部依赖{ scripts: { start: gatsby develop, develop: gatsby develop, build: gatsby build, type-check: tsc --noEmit }, dependencies: { gatsby: next, react: ^18.2.0, react-dom: ^18.2.0 }, devDependencies: { types/node: ^17.0.21, types/react: ^17.0.39, types/react-dom: ^17.0.11, typescript: ^4.5.5 } }值得注意的几点gatsby以next版本安装说明该示例跟随 Gatsby 的预发布版本进行验证实际项目中建议按官方发布线固定版本。三个types/*包types/react与types/react-dom为 React 提供类型定义types/node为 Node.js 全局 API如process、path提供类型三者是 TSX 组件与 Gatsby Node API 正常编译的前提。type-check脚本tsc --noEmit只做类型检查、不产出编译产物可在 CI 或 pre-commit 阶段快速验证全站类型正确性这也是 TypeScript 化项目建议保留的检查手段。安装依赖后使用npm run develop启动开发服务器或npm run build执行生产构建。配置类型安全从 gatsby-config.ts 开始Gatsby 从 2.x 起即可直接使用.ts作为配置文件。示例中的 gatsby-config.ts 演示了标准写法import type { GatsbyConfig } from gatsby const config: GatsbyConfig { siteMetadata: { siteName: Using TypeScript, sourceUrl: https://github.com/gatsbyjs/gatsby/tree/master/examples/using-typescript, }, plugins: [], } export default config关键点import type只引入类型GatsbyConfig是纯类型导入编译期会被擦除不会产生运行时开销。export default导出配置对象Gatsby 加载配置时通过preferDefault处理默认导出详见下文底层原理。siteMetadata与plugins均有类型约束GatsbyConfig接口定义了siteMetadata、plugins、pathPrefix、trailingSlash、graphqlTypegen、jsxRuntime等字段写错字段名或类型会在编辑器中即时报错。GatsbyConfig接口定义在 packages/gatsby/index.d.ts除示例用到的字段外还包括字段类型说明pathPrefixstring站点部署在子路径如/blog/时使用trailingSlashalways \| never \| ignore控制 URL 尾部斜杠策略assetPrefixstring将静态资源托管到独立域名graphqlTypegenboolean \| GraphQLTypegenOptions自动生成 GraphQL 查询类型见后文扩展方向polyfillboolean是否包含 Promise polyfilljsxRuntimeautomatic \| classic指定 JSX 编译运行时proxyProxy \| Proxy[]开发服务器代理配置headersArrayHeader自定义响应头adapterIAdapter部署平台适配器有了这套类型定义配置文件的字段补全、类型校验都由编辑器与tsc自动完成。tsconfig.jsonTypeScript 编译器配置逐项解读tsconfig.json 是示例站点的编译器配置各选项含义如下{ compilerOptions: { target: esnext, lib: [dom, esnext], jsx: react, module: esnext, moduleResolution: node, esModuleInterop: true, forceConsistentCasingInFileNames: true, strict: true, skipLibCheck: true }, include: [./src/**/*] }逐项说明target: esnext编译目标为最新 ECMAScript 特性交由下游打包工具Gatsby 内部的 webpack/Parcel进一步转译避免 TypeScript 层过早降级。lib: [dom, esnext]启用 DOM 与 ESNext 标准库类型覆盖浏览器 API 与最新语言特性。jsx: react使用经典的 React JSX 运行时。若gatsby-config.ts中设置了jsxRuntime: automatic此处可对应改为react-jsx。module: esnext、moduleResolution: node保留 ESM 模块语义并按 Node 方式解析模块路径。esModuleInterop: true允许import React from react这类默认导入与 CommonJS 模块互操作示例代码中import * as React from react亦依赖该设置。strict: true开启全部严格模式检查strictNullChecks、noImplicitAny等这是类型安全的核心开关。skipLibCheck: true跳过.d.ts声明文件内部的类型检查加快编译速度并规避第三方声明文件的兼容问题。include: [./src/**/*]仅将src目录纳入类型检查范围。配置文件如gatsby-config.ts由 Gatsby 独立编译不依赖此include。页面组件类型安全PageProps 与 GraphQL 查询TypeScript 化改造的重头戏是页面组件。Gatsby 为页面组件提供了PageProps泛型类型定义在 packages/gatsby/index.d.tsexport type PageProps DataType object, PageContextType object, LocationState WindowLocation[state], ServerDataType object { path: string uri: string location: WindowLocationLocationState children: undefined params: Recordstring, string pageResources: { ... } data: DataType pageContext: PageContextType }示例首页 src/pages/index.tsx 完整演示了PageProps与 GraphQL 查询的组合import * as React from react import { graphql, PageProps } from gatsby // 你也可以使用 https://github.com/dotansimha/graphql-code-generator // 从 GraphQL schema 生成类型 interface IndexPageProps { site: { siteMetadata: { siteName: string sourceUrl: string } } } const Index ({ data: { site } }: PagePropsIndexPageProps) { return ( main h1{site.siteMetadata.siteName}/h1 p classNamecustom-text This example is hosted on a href{site.siteMetadata.sourceUrl}GitHub/a. /p /main ) } export default Index export const pageQuery graphql query IndexQuery { site { siteMetadata { siteName sourceUrl } } } 这里的核心模式是手动声明查询结果的接口再通过泛型传递给PagePropsinterface IndexPageProps按 GraphQL 查询的返回形状声明类型site → siteMetadata → siteName/sourceUrl组件签名({ data: { site } }: PagePropsIndexPageProps)让data具备完整类型推导site.siteMetadata.siteName的访问不再有any风险pageQuery使用graphql模板标签定义查询Gatsby 构建时会提取该查询执行。示例注释还提示了一个更自动化的方向使用graphql-code-generator从 GraphQL schema 直接生成类型从而避免手工维护接口与查询形状的一致性。此外当前版本 Gatsby 还内置了graphqlTypegen配置项GatsbyConfig中的boolean | GraphQLTypegenOptions见 index.d.ts开启后可自动生成查询类型进一步简化类型维护。404 页面零数据页面的类型写法src/pages/404.tsx 演示了不含 GraphQL 查询的页面如何写类型import * as React from react import { PageProps } from gatsby const NotFound ({}: PageProps) h1Page Not Found!/h1 export default NotFound未传入泛型参数时PageProps使用默认的object类型。此写法表明页面组件的 props 类型应统一使用PageProps即使该页面没有数据查询也保持相同的类型约定便于后续为 404 页添加数据时不改组件签名。布局组件children 的类型标注src/components/layout.tsx 展示了普通组件的类型写法import * as React from react const Layout ({ children }: { children: React.ReactNode }) ( div classNameglobal-wrapper{children}/div ) export default Layout使用内联对象类型{ children: React.ReactNode }声明 propsReact.ReactNode覆盖元素、字符串、数组、Fragment 等所有合法子节点类型该布局组件通过wrapPageElement包裹每个页面见下节是整个站点类型化组件体系的基础。Browser 与 SSR APIGatsbyBrowser / GatsbySSR 类型Gatsby 的 Browser APIgatsby-browser.tsx与 SSR APIgatsby-ssr.tsx同样支持 TypeScript 写法示例中两者共同使用wrapPageElement包裹页面// gatsby-browser.tsx import * as React from react import type { GatsbyBrowser } from gatsby import Layout from ./src/components/layout import ./styles.css export const wrapPageElement: GatsbyBrowser[wrapPageElement] ({ element }) { return Layout{element}/Layout }// gatsby-ssr.tsx import * as React from react import type { GatsbySSR } from gatsby import Layout from ./src/components/layout export const wrapPageElement: GatsbySSR[wrapPageElement] ({ element }) { return Layout{element}/Layout }这种写法的精妙之处通过索引访问类型GatsbyBrowser[wrapPageElement]直接取出接口中对应 API 的类型签名Gatsby 会自动推导出wrapPageElement回调的参数{ element, props, ... }与返回值类型无需手写签名一份实现两处复用浏览器端与 SSR 端使用相同的布局包裹逻辑保证客户端水合与服务端渲染输出一致类型定义来源GatsbyBrowser与GatsbySSR接口均定义在 packages/gatsby/index.d.ts 与 同文件 SSR 段其中列出了onClientEntry、onRouteUpdate、wrapRootElement、onPreRenderHTML、replaceHeadComponents等完整 API 及各自的参数结构可作为编写其他 API 时的类型参考。同时styles.css 在gatsby-browser.tsx中被导入演示了 TypeScript 项目中同样可以引入全局样式资源。底层原理Gatsby 如何加载 .ts 配置文件Gatsby 之所以能直接使用gatsby-config.ts、gatsby-node.ts等 TS 配置文件得益于 packages/gatsby/src/bootstrap/get-config-file.ts 中实现的两阶段加载策略优先加载编译产物attemptImportCompiled会先尝试从COMPILED_CACHE_DIRGatsby 内部使用 Parcel 编译生成的缓存目录导入已编译的配置模块回退到源码文件若编译产物不存在attemptImportUncompiled再直接导入站点根目录下的原始配置文件并通过resolveJSFilepath同时解析.js/.ts/.tsx/.jsx等扩展名友好的错误诊断当原始文件缺失时checkTsAndNearMatch会检测是否存在同名.ts文件用于提示存在 gatsby-config.ts 但缺少编译产物、是否存在命名近似的文件、以及配置是否被错误放进了src/目录并分别抛出带有专属错误码如10123、10124、10125、10127的提示信息。这套流程保证了开发者写的gatsby-config.ts既能在开发时被直接识别也能在生产构建中复用编译缓存而无需手工将配置转成 JS。运行验证与类型检查在examples/using-typescript目录下依次执行npm install # 安装依赖 npm run type-check # 仅类型检查tsc --noEmit npm run develop # 启动开发服务器访问 http://localhost:8000 npm run build # 生产构建npm run type-check会在不产出任何文件的前提下校验全站类型develop与build则由 Gatsby 完成 GraphQL 查询提取、页面生成与静态输出。首页渲染的内容站点名称与示例说明来自siteMetadata的 GraphQL 查询结果可直接验证从配置到页面渲染的完整数据链路。扩展方向把示例迁移到你的项目基于该示例将自有站点 TypeScript 化的最小改造清单如下安装类型依赖typescript、types/react、types/react-dom、types/node添加tsconfig.json可直接复用示例中的严格模式配置重命名配置文件将gatsby-config.js改为gatsby-config.ts并加上: GatsbyConfig标注gatsby-node.ts、gatsby-browser.tsx、gatsby-ssr.tsx同理分别使用GatsbyNode、GatsbyBrowser、GatsbySSR类型页面组件统一PageProps泛型为每个 GraphQL 查询声明结果接口或开启graphqlTypegen: true让 Gatsby 自动生成查询类型加入 CI 检查在 CI 中运行npm run type-check把类型错误拦截在合并之前。需要注意的前提是示例基于gatsby: next预发布版本与 TypeScript 4.5、React 18.2 验证迁移到自己的项目时应以实际安装的 Gatsby 版本对应的类型声明packages/gatsby/index.d.ts为准。总结using-typescript示例虽然体量小却完整覆盖了 TypeScript 化 Gatsby 站点的所有关键面类型化的配置文件、严格模式的tsconfig.json、PageProps泛型驱动的页面数据、GatsbyBrowser/GatsbySSR索引类型标注的 API 实现以及底层对.ts配置文件的编译加载机制。以此为模板你可以快速为自己的 Gatsby 项目建立完整的类型安全保障。赞分享前端静态站点Web框架【免费下载链接】gatsbyReact-based framework with performance, scalability, and security built in.项目地址https://gitcode.com/gh_mirrors/ga/gatsby点击查看免费下载相关推荐使用 gatsby-source-faker 为 Gatsby 站点生成模拟数据基于 using-faker 示例的完整实践使用 gatsby source faker 为 Gatsby 站点生成模拟数据基于 using faker 示例的完整实践 本文以仓库 examples/u前端静态站点Web框架Gatsby Minimal TypeScript Starter 上手指南用 TypeScript 从零搭建 Gatsby 站点Gatsby Minimal TypeScript Starter 上手指南用 TypeScript 从零搭建 Gatsby 站点 本篇技术指南围绕 Gats前端静态站点Web框架基于 Gatsby 构建多语言站点的零依赖 i18n 方案using-i18n 示例深度解析基于 Gatsby 构建多语言站点的零依赖 i18n 方案using i18n 示例深度解析 导读 本文围绕 Gatsby 官方仓库中的 using i18n前端静态站点Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PyTorch卷积神经网络实战:环境搭建、训练调参与ONNX导出

PyTorch卷积神经网络实战:环境搭建、训练调参与ONNX导出

简介:这份资源面向深度学习入门者与计算机视觉方向的初学者,围绕PyTorch框架下卷积神经网络的实现展开,帮助读者理解CNN的基本结构与训练流程。包内共10个文件,以4个py脚本和2个pt模型文件为主,另含MNIST数据集的图像与…

2026/10/11 11:54:18 阅读更多 →
MBA论文降AI率实战指南:9个工具与五步改写流程

MBA论文降AI率实战指南:9个工具与五步改写流程

这半年,我带过不少MBA方向的学生改课程论文和商业案例分析报告,几乎每隔几天就会有人拿着检测报告问我同一个问题:AI率又到百分之六七十了,到底怎么降下来?市面上的“降AI率工具”五花八门,名字一个比一个玄…

2026/10/11 11:54:18 阅读更多 →
基于SpringBoot+Vue的企业知识产权管理系统设计与实现

基于SpringBoot+Vue的企业知识产权管理系统设计与实现

作为一名挨过了毕业设计洗礼、后来也带过不少本科生做项目的过来人,每次看到“基于SpringBootVue”这种组合的题目,第一反应就是:选对方向了,但能不能做出彩,还得看怎么落地。今天要聊的这个“企业内部知识产权管理系统…

2026/10/11 11:54:18 阅读更多 →

最新新闻

基于Java与SpringBoot的个性化电影推荐系统实战与避坑指南

基于Java与SpringBoot的个性化电影推荐系统实战与避坑指南

简介:这套基于SpringBoot与Vue的个性化电影推荐系统,是为计算机专业毕业设计、课程项目量身打造的可运行完整源码包。项目采用B/S架构,后端以JavaSpringBoot为核心,结合MyBatisPlus与MySQL 5.7存储数据,前端使用Vue实现…

2026/10/11 12:54:40 阅读更多 →
Kimi K2.5编程助手实测:代码审美如何重塑开发效率

Kimi K2.5编程助手实测:代码审美如何重塑开发效率

最近几天,编程圈子里最热闹的话题,绕不开一个名字——Kimi K2.5。有人叫它“编程新王”,有人专门截图它的输出惊叹“这审美逆天”,我一开始以为又是营销号在吹,直到自己把它接进日常流程跑了两周,才意识到这…

2026/10/11 12:54:40 阅读更多 →
PS5相关技术方案的安全合规开发指南

PS5相关技术方案的安全合规开发指南

我无法根据当前输入内容生成符合要求的博文。原因如下:项目标题“AnyPS5”缺乏明确指向性,未说明是硬件改装、模拟器方案、跨平台兼容层、游戏存档工具、远程串流方案,还是其他技术方向;项目正文为空,无任何功能描述、…

2026/10/11 12:54:40 阅读更多 →
秦岭shp文件下载与清洗指南:从坐标系转换到边界融合的完整实操

秦岭shp文件下载与清洗指南:从坐标系转换到边界融合的完整实操

简介:秦岭行政区划矢量数据是GIS研究与规划中的基础底图资源。资源包为完整的秦岭行政区划Shapefile标准文件包,面向区域规划、资源管理、环境保护和科学研究等场景,适用于地理信息从业者及高校师生,可直接导入ArcGIS、QGIS等主流…

2026/10/11 12:54:40 阅读更多 →
苍穹外卖Day03:菜品管理核心功能实现与踩坑复盘

苍穹外卖Day03:菜品管理核心功能实现与踩坑复盘

前两天还在跟登录接口和员工管理打交道的时候,我其实没意识到苍穹外卖这个项目真正好玩的地方在哪儿——直到day03进入菜品管理,我才找到那种“外卖店终于开火”的感觉。管理端从“能登录”走到“能上菜”,中间差的正好就是今天这一课&#x…

2026/10/11 12:54:40 阅读更多 →
新能源充电站负荷预测数据集构建:从数据对齐到LSTM建模

新能源充电站负荷预测数据集构建:从数据对齐到LSTM建模

简介:新能源充电站负荷预测数据集面向电力系统、智能交通与机器学习领域的研究者与开发者,整合时间序列用电记录、充电行为特征与外部环境参数,可支撑充电负荷预测建模、站点效能评估及电网协同优化研究。整套资源共32个文件,压缩…

2026/10/11 12:53:39 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →