- 开发工具
- 数据科学
【免费下载链接】archived-desktop-app
The old electron based nteract notebook
导读
本文围绕 nteract 开源组织的主仓库展开,系统梳理这个 monorepo 的组成:基于 Electron 的跨平台桌面笔记本应用、可接入 Jupyter 服务器生态的扩展,以及用于构建自定义交互式计算界面的核心 SDK 包。读者读完本文后,将掌握 nteract 桌面应用的功能边界与启动方式、内核发现与配置机制、nteract.json的完整配置项,以及如何基于核心 SDK 包在自有项目中复用 Jupyter 消息协议与笔记本渲染能力。
nteract 是什么
nteract 是一个开源组织,致力于创造出色的交互式计算体验,让协作变得更加容易。它构建 SDK、应用程序和库,帮助个人与团队充分利用交互式(尤其是 Jupyter)笔记本与 REPL。
本仓库即 nteract 的主仓库,采用monorepo(多包仓库)结构,同时包含:
- nteract 核心 SDK 的源代码;
- nteract 桌面应用与 Web 应用的源代码;
- SDK 与各应用的配套文档。
从应用形态看,nteract 桌面版是一个"读写型编码环境"(literate coding environment),支持 Python、R、JavaScript 以及其他 Jupyter 内核。它把 Web 版 Jupyter Notebook 的最佳体验封装成桌面应用,让你能在系统上原生打开笔记本:双击桌面的.ipynb文件即可启动,macOS 上甚至可以直接使用 Spotlight 唤起。
仓库整体结构:monorepo 布局速览
主 README 对仓库目录给出了清晰的定位表,这里是完整的目录职责说明:
| 目录 | 说明 |
|---|---|
| applications/desktop | nteract 桌面应用的源代码,基于 Electron 构建的跨平台应用 |
| applications/jupyter-extension | nteract 的 Jupyter 扩展,可安装到 Jupyter classic 与 JupyterLab 的部署环境中,也可用于个人 Jupyter 服务器 |
| packages | 属于 nteract 核心 SDK 的 JavaScript 包(由 Lerna 管理) |
| changelogs | nteract 核心 SDK 与各应用每次发布的变更日志 |
桌面应用:基于 Electron 的笔记本前端
应用定位与功能范围
桌面应用是仓库中的核心可执行产物,其package.json中名为nteract,版本 0.29.1,描述为"Interactive literate coding notebook!"。在 applications/desktop/README.md 中,项目对自身范围与目标有明确说明:
- 提供笔记本环境用于探索与完成任务;
- 独立的跨平台桌面应用;
- 一个窗口对应一本笔记本文档/叙事;
- 通过Jupyter 消息规范 v5与任意 Jupyter 内核协作;
- 预配置 Python3 运行时(未达成)与 JavaScript 运行时(已达成);
- 培育工具生态,让其他人可以基于 Jupyter 规范构建自己的平台。
值得注意的事实是:桌面应用内置了一个 JavaScript 内核。在 kernel-specs.ts 中,kernelSpecs$会在系统已发现内核的基础上,额外注入名为node_nteract的内核规范,其argv指向ijavascript包的kernel.js,并通过ELECTRON_RUN_AS_NODE=1环境变量让 Electron 以 Node.js 模式运行内核进程。这正是 README 中"Easy install with pre-configured … JavaScript runtimes"目标的实现方式。
Electron 主进程与渲染进程的代码划分
从 src/README.md 可以看到,nteract 是运行在桌面的 Electron 应用,代码明确划分为两条线程:
main/—— 主线程与所有笔记本窗口的启动引导代码(原生 macOS 菜单、对话框等 GUI 模块只在主进程可用);notebook/—— 面向单个窗口的全部笔记本 UI 逻辑。
这种划分对应 Electron 的主进程(main process)与渲染进程(renderer process)模型,是理解 nteract 桌面版架构的起点。
启动流程与命令行参数
桌面应用的主进程入口是 src/main/index.ts,它用yargs解析命令行参数:
Usage: nteract <notebooks> [options]nteract notebook1.ipynb notebook2.ipynb—— 打开多个笔记本;nteract --kernel javascript(别名-k)—— 指定启动内核;-v/--version、-h/--help、--verbose—— 版本、帮助与调试信息输出。
启动时,凡是参数中匹配/.ipynb$/的文件都会进入待打开列表;如果既没有传入笔记本文件、也没有 macOS 的 open-file 事件,则根据内核选择逻辑自动新建一个笔记本窗口。内核选择由bestKernelObservable(requested, fallback)实现:优先使用命令行--kernel指定的内核,其次使用配置项defaultKernel(默认"python3"),若两者都不可用则取内核规范列表排序后的第一个。
启动过程中的关键细节(对应 src/main/index.ts 的代码):
- 通过
setConfigFile将配置文件指向~/.jupyter/nteract.json; - 先显示 splash 窗口,待内核规范就绪、渲染进程发出
react-ready事件后再关闭; - macOS 在 app ready 之前发来的
open-file事件会被缓冲,待就绪后统一处理; - 使用
prepareEnv(见 prepare-env.ts)从当前 shell 会话拉取用户环境变量,确保 macOS 的 launchctl 与 Windows 进程管理器能拿到正确的 PATH 等变量——这正是"从 CLI 启动与从 Dock/开始菜单启动行为一致"的底层保障。
每个笔记本窗口由 launch.ts 中的launch()创建:默认窗口尺寸 800×1000,加载static/index.html,并把打开的笔记本文件名通过main:load传给渲染进程。launchNewNotebook()则通过main:new携带文件路径与内核规范创建新笔记本。
内核规范发现
内核支持依赖kernelspecs.findAll()(kernelspecsnpm 包),它会扫描系统与用户目录下的 Jupyter 内核规范(kernel spec)。发现的规范会通过SET_KERNELSPECSaction 写入 Redux store,供渲染进程查询。这也是"与任意 Jupyter 内核协作"的机制基础:只要你的系统上安装了 Jupyter 内核(Python、R、Julia 等),nteract 桌面版就能发现并启动它。
桌面应用的配置:nteract.json
桌面应用使用基于 JSON 的nteract.json文件保存配置,位置在 Jupyter 配置目录中。可通过jupyter --paths查看该目录:
$ jupyter --paths /Users/me/.jupyter /usr/local/etc/jupyter /etc/jupyter创建配置文件:
$ touch /Users/me/.jupyter/nteract.json可配置项一览
| 配置项 | 示例 | 说明 |
|---|---|---|
"theme" | "theme": "dark" | 设置桌面应用默认主题,取值为"light"(默认)或"dark" |
"autoSaveInterval" | "autoSaveInterval": 1000 | 笔记本文档自动保存的间隔(毫秒),设为0则禁用自动保存 |
"codeMirror" | "codeMirror": { "lineNumbers": true } | 配置 CodeMirror 编辑器的一组选项 |
示例配置
设置默认主题为深色并禁用自动保存:
{ "theme": "dark", "autoSaveInterval": 0 }自定义 CodeMirror 编辑器行为:
{ "codeMirror": { "matchBrackets": true, "autoCloseBrackets": 4, "cursorBlinkRate": 500 } }从源码看配置体系的延伸
除了上述三个核心配置项,主进程还通过@nteract/mythic-configuration的defineConfigOption声明了更多配置选项(见 config-options.ts):
defaultKernel—— 启动时的默认内核,取值来自kernelspecs,默认"python3";keyboardShortcuts—— 自定义键盘快捷键,默认空对象。
渲染进程启动时通过transfer-config-options-to-mainIPC 消息把前端声明的配置选项同步给主进程,再由主进程统一写入~/.jupyter/nteract.json。这说明整个配置体系是"渲染进程声明 → 主进程持久化"的双向机制。
Jupyter 扩展:nteract on jupyter
除桌面应用外,仓库还提供了浏览器端的 Jupyter 扩展。根据 applications/jupyter-extension/README.md:
- 通过 pip 安装:
pip install nteract_on_jupyter; - 使用:运行
jupyter nteract即在 Jupyter 服务器中启动 nteract 界面。
其前端是 TypeScript/React 应用(applications/jupyter-extension/nteract_on_jupyter/),通过setup.py、pyproject.toml与webpack.config.js组织 Python 与 JS 两套构建产物。
开发模式下的部署配置
在 Jupyter 服务器上运行时,存在一个新的NteractConfig配置,用于控制资源加载:
| 配置项 | 说明 |
|---|---|
asset_url | 从何处加载 nteract 的 JS 资源 |
ga_code | Google Analytics 代码,用于跟踪使用情况 |
示例:
jupyter nteract --NteractConfig.asset_url="http://localhost:8080/" --NteractConfig.ga_code="GA-SOME-NUMBERS"开发时推荐用jupyter nteract --dev同时拉起 webpack 热更新服务器与 Jupyter 服务器,或分别执行lerna run hot --scope nteract-on-jupyter --stream与带--NteractConfig.asset_url的jupyter nteract命令。
核心 SDK:用 packages 构建自己的交互式计算应用
nteract-packages 目录(Lerna 管理的包集合)中沉淀了大量可复用模块,构成"让其他人基于 Jupyter 规范构建自己的平台"的生态目标:
- packages/messaging —— Jupyter 消息协议的类型与编码(wire protocol);
- packages/commutable —— 笔记本文档不可变数据结构,支持 nbformat v3/v4 解析;
- packages/epics —— 基于 RxJS 的副作用编排,覆盖内核生命周期、执行、内容管理等;
- packages/rx-jupyter —— 以 RxJS Observable 风格封装 Jupyter HTTP API(contents、kernels、sessions、terminals);
- packages/stateful-components 与 packages/presentational-components —— React 笔记本 UI 组件层;
- packages/editor 与 packages/monaco-editor —— CodeMirror 与 Monaco 编辑器封装;
- packages/mythic-* 系列 —— 基于"myths"架构的状态与副作用管理包,桌面应用的配置、窗口管理、通知、多选等能力均由此实现。
值得一提的是,部分包已从 monorepo 移出独立维护(如ansi-to-react、enchannel-zmq-backend、@nteract/outputs等),见 packages/README.md,因此在核心 SDK 中,enchannel-zmq-backend仍作为依赖出现在桌面应用的package.json中,负责 ZMQ 传输层的 Jupyter 内核通信。
从源码结构可以推断,核心 SDK 的分层是"传输层(enchannel/messaging)→ 数据层(commutable/rx-jupyter)→ 状态层(reducers/selectors/mythic)→ 组件层(presentational/stateful components)",这与 README 中"基于 Jupyter 规范构建自有平台"的定位一致。
构建与打包桌面应用
开发运行
在 applications/desktop/package.json 的 scripts 中可以找到完整的开发命令:
npm run dev(即start)—— 先构建再以开发模式启动 Electron:cross-env NODE_ENV=development electron .;npm run spawn:debug—— 带调试日志启动:cross-env DEBUG=true ELECTRON_ENABLE_LOGGING=1 NODE_ENV=development electron .;npm run build—— 使用webpack.dev.js构建,产物为lib/下的webpacked-main.js。
需要说明的是:构建产物依赖各 SDK 包(@nteract/*)已安装并链接(仓库根目录通过yarn+ Lerna 管理依赖),因此完整开发流程需先在仓库根执行yarn安装 monorepo 依赖。
发布打包
package.json中内置了基于 electron-builder 的发布配置,要点包括:
appId: io.nteract.nteract,productName: nteract;- 文件关联:
.ipynb扩展名关联到应用; - macOS 目标:
dmg+zip(含 hardened runtime 与 notarize 步骤); - Windows 目标:
nsis+zip; - Linux 目标:
deb、AppImage、tar.gz,并声明了桌面文件(Desktop Entry)的 MimeTypeapplication/x-ipynb+json与分类Science;Development;。
打包命令:
npm run pack—— 清理后按生产配置构建并生成未压缩目录(electron-builder --dir);npm run dist—— 生成安装包(electron-builder -p never,不上传);npm run dist:all—— 为 mac/linux/windows 全平台构建(-mlw)。
Linux 打包的更多细节(.deb目录布局、lintian校验、AppImage 相关的APPIMAGE env警告、依赖安装等)可参考 applications/desktop/PACKAGING-NOTES.md。
用户如何上手
- 桌面应用:前往 nteract 官网下载对应操作系统的安装包;Linux 用户也可通过 Snap Store 安装(
snapcraft.io/nteract)。安装后双击.ipynb文件即可打开笔记本,也可在命令行直接执行nteract notebook.ipynb启动。 - 开发者:若想基于 nteract 构建自己的笔记本应用,可以从核心 SDK 的文档(docs 目录下各包的
docs/overview.md、docs/examples.md等)与 docs/index.md 开始,按需选用组件包与状态管理包。
总结
nteract 主仓库是一个典型的"应用 + SDK"混合 monorepo:桌面应用(Electron)与 Jupyter 扩展直接面向最终用户,核心 SDK 则面向开发者开放。理解它的关键在于抓住两条主线——应用侧的"主进程/渲染进程划分 + 内核规范发现 + nteract.json 配置",以及SDK 侧的"消息协议 → 数据模型 → 状态管理 → React 组件"分层。无论你是想直接使用笔记本工具,还是基于 Jupyter 规范构建自有交互式计算产品,本文梳理的目录定位与源码证据都能作为后续深入探索的入口。
- 开发工具
- 数据科学
【免费下载链接】archived-desktop-app
The old electron based nteract notebook
相关推荐
如何用Popular-RL-Algorithms快速上手SAC与TD3?初学者必备教程
如何用Popular RL Algorithms快速上手SAC与TD3?初学者必备教程 Popular RL Algorithms是一个基于PyTorch实现的
强化学习人工智能机器学习Jan项目完全解析:这款免费开源的离线ChatGPT替代品为何值得你立刻关注
Jan项目完全解析:这款免费开源的离线ChatGPT替代品为何值得你立刻关注 Jan 是一款 免费开源 、可 100% 离线运行 的 ChatGPT 替代品:它
人工智能AI 应用大模型本地部署桌面应用交互助手AI Agentnteract:革命性的交互式计算套件全面解析
nteract:革命性的交互式计算套件全面解析 nteract是一个革命性的开源交互式计算套件,致力于为开发者和数据科学家提供卓越的交互式计算体验。作为现代化的
开发工具数据科学
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考