Hello,这次发布时隔3个月,我们终于迎来了 ShadowNode v0.8.0 的发布,废话不多说,先来看看这个版本都支持了哪些功能:
- 支持加载本地 Add-on 模块,为 N-API 做准备;
- 更稳定的 TLS 和 MQTT 模块(修复了若干崩溃与内存问题);
- 更稳定的 Child Process 模块;
- 更稳定的 HTTP/HTTPS 模块;
- 新增了内置的 WebSocket 模块,支持 W3C 接口及 WebSocket-Node 的接口;
- 增加了非快照(SNAPSHOT)代码的错误堆栈的函数级支持,无需调试器;
- Buffer:支持了 readInt16LE、readUInt16LE;
- 支持了 armhf/openwrt 系统的编译;
- 支持了树莓派系统的编译(IoT.js 原生支持);
- TravisCI 上增加了 C/CMake/Shell/Python 以及 ESLint 对代码进行自动检查,并且 ESLint 与 Node.js 规则基本一致;
看完了上面那么一大堆的特性,是不是可以原谅 Delay 2个多月了呢!其实这三个月的工作远不止这些,我们在稳定性上做了很多工作,特别是在 WebSocket、MQTT 以及 TLS 这三个模块上,并且 ShadowNode 本身也在 Rokid 内部积极应用在了我们诸多产品中了。
另外,由 Rokid 官方出品的第一个同时支持 ShadowNode 和 Node.js 的模块也在中间诞生了,那就是:Rokid/node-turen 。这个模块是 Rokid 下一代语音交互引擎的 JavaScript SDK,其实就是一个基于 Socket 的客户端,对于手写过 Redis/MongoDB Driver 的开发者来说,自然是容易实现的了。
还记得上次说到 ShadowNode 还刚上 TravisCI,就在 v0.8.0 发布的昨天,团队的一位小伙伴由于忍受不了每次我都在 Pull Request 抱怨他们的格式问题,于是自己把 clang-format 和 ESLint 也一起加入了 TravisCI 的任务中了。
成也 NPM,败也?
还记得上次在 破壳记 说,要分享一些关于 NPM 的一些看法重塑。
其实故事是这样的,在 Rokid 刚开始的一些产品(1年前)中,代码还是运行在一些高端机型上,再加上创业公司业务驱动的情况下,就很少会考虑到代码体积以及今后如果要适配到低端机型的问题了。
之前野蛮生长的代码,在3个月前的我看来,就是一个噩梦,因为我要将他们从 1-2G RAM 的安卓机器移植到只有 256M 的 Linux 设备上。后面的故事其实大家也知道,我通过 IoT.js 创造了 ShadowNode。但还不止于此,因为一开始我认为只要我把 V8 换成了轻量的 JerryScript,就能完美解决问题,大不了就是一些兼容性的问题。
然而,我完全忽略了 JS 代码的解释性能问题,对于几十M大小的代码,一般的解释器根本跑不起来,我稍微做了一些裁剪的代码,完全运行起来大概还需要到半分钟以上,后来我又尝试把代码用 Webpack 打包成独立的文件,不过效果几乎没有改善,后来我开始慢慢裁剪模块,梳理代码逻辑,最终我放弃了这条路。
我心一横,反正代码逻辑我都熟悉了,就把之前的代码,小心翼翼地重写,当我遇到了需要用 DBus 的时候,我去掉了大部分的 JavaScript 代码,转而用 C 实现,同样地,我用 C 语言重写了 MQTT、WebSocket 这些模块,并且使用完全兼容之前模块的接口。我发现每当我减少几百行甚至几千行的 JS 代码,我就离成功进一步,于是就看到了今天的 ShadowNode。
最终,我们的代码仅仅保留足够少依赖的同时下,完成了重写,执行效率虽然还在继续优化,不过也算是与之前的体验保持相对一致。
我并不想说 NPM 有多么的不好,反而引发我们思考的一个问题是,NPM 在给我们带来 DRY 的同时,怎么保证在中低端引擎以及设备的执行效率,这也许是我们社区应该前进的方向吧!
兴趣使然
想一想,ShadowNode 从第一行代码开始,到现在也有半年了。就我个人而言,我最最最开心的是来自于我和团队小伙伴的一段对话。
背景是聊天聊到了一个特性,然后小伙伴说他帮忙提一个 Pull Request 然后我说:辛苦了!
小伙伴说:没事,主要是兴趣,就没关系。
我想作为一个程序员,最最最开心的也许并不是我能做到多大的并发,我能拥有多少的钱这些,而应该是有一些人不出于任何利益,只是单纯地喜欢你做的东西,并且愿意持续投入。
再立 Flag:v0.9.0
按照惯例,我还是来立一个 Flag,在接下来的 v0.9.0 中,ShadowNode 主要会继续完成:
- 支持 JerryScript 上的 Handle Scope API 及 N-API;
- 提供 Debugging/Memstat/CPU Profiling 的工具(Chrome Debug Tools);
- 另外还会考虑支持 HTTP 2.0 以及 CoAP 协议;
最后还是按照习惯,放一个 ShadowNode 的链接,欢迎 Star 及使用:Rokid/ShadowNode 另外下次的发布系列文章中,我将分享如何在真实的设备上使用 ShadowNode 做硬件编程。
来自酷炫的 CNodeMD