最近由于要做基于 Python 的 React Server Rendering 的需求,就调研了下 Python 的 JS 引擎绑定。目前被应用最多的现代 JS 引擎有:
-
V8,Google 开发,霸主级别。
-
SpiderMonkey,Mozilla 开发,一个隐士。
-
JavaScriptCore,Webkit 自带的,主要用在 Apple 系。
-
Chakra,Microsoft 开发,Edge 的 JS 引擎。
-
Duktape,主攻小型化与可嵌入,不是那么主流。
接着看看他们的可嵌入性怎么样:
-
V8,源码大,编译慢,在大陆地区必须得科学上网才能顺利的弄下来,但生产的服务器通常不会允许你这么搞。做 V8 绑定最好的是 Sony 的 v8eval,直接提供 Ruby, Python, Go 三种语言绑定,在这里又得说一下 Sony 大法好!但问题是你不一定能装上它。
-
SpiderMonkey,文档比较丰富,但源码也挺大,在 3.8GB 左右,需要自己 build,目前貌似很少有 SpiderMonkey 应用在 Mozilla 系软件外的例子,属于比较低调的那一型。
-
JavaScriptCore,主要是在 Apple 系上应用,对于非 Apple 似乎比较麻烦,文档也基本上是在 Apple 系的。
-
Duktape,非常小,省资源,但是 ES6 支持的不行,详细可以看下此表,目前几个 Duktape 的绑定都不支持 let,const,arrow function 这种语法。如果预期的 JS 是低版本的或者只把 JS 当作 DSL,那还是可以用的。
-
Chakra,真业界良心,支持 96% 的 ES6 特性,官方直接提供预编译的动态链接库,支持 OSX,Linux,Win32/64,并且才 20 多 MB,提供 C/C++ API 与引擎交互,可以说 Chakra 是目前在 JS 引擎嵌入这一领域的 最佳且唯一 选择。
最后我选择 Chakra 作为要绑定的引擎,由于目前 Python 并没有这类的库,所以自己写了一个
https://github.com/zhengrenzhe/PyChakra/,目前提供了执行执行 JS 字符串与 JS 文件的功能,欢迎 star 嘻嘻。
Chakra 使用起来很方便,总的来说就三步:
- 创建 Runtime
- 创建 Context
- 执行你的逻辑
所以以后如果大家有非 Node.js 平台的 JS 执行需求,只要你的语言支持与 C/C++ 交互,那可以很轻易的写出一个 Chakra 绑定出来,以后就不用再纠结没有合适的开源库该怎么办了。
对于 C/C++ 操作 Chakra,最好的学习平台自然是 Chakra 的官方文档,同时我在学习过程中也写了一篇 blog: Microsoft Chakra 嵌入使用指南,各位在学习过程中也可以作为参考。
尽情的享受 Chakra 带来的快感吧!嘻嘻。