☰
nteract 交互式计算套件:Electron 桌面笔记本应用与核心 SDK 的架构与使用指南
2026/10/7 16:03:32 网站建设 项目流程
  • 开发工具
  • 数据科学

【免费下载链接】archived-desktop-app

The old electron based nteract notebook

项目地址:https://gitcode.com/gh_mirrors/nt/archived-desktop-app
点击查看免费下载

导读

本文围绕 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/desktopnteract 桌面应用的源代码,基于 Electron 构建的跨平台应用
applications/jupyter-extensionnteract 的 Jupyter 扩展,可安装到 Jupyter classic 与 JupyterLab 的部署环境中,也可用于个人 Jupyter 服务器
packages属于 nteract 核心 SDK 的 JavaScript 包(由 Lerna 管理)
changelogsnteract 核心 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_codeGoogle 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

项目地址:https://gitcode.com/gh_mirrors/nt/archived-desktop-app
点击查看免费下载

相关推荐

上一篇:终极 Laravel Generator 常见问题解决方案:快速解决8大开发痛点
下一篇:Laravel Passport 常见问题解决方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询