今天在 GitHub Trending 上看到一个有意思的项目:Kong/insomnia,一款功能强大的开源跨平台 API 客户端,支持 GraphQL、REST、WebSocket、SSE、gRPC 等几乎所有主流 HTTP 兼容协议。
一、项目概述
Insomnia 是由 Kong 公司主导开发的开源 API 客户端,采用 Electron + React 技术栈构建,支持 macOS、Windows 和 Linux 三大平台。项目在 GitHub 上开源(Apache-2.0 许可证),旨在为 API 开发者提供一站式的调试、设计、测试和模拟能力。
核心特性:
- 多协议支持:GraphQL、REST、WebSockets、Server-Sent Events (SSE)、gRPC 以及任何 HTTP 兼容协议
- API 设计:原生 OpenAPI 编辑器与可视化预览
- 测试能力:原生测试套件和集合运行器
- API 模拟:支持云端或自托管模拟服务器
- CI/CD 集成:原生 Insomnia CLI(Inso)用于 lint 和测试
- 多种存储后端:Local Vault(纯本地)、Git Sync(无云存储)、Cloud Sync(云协作,可选 E2EE 端到端加密)
存储架构设计是 Insomnia 的一大亮点,它允许用户根据数据敏感性灵活选择存储方式:
| 存储方式 | 适用场景 | 数据安全 |
|---|---|---|
| Local Vault | 敏感项目,100% 本地存储 | 最高 |
| Git Sync | 团队协作用 Git 管理 | 高(不通过云服务) |
| Cloud Sync | 便捷协作,支持 E2EE 加密 | 中(可选端到端加密) |
二、技术原理
2.1 技术栈与架构设计
从 package.json 和 eslint.config.mjs 的配置可以看出,Insomnia 采用了现代化的 TypeScript + React 技术栈:
核心依赖:
- 运行时:Node.js ≥ 24,npm ≥ 11
- 构建工具:ESBuild(用于 Electron 入口点编译)
- 前端框架:React(函数组件 + Hooks)
- 类型系统:TypeScript 5.8.3
- 代码质量:ESLint + Prettier + TypeScript ESLint
- 测试框架:Vitest + Playwright(E2E 测试)
- HTTP 客户端:@getinsomnia/node-libcurl(基于 libcurl 的原生性能)
Monorepo 架构:
packages/
├── insomnia/ # 主应用(Electron 渲染进程 + 主进程)
├── insomnia-data/ # 数据层(NeDB 数据库)
├── insomnia-api/ # API 接口层
├── insomnia-analytics/ # 分析模块
├── insomnia-inso/ # CLI 工具(Inso)
├── insomnia-scripting-environment/ # 脚本执行环境
└── insomnia-smoke-test/ # E2E 冒烟测试
2.2 执行上下文边界设计
从 ESLint 配置中可以看到一个非常精细的执行上下文边界设计,通过文件命名约定和目录结构强制区分代码运行环境:
// 文件名后缀约定(从 eslint.config.mjs 提取)
// *.renderer.ts(x) → 浏览器上下文(禁止导入 Node 内置模块)
// *.node.ts → Node 上下文(禁止访问 DOM 全局变量)
// *.worker.ts → Web Worker(既不能访问 Node 也不能访问 DOM)
上下文限制规则:
渲染进程上下文(
packages/insomnia/src/ui/**,routes/**,*.renderer.*)- 可以访问 DOM 全局变量(window, document)
- 禁止导入 Node 内置模块(如
fs,path等)
主进程上下文(
packages/insomnia/src/main/**,*.node.ts)- 可以访问 Node 内置模块
- 禁止访问 DOM 全局变量
通用代码(
packages/insomnia/src/common/**)- 既不能访问 Node 内置模块,也不能访问 DOM 全局变量
- 确保代码在渲染进程和主进程中都能安全运行
这种设计在 TypeScript 层面通过 ESLint 规则强制执行,避免了 Electron 应用中常见的上下文混淆问题。
2.3 网络请求层设计
Insomnia 使用 @getinsomnia/node-libcurl 作为底层 HTTP 客户端,这是一个基于 libcurl 的 Node.js 原生绑定库。选择这个库的原因包括:
- 性能:libcurl 是业界公认的高性能 HTTP 客户端库
- 协议支持:原生支持 HTTP/1.1、HTTP/2、HTTP/3
- 跨平台:在 Windows、macOS、Linux 上表现一致
- 功能完整:支持代理、证书、Cookie、多部分上传等高级特性
从 package.json 的 install-libcurl-electron 脚本可以看出,项目需要为 Electron 运行时单独编译 node-libcurl 原生模块:
"install-libcurl-electron": "node-pre-gyp install --directory node_modules/@getinsomnia/node-libcurl --update-binary --runtime=electron --target=41.0.3"
2.4 插件系统设计
Insomnia 支持通过插件扩展功能,插件可以从 Insomnia Plugin Hub 搜索和安装。插件系统允许:
- 添加自定义的请求/响应处理逻辑
- 扩展界面组件
- 集成第三方工具
- 自定义主题和样式
三、安装与快速开始
3.1 环境要求
开发环境:
- Node.js ≥ 24(参考项目根目录
.nvmrc) - Git
- macOS / Windows / Linux
Linux 额外依赖:
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install libfontconfig-dev
# Fedora
sudo dnf install libcurl-devel
Windows 额外依赖:
- 需要安装 Windows Build Tools
3.2 安装步骤
方式一:下载预编译版本(推荐)
访问 https://insomnia.rest 下载对应平台的安装包。
方式二:从源码构建
# 克隆仓库
git clone https://github.com/Kong/insomnia.git
cd insomnia
# 安装依赖(Monorepo 会自动安装所有 workspace 依赖)
npm i
# 启动开发模式(热重载)
npm run dev
# 启动开发模式(主进程自动重启 + 渲染进程热重载)
npm run dev:autoRestart
3.3 最简运行示例
安装完成后,无需账号即可使用本地 Scratch Pad 模式。创建第一个 HTTP 请求:
- 打开 Insomnia,选择 New Request
- 输入请求名称,选择 GET 方法
- 在 URL 栏输入
https://api.github.com/repos/Kong/insomnia - 点击 Send,查看响应
四、使用方法与实战
4.1 基础用法:调试 REST API
Insomnia 的界面设计简洁直观,核心功能包括:
- 请求组织:通过文件夹(Folder)组织请求集合
- 环境变量:支持多环境配置(开发、测试、生产)
- 代码生成:一键生成多种编程语言的请求代码(curl、Python、JavaScript 等)
- 响应预览:自动格式化 JSON、XML,支持图片预览
4.2 进阶用法:GraphQL 支持
Insomnia 对 GraphQL 的支持非常完善:
# 创建 GraphQL 请求
1. New Request → 选择 GraphQL
2. 输入 Endpoint: https://api.github.com/graphql
3. 在 Query 编辑器编写 GraphQL 查询
4. 使用变量(Variables)面板传递动态参数
特性:
- 语法高亮和自动补全
- 实时错误提示
- Schema 文档浏览器
- 支持文件上传(multipart request)
4.3 实战:使用 Inso CLI 进行 CI/CD 集成
Insomnia 提供了独立的 CLI 工具 inso,可以在 CI/CD 流水线中运行 API 测试:
# 安装 Inso CLI
npm install -g insomnia-inso
# 列出可用的命令
inso --help
# 运行测试套件
inso run test <test-suite-id>
# lint API 规范
inso lint spec <spec-file>
# 生成配置(用于 CI)
inso generate config
GitHub Actions 集成示例:
name: API Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '24'
- run: npm install -g insomnia-inso
- run: inso run test --src ./insomnia
4.4 Git Sync 实战
对于需要版本控制的团队,Insomnia 的 Git Sync 功能可以将 API 集合直接同步到 Git 仓库:
- 在项目设置中选择 Git Sync
- 配置 Git 仓库 URL(支持 GitHub、GitLab、Bitbucket 等)
- 选择同步分支和目录
- Insomnia 会自动将集合序列化为文件并提交到 Git
优势:
- 不通过 Insomnia 云服务,数据完全自托管
- 可以利用 Git 的 diff 功能查看 API 变更历史
- 支持 Pull Request 工作流进行 API 变更审查
五、常见问题与解决方案
5.1 安装失败
问题:npm i 时出现 node-libcurl 编译错误。
解决方案:
# 清理 Electron 缓存
rm -rf ~/.cache/electron
# 重新安装
npm i
# 如果仍失败,手动指定 libcurl 编译参数
npm run install-libcurl-electron
5.2 运行时错误:Electron 无法启动
问题:开发模式下 npm run dev 启动失败。
解决方案:
- 检查 Node.js 版本是否符合
.nvmrc要求 - 确保已安装所有 Linux 系统依赖(libfontconfig-dev 等)
- Windows 用户需安装 Windows Build Tools
5.3 性能问题:大型集合加载缓慢
问题:当 API 集合包含数百个请求时,Insomnia 响应变慢。
解决方案:
- 使用文件夹(Folder)对请求进行分组
- 启用 Private Environments 减少环境变量计算开销
- 考虑将大型集合拆分为多个 Insomnia 项目
5.4 兼容性问题:插件导致应用崩溃
问题:安装某个插件后 Insomnia 无法启动。
解决方案:
# 定位插件目录
# macOS: ~/Library/Application Support/Insomnia/plugins
# Windows: %APPDATA%/Insomnia/plugins
# Linux: ~/.config/Insomnia/plugins
# 手动删除问题插件目录,然后重启 Insomnia
六、总结
Kong/insomnia 是一款设计精良的开源 API 客户端,其技术架构在以下几个方面值得关注:
精细的上下文边界设计:通过文件命名约定和 ESLint 规则,在 TypeScript 层面强制执行 Electron 的主进程/渲染进程上下文分离,避免了常见的混用问题。
灵活的存储架构:Local Vault、Git Sync、Cloud Sync 三种存储方式覆盖了从纯本地到云端协作的全场景,且数据存储选择与用户账号解耦,提升了数据主权。
原生性能优化:使用 libcurl 原生绑定而非纯 JavaScript HTTP 库,在大量并发请求场景下性能更优。
完整的开发生命周期支持:从 API 设计(OpenAPI 编辑器)到测试(Inso CLI)再到 CI/CD 集成,提供了一站式解决方案。
对于需要自托管、注重数据隐私、或需要深度定制 API 工作流的团队,Insomnia 是一个非常值得考虑的选择。其开源协议(Apache-2.0)也为企业内部的二次开发提供了便利。
项目链接:
- GitHub:https://github.com/Kong/insomnia
- 官网:https://insomnia.rest
- 文档:https://docs.insomnia.rest/
- Plugin Hub:https://insomnia.rest/plugins/