最近研究了一下 JavaScript 引擎嵌入问题,一点点经验分享给大家

2018-04-14 00:03:44 +08:00
 droiz

最近由于要做基于 Python 的 React Server Rendering 的需求,就调研了下 Python 的 JS 引擎绑定。目前被应用最多的现代 JS 引擎有:

接着看看他们的可嵌入性怎么样:

最后我选择 Chakra 作为要绑定的引擎,由于目前 Python 并没有这类的库,所以自己写了一个

https://github.com/zhengrenzhe/PyChakra/,目前提供了执行执行 JS 字符串与 JS 文件的功能,欢迎 star 嘻嘻。

Chakra 使用起来很方便,总的来说就三步:

  1. 创建 Runtime
  2. 创建 Context
  3. 执行你的逻辑

所以以后如果大家有非 Node.js 平台的 JS 执行需求,只要你的语言支持与 C/C++ 交互,那可以很轻易的写出一个 Chakra 绑定出来,以后就不用再纠结没有合适的开源库该怎么办了。

对于 C/C++ 操作 Chakra,最好的学习平台自然是 Chakra 的官方文档,同时我在学习过程中也写了一篇 blog: Microsoft Chakra 嵌入使用指南,各位在学习过程中也可以作为参考。

尽情的享受 Chakra 带来的快感吧!嘻嘻。

2130 次点击
所在节点    JavaScript
29 条回复
noe132
2018-04-14 01:41:44 +08:00
我在想,如果用 javascript 作为嵌入式语言来写游戏的逻辑开发
比如 Don't Starve 饥荒(游戏多人联机和后期这么卡就是因为 lua )
应该性能会比 lua 好不少吧?
https://benchmarksgame-team.pages.debian.net/benchmarksgame/compare/javascript.html
https://benchmarksgame-team.pages.debian.net/benchmarksgame/compare/lua.html
根据 Node V8, lua 和 java 的执行效率相对比较,node v8 在很多测试上性能是 lua 的数十倍甚至几十倍
ericls
2018-04-14 04:20:53 +08:00
SSR 不知道用 puppeteer 效果怎样 感觉有点太重……
faywong8888
2018-04-14 08:45:30 +08:00
@noe132 很多小型游戏引擎本身就是嵌入 js 来写逻辑的。
faywong8888
2018-04-14 08:49:13 +08:00
补充下:

SpiderMonkey 在 mozilla 的邮件服务软件以及 mongodb 的 client shell 里都有使用的。

duktape 在嵌入式领域(内存资源受限)、Iot 领域还是很流行的 js 绑定首选,ES6 可以通过 pre-compile 来间接解决,也不是什么大问题,在 2k 行 js 代码量上,性能也不比其他巨型 js 引擎差。

v8 会 JIT 运行时生成代码,这种在 apple 系 store 上是发布不了的。
murmur
2018-04-14 08:59:15 +08:00
@faywong8888 小游戏不是嵌入 lua 么 才几百 kb 比 js 好折腾多了
kimown
2018-04-14 09:33:15 +08:00
@murmur
感觉为了复用已有模块,例如 momentjs 之类,开发效率提升 n 倍,当然体积也会暴增,看取舍
DearMark
2018-04-14 09:46:16 +08:00
微软 良心企业啊
KeepPro
2018-04-14 10:04:28 +08:00
我司的游戏是嵌入 spidermonkey 的。
secondwtq
2018-04-14 12:01:25 +08:00
SpiderMonkey 的文档感觉一般,这东西历史很长,各种时期的文档混在一块,感觉很乱 ... 光名字就各种猴的很难搞清楚
但是开源界貌似很喜欢用,大概是因为挺根正苗红的,MongoDB,CouchDB
JSC 代码风格我很喜欢,Apple 的东西不一定经用,但是都挺好看的
ChakraCore 出来的时候,我已经放弃 JS 了 ...
secondwtq
2018-04-14 12:07:37 +08:00
另外楼主做 Server Rendering 直接调 Node 不行么?
不考虑性能之类的,嵌入引擎和调用外部引擎的最大区别就是嵌入进去方便做 host API 的 binding,如果楼主不需要这个的话,那么楼主不需要折腾这个(我看楼主的 Python binding 的作用,貌似直接 spawn 一个 node process 也能做到)
cnnblike
2018-04-14 12:09:51 +08:00
SpiderMonkey 嵌入到 cocos-js 里面有印象
droiz
2018-04-14 12:33:36 +08:00
@secondwtq 有于公司生产平台限制,这个会比较麻烦,不如做 python binding 方便
Mutoo
2018-04-14 12:34:00 +08:00
cocos2d-js 用的就是 SpiderMonkey 也是预编译的,可以支持 PC/Mac/iOS/Android
droiz
2018-04-14 12:34:53 +08:00
@Mutoo 学习了
jinsongzhao
2018-04-14 15:06:46 +08:00
好同志啊!有没有测试 Chakra 的多线程并发?我以前玩过用 C++嵌入 lua 和 py,lua 的多线程并发很简单,创建一个 Context 就可以对应一个线程,而 py 是所有线程共享唯一的一个 runtime,调度起来比较烦,不知道现在版本如何了,估计够呛,因为 py 称自己内部实现了线程调度,好牛的样子,估计舍不得放弃这个牛掰的东东。
faywong8888
2018-04-14 18:27:55 +08:00
@murmur lua 在游戏扩展、配置方面确实更广泛,但 js 也正在这一领域变得流行,小的 js 引擎也只有几百 kb。
cholerae
2018-04-14 20:01:49 +08:00
luajit 难道性能也差很多吗
zhicheng
2018-04-14 20:09:38 +08:00
如果不限语言的话,欢迎尝试一下 Lemon 语言,小巧便于嵌入,就是性能差些,本人是作者。
官网 https://lemon-lang.org
代码 https://github.com/lemon-lang/lemon
nino
2018-04-14 20:35:40 +08:00
厉害了
est
2018-04-14 22:18:15 +08:00
基于 Python 的 React Server Rendering


what????? 用 nodejs 活着不好么。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/446684

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX