简体中文
English 简体中文 繁體中文
Methodox 首页

开发

用 C# 编写笔记本

笔记本是一个派生自 NotebookApplication 并重写 Build 的类。它的成员是每位访问者各自一份的,与文档的数据成员完全一样:

using Divooka.Application.Notebook;
using Divooka.Application.Notebook.Framework;

public class Greenhouse : NotebookApplication
{
    public double Temperature { get; set; }

    protected override void Build()
    {
        Site("Greenhouse");
        Page("Yield");
        Markdown("# Crop yield");
        Slider("Temperature (°C)", 0, 40, 24, t => { Temperature = t; return $"{t} °C"; });
        TextBox("Region", "North", region => NotebookOutputs.Markdown($"**{region}** at {Temperature} °C"));
    }
}

NotebookApplicationProvider provider = new(new Greenhouse(), () => new Greenhouse());
await using NotebookHost host = await NotebookHost.StartAsync(provider, new NotebookHostOptions { Address = "127.0.0.1:5080" });

提供程序会获得站点自己的实例,以及为每位访问者创建另一个实例的方法;由 Compute 或 dvn 运行的文档,这两者都由框架提供。

包

包 说明
Divooka.Application.Notebook.Application NotebookApplication、单元格和输出值。不引用任何 Web 库,因此笔记本文档自身的引用保持精简。
Divooka.Application.Notebook.Framework 驱动程序、NotebookHost、NotebookApplicationProvider、从 Divooka 值到输出的映射,以及自检功能。
Divooka.Application.Notebook ASP.NET Core 服务器,内嵌页面客户端:AddDivookaNotebook 和 MapDivookaNotebook。
Divooka.Application.Notebook.Base 通信契约和提供程序接口。

拥有自己页面的宿主可以实现 INotebookPagesProvider 和 INotebookSessionComputeProvider,并用 AddDivookaNotebook 和 MapDivookaNotebook 把服务器映射到自己的应用程序中。

通信协议

页面通过一个小型 JSON API 与服务器通信。该 API 带有版本号,因此从较旧服务器缓存的页面会提示重新加载,而不会误读响应。它包括:每次页面加载时的一次引导请求,用于创建会话;每次更改时的一次调用,响应内容为该单元格的输出以及启用状态的任何变化;上传;以及页面离开时发送的关闭请求。它的规范见服务器源代码旁的 PROTOCOL.md,位于 Parcel.NExT/Packages/Divooka.Application.Notebook。

页面客户端

页面使用 DivookaFrontendComponents(Divooka 生态系统共享的 React 组件)构建,并在服务器构建时嵌入其中。因此,从源代码构建服务器需要 Node.js,以及位于 External/DivookaFrontendComponents 的组件克隆(External/Setup.ps1 会克隆它);构建过程会提示缺少哪一项。

测试

UnitTests/Divooka.Application.Notebook.UnitTests 在真实的环回端口上提供笔记本服务,并通过 API 驱动它们:测试访问者之间相互隔离、同一次访问内共享成员、通过编辑器会话编写的文档以解释和编译两种方式提供服务、dvn,以及随附的示例。NOTEBOOK_CHECK=1——或 dvn --check——会让任何笔记本访问自身一次,并打印每个单元格的响应。