Gatsby 的热重载和开发服务器通过在文件更改时自动刷新内容,无需完全重新加载页面,从而提供了无缝的开发体验。此系统是 Gatsby 开发工作流的核心,可在构建站点时提供实时反馈。
有关开发相关的 CLI 命令的信息,请参阅 CLI 和命令。有关开发环境中的错误处理信息,请参阅 错误处理。
开发服务器和热重载架构由几个相互关联的组件组成,它们协同工作以提供开发体验。
来源:packages/gatsby/src/commands/develop-process.ts77-152 packages/gatsby/src/utils/start-server.ts67-887 packages/gatsby/src/utils/websocket-manager.ts31-233
运行 gatsby develop 时,会发生以下初始化序列
服务器初始化过程
develop-process.ts 模块创建一个 Express 应用并初始化一个状态机startServer()startServer() 使用热模块替换配置 webpack来源:packages/gatsby/src/commands/develop-process.ts77-152 packages/gatsby/src/utils/start-server.ts67-180 packages/gatsby/src/services/start-webpack-server.ts24-67
在客户端,热重载由几个关键组件处理
客户端实现
app.js 是开发 bundle 的入口点socketIo.js 与服务器建立 WebSocket 连接DevLoader 类通过特定于开发的函数扩展了基础的 BaseLoader来源:packages/gatsby/cache-dir/app.js1-207 packages/gatsby/cache-dir/dev-loader.js30-254
当文件更改时,会发生以下事件序列
不同类型的更新会触发特定的处理程序
来源:packages/gatsby/src/services/start-webpack-server.ts40-128 packages/gatsby/src/utils/websocket-manager.ts156-230 packages/gatsby/cache-dir/dev-loader.js56-254
WebsocketManager 类负责处理服务器和客户端之间的实时通信
WebsocketManager
来源:packages/gatsby/src/utils/websocket-manager.ts31-233 packages/gatsby/src/utils/start-server.ts854-886
DevLoader 通过特定于开发的增强功能扩展了 Gatsby 的基础加载器
DevLoader
来源:packages/gatsby/cache-dir/dev-loader.js30-254 packages/gatsby/cache-dir/loader.js112-317
开发过程由一个状态机管理,该状态机协调开发的各个阶段
状态机
来源:packages/gatsby/src/state-machines/develop/index.ts23-584 packages/gatsby/src/state-machines/develop/actions.ts1-227
Gatsby 在开发服务器重启之间持久化状态以提高性能
持久化机制
来源: packages/gatsby/src/redux/index.ts132-158 packages/gatsby/src/redux/persist.ts214-266 packages/gatsby/src/services/initialize.ts296-459
Gatsby 包含多个标志以增强开发体验
| 标志名称 | 环境变量 | 描述 |
|---|---|---|
| FAST_DEV | GATSBY_EXPERIMENTAL_FAST_DEV | 启用所有旨在提高开发服务器启动时间的实验性功能 |
| DEV_SSR | GATSBY_EXPERIMENTAL_DEV_SSR | 在开发过程中服务器端渲染页面,以帮助检测 SSR 错误 |
| PRESERVE_FILE_DOWNLOAD_CACHE | GATSBY_EXPERIMENTAL_PRESERVE_FILE_DOWNLOAD_CACHE | 在重启之间保留下载的文件以加快开发速度 |
这些标志可以通过以下方式启用
来源: packages/gatsby/src/utils/flags.ts80-155 packages/gatsby/src/services/initialize.ts40-61
开发服务器公开了几个特殊路由
| 路由 | 目的 |
|---|---|
/__open-stack-frame-in-editor | 在编辑器中打开特定行处的源文件 |
/__original-stack-frame | 返回转译代码的原始源位置 |
/__file-code-frame | 返回特定文件位置的格式化代码框 |
/__refresh | 允许从外部系统触发数据刷新 |
/___graphql | 用于探索和测试 GraphQL 查询的 GraphiQL 界面 |
/page-data/:pagePath/page-data.json | 提供特定页面的页面数据 |
这些路由支持各种开发功能,包括错误报告、调试和数据探索。
来源: packages/gatsby/src/utils/start-server.ts168-261 packages/gatsby/src/utils/start-server.ts262-379 packages/gatsby/src/utils/start-server.ts790-853
当源文件发生变化时,Gatsby 会根据文件类型触发不同的操作
文件监视系统
来源: packages/gatsby/src/utils/start-server.ts865-876 packages/gatsby/src/bootstrap/requires-writer.ts342-383
Gatsby 的热重载和开发服务器通过高效地检测更改并在浏览器中实时更新,提供无缝的开发体验。该系统结合了
这些组件协同工作,创建了一个响应式的开发环境,最大限度地减少构建时间和提高生产力。