最近由于要做基于 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 使用起来很方便,总的来说就三步:
所以以后如果大家有非 Node.js 平台的 JS 执行需求,只要你的语言支持与 C/C++ 交互,那可以很轻易的写出一个 Chakra 绑定出来,以后就不用再纠结没有合适的开源库该怎么办了。
对于 C/C++ 操作 Chakra,最好的学习平台自然是 Chakra 的官方文档,同时我在学习过程中也写了一篇 blog: Microsoft Chakra 嵌入使用指南,各位在学习过程中也可以作为参考。
尽情的享受 Chakra 带来的快感吧!嘻嘻。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.