大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。
什么是 Extism
Extism 是一个轻量级的 WebAssembly (Wasm) 构建框架,支持在服务器、边缘计算、命令行界面 (CLI)、物联网 (IoT)、浏览器以及介于两者之间的所有设备上运行 Wasm 代码。Extism 的设计目标是“通用”,即无论在何处运行,都支持通用接口。
此外,Extism 在标准 Wasm 运行时之上还添加了一些额外的实用程序,例如:支持持久内存/模块范围变量、无需 WASI 的安全且主机控制的 HTTP、运行时限制器和计时器、更简单的主机函数链接等等。核心特征包括:
- 易于使用:Extism 充分利用 WebAssembly 的强大功能和可移植性,是一个现成的插件系统,只需导入库即可快速使用
- 默认安全:无需担心某些插件代码会对应用程序造成影响,Extism 以安全为核心构建,对所有插件代码的执行进行完全沙盒化处理
- 随处可用:独特的灵活架构使 Extism 几乎可以在任何地方运行,并提供了适用于 Python、Node、Ruby、Rust、Go、PHP、C/C++、OCaml 等语言的惯用 Host SDK。
目前 Extism 在 Github 通过 BSD-3-Clause 协议开源,有超过 5.1k 的 star、是一个妥妥的优质开源项目。
如何在 JS 中使用 Extism
以下是在选择的语言和平台上运行 Extism 插件的简要指南,本文档应该能帮助开发者尽快从零开始,实现“Hello, World!”。
在 Extism 中,普通(非 wasm)应用被称为“宿主”,而开发者提供的各种库称之为“宿主 SDK”,以帮助将 Extism 插件嵌入到应用程序中。
对于 JS 来说,首先需要将 @extism/extism 依赖项添加到 package.json 中:
npm install @extism/extism --save
接着建议将以下代码复制粘贴到 node.js shell 中:
const createPlugin = require("@extism/extism");
const plugin = await createPlugin(
"https://github.com/extism/plugins/releases/latest/download/count_vowels.wasm",
{ useWasi: true }
);
接着在插件上调用“count_vowels”导出函数,其将计算传入字符串中元音字母的数量,并返回 JSON 编码的结果。
let out = await plugin.call("count_vowels", "Hello, World!");
console.log(out.text());
// => '{"count":3,"total":3,"vowels":"aeiouAEIOU"}'
如何在 Python 中使用 Extism
首先也需要安装相应的依赖:
# using pip
$ pip install extism
# using poetry
$ poetry add extism=^1.0.0
接着在代码中导入相应的库:
import extism
url = "https://github.com/extism/plugins/releases/latest/download/count_vowels.wasm"
manifest = {"wasm": [{"url": url}]}
plugin = extism.Plugin(manifest)
接着也在插件上调用“count_vowels”导出函数,其将计算传入字符串中元音字母的数量,并返回 JSON 编码的结果。
wasm_vowel_count = plugin.call(
"count_vowels",
"hello world"
)
print(wasm_vowel_count)
# => {"count": 3, "total": 3, "vowels": "aeiouAEIOU"}
其他语言的集成官方也提供了非常详细的文档,可以参考文末资料,本文不再过多展开。
参考资料
https://github.com/extism/extism
https://extism.org/docs/quickstart/host-quickstart