可以运行代码的网页/文档

我们在新学习一个项目时,会读项目的文档。有些项目的网页/文档里会嵌入代码,点击运行就能看到效果,学习体验非常好。
如何把自己的项目文档做成这种效果呢?本文介绍下相关技术。

0. 前端教程

很多前端项目的教程都是这种效果,原理很简单,让用户写的 html,css,js 在浏览器中直接执行,不需要后端服务器。
例如 vue tutorials:
https://vuejs.org/tutorial/#step-1
但是支持的语言有限,只适合前端。

1. 在浏览器中“运行” 脚本 + 后端执行

对于其他语言,需要自己搭建后端服务器

需要自己搭建后端服务器,用户在浏览器里操作、运行 js/ipython,但实际上代码是在后端 kernel 里执行的。
所以本质上是webshell (web IDE 原理也是这样)


image.png

一些介绍文章:
http://wwj718.github.io/post/%E6%9E%B6%E6%9E%84/jupyter-notebook-architecture/
https://zhuanlan.zhihu.com/p/33105153
https://www.bilibili.com/video/BV1Q4411H7fJ?p=2&spm_id_from=pageDriver

简而言之,Jupyter Notebook是以网页的形式打开,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示的程序。如在编程过程中需要编写说明文档,可在同一个页面中直接编写,便于作及时的说明和解释。

一个有趣的扩展案例是美团拿来对接spark 等大数据平台:
https://www.infoq.cn/article/f32x6fc88r5rext8ulqz

有一些Jupyter的云托管服务,比如 google colab
https://www.ikkaro.com/zh-TW/%E8%B0%B7%E6%AD%8C%E5%90%88%E4%BD%9C%E5%AF%A6%E9%A9%97%E5%AE%A4%E6%88%96%E8%B0%B7%E6%AD%8C%E5%90%88%E4%BD%9C%E5%AF%A6%E9%A9%97%E5%AE%A4/

2. 浏览器浏览文档/教程+ 云端托管服务执行

给用户一个在浏览器里操作的虚拟机 + 教程文档,文档里的脚本点一下就能在虚拟机里执行。

2.1. 国内

shiyanlou

收费

2.2. 国外

Katacoda

https://developer.aliyun.com/article/752183
相比于 shiyanlou 更open 些,能自己写教程
但是,已停运:
https://mp.weixin.qq.com/s/oT9qch7OUjH6oYjLsxxcIQ

Killercoda

https://killercoda.com/
示例: https://killercoda.com/mosn-tutorial/course/layotto/layotto-with-istio

It's possible to run commands or scripts once a user opens a scenario. This allows to setup whatever is needed before the user starts problem solving or learning.

When using foreground scripts, all commands will be shown to the user in the terminal. When using background scripts, the user won't see the executed commands.

CloudYuga

https://cloudyuga.guru/
课程比 killercoda 多;但没找到从 katacoda的迁移教程

Google colab

colab全称为Colaboratory,是免费的Jupyter运行环境,并且完全在云端运行。最重要的是免费,而且不需要你自己去装深度学习的环境

支持GPU,而且是免费使用

2.3. 缺点

国内的收费,国外的要魔法上网,敲命令延迟高。
白嫖体验不好,本质上是因为要消耗服务器资源,服务器要花钱。

3. 在浏览器中通过 wasm 运行 server 端

在浏览器中通过 wasm 运行 server 端的好处是:不用再消耗服务器资源

浏览器中运行 tidb

体验地址: TiDB Playground (pingcap.com)

https://pingcap.com/zh/blog/tidb-in-the-browser-running-a-golang-database-on-wasm

https://en.pingcap.com/blog/tidb-in-the-browser-running-a-golang-database-on-webassembly/

浏览器中运行 Postgresql

Postgresql playground:
https://www.bilibili.com/video/BV1bg411r7Fg/?spm_id_from=333.788&vd_source=0771a43f57c2ba3078c77e780c9c5e2f

https://www.crunchydata.com/blog/learn-postgres-at-the-playground

后来开源了 postgresql wasm,见 https://supabase.com/blog/postgres-wasm

浏览器中运行 SQLite

SQLite can be compiled with emscripten without any modifications, and the sql.js library is a thin JS wrapper around the wasm code.

数据量太大,浏览器放不下怎么办?

有了上述技术,我们自然会想到一个idea:如果只做静态网站,可以不花钱租服务器、只用 github pages 等免费托管服务做部署!
技术上,可以把 SQLite 编译成 wasm 运行在浏览器里,每次前端查询db、画图时,其实是在调内存里的 SQLite。这种方案在小数据量的情况下还好,但如果数据库里数据量太大,每次打开页面要下载全量数据,太慢了。怎么办?
有人做了个虚拟文件系统,对 SQLite 提供 page 的抽象,当 SQLite 访问某个 page 时,虚拟文件系统会通过 HTTP Range 请求访问远端的静态文件, 做到按需取数据,减少下载量。作者甚至做了"预取"等利用"局部性原理"的优化。
打开链接即可体验
https://phiresky.github.io/blog/2021/hosting-sqlite-databases-on-github-pages/

https://github.com/phiresky/sql.js-httpvfs

JupyterLite

体验地址(有bug的话可以挂梯子):
https://jupyterlite.readthedocs.io/en/latest/_static/lab/

介绍:
https://blog.jupyter.org/jupyterlite-jupyter-%EF%B8%8F-webassembly-%EF%B8%8F-python-f6e2e41ab3fa
https://github.com/jupyterlite/demo

原理是把jupyter后端的python服务器跑在wasm里。支持很多解释型语言:


image.png

浏览器中运行 Streamlit

https://www.bilibili.com/video/BV14G4y1H7VM/?spm_id_from=333.1007.tianma.2-2-4.click&vd_source=0771a43f57c2ba3078c77e780c9c5e2f&t=74.8

https://edit.share.stlite.net/

4. 运行markdown中的脚本

很多技术文档是 markdown 文件,如果能直接运行 md 文件中的脚本,会让阅读体验好很多。

4.1. 在网页里渲染 markdown、运行其中的 js

https://www.cnblogs.com/guoxiaoming/p/9550075.html
https://guoxiaoming.com/react-code-view/

只适合前端

4.2. IDE/编辑器 里执行

IDE装插件即可
https://hxyxyz.top/index.php/%E6%8A%80%E6%9C%AF/335.html
https://marketplace.visualstudio.com/items?itemName=Sycl.markdown-command-runner

或者用 Rmarkdown
https://sspai.com/post/42841

4.3. 在jupyter中运行markdown格式脚本

https://zhuanlan.zhihu.com/p/39481175

5. 不只是教程: 你的下一个测试用例,何必是代码?

想解决的问题:
https://mosn.io/layotto/#/zh/development/test-quickstart
Quickstart 是项目的门面,如果新用户进入仓库后,发现 Quickstart 文档跑不起来,可能会失望的走掉。
所以我们要经常性的测试 Quickstart, 保证能正常运行。
但是…… 定期手动测试 Quickstart、修复文档中的异常,这个过程实在太花时间了:

image.png

5.1. 在命令行中运行 markdown 中的 shell

希望能断言返回状态是不是异常

基于 mdsh 这个项目
https://seeflood.github.io/layotto/#/zh/development/test-quickstart
https://github.com/bashup/mdsh
https://gist.github.com/pjeby/c137ace4d91e61e8f1f80e92d84e8b70

  • Rmarkdown有命令行工具么?
    没找到

5.2. 自动测试你的文档

https://mosn.io/layotto/#/zh/start/

5.3. 用文档测试你的项目. Doc as tests

https://github.com/mosn/layotto/pull/669#issuecomment-1175729841
chore: use start --config parameters in some demos by seeflood · Pull Request #698 · mosn/layotto (github.com)

https://github.com/mosn/layotto/pull/669#issuecomment-1177224860
chore: layotto start without -c or --config by seeflood · Pull Request #3 · MichaelDeSteven/layotto (github.com)

6. Future work

记录一些idea:

  • 文档组件化

  • 文档模板引擎

  • 文档中引用代码片段、代码注释

  • Online lab using wasm
    可以侧边栏打开一个 terminal, wasm运行一个 os,可以预先安装一些软件,例如docker.
    点击命令,右边terminal会自动执行

  • online lab using docker desktop
    同上,但是点击后通过本地docker desktop执行

  • mdx 和 https://github.com/charmbracelet/vhs 集成
    generate gif automatically · Issue #3 · seeflood/mdx (github.com)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容