最近研究了一下 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 带来的快感吧!嘻嘻。

2273 次点击
所在节点    JavaScript
29 条回复
xieranmaya
2018-04-15 02:03:09 +08:00
@est 我读到这句的时候也是这个反应,就算不行,加个 node 中间层也比用 py 跑 js 要强啊
chemzqm
2018-04-15 02:37:51 +08:00
以前有个项目是 rails 跑 react 的 server rendering,页面出来最快要 10s,那个酸爽!
abcbuzhiming
2018-04-15 10:43:58 +08:00
@est
“用 nodejs 活着不好么”
我之前用 nodejs 作为渲染服务器(直接面向前端的 HTML 页面吐出)的时候遇到了以下问题,不知道 nodejs 现在解决了没有
*.单线程,导致无法有效利用硬件资源
*.单线程,容易死,死了还无法自动拉起来,只能重启了事,搞的我们还得专门为 nodejs 研发了一套监控程序

如果这些问题没有得到有效解决的话,nodejs 作为一个 http 服务器是不合格的,我更希望能搞出目前业界流行的 nginx+lua 那样,搞出 nginx+javascript 的后端渲染服务器,至少 nginx 可比 nodejs 在做 http 服务商可靠的多了
est
2018-04-15 10:49:16 +08:00
@abcbuzhiming 你说的都有道理,但是 py 并不能很好解决你列出来的这几点问题吧。。。

只找到 js 引擎是远远不够的,SSR 还得有模拟 DOM 才行吧?
abcbuzhiming
2018-04-15 10:52:46 +08:00
@est 是的,你说的对,实际上这是一个业界痛点,我们现在都需要服务器渲染,然而传统的后端 http 服务器没有任何一家能提供 js 引擎和 DOM 树模拟能力。NodeJS 是唯一能提供的但是作为 Http 服务器本身它又很不给力。其实我在想这个问题应该早就有人注意到了,为啥没人出来做这方面的工作,莫非 google 在 V8 引擎的开源协议上设置了什么障碍
breeswish
2018-04-15 11:32:39 +08:00
@est 如果业务是 py 写的,不想再单独起一个 nodejs renderer server 做个 proxy,而是直接在服务端集成的话,用 py 跑 js 就挺合理的。还可以参见 react 官方的 asp.net server renderer,也是跑了个 js engine
newlifeinsc
2018-04-15 12:55:42 +08:00
@abcbuzhiming 单线程和进城可能会挂的问题使用 pm2 之类的进程管理器就 ok,会起多进程解决只用一个 cpu,也会监控进程存活,自动重启之类的。就和 Python 的 supervisor 一样
tommyZZM
2018-04-15 13:53:38 +08:00
@noe132 嵌入 js 引擎来做游戏开发,前不久也在研究这事,😄可以互相交流下。

楼主可以关注一下这几个项目:
https://github.com/nodejs/node-chakracore
https://github.com/janeasystems/nodejs-mobile
tommyZZM
2018-04-15 13:58:12 +08:00
@abcbuzhiming 我觉得对于这个问题,去分析是否哪里的 js 代码原因导致程序挂起原因更加有效,例如进入了一个死循环之类的。现在 node.js 跑正确的代码还是很稳定的。

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

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

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

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

© 2021 V2EX