Hi,大家好!我在这里很高兴地宣布,在过去20天里,ShadowNode 伴随着XX需要,已经悄悄地增加了很多新功能,并且已经在这不到一个月的时间,迭代了N个小版本了(目前版本管理还不是特别规范了),主要包含如下:
- 增加了 TLS 模块,实现了客户端功能;
- 重写了原有地 HTTPS 客户端功能,使用 TLS 替换掉了之前地 libcurl 和 openssl,架构更加清晰明了;
- 增加了 MQTT 模块,并且支持 MQTT/MQTTS 协议,与 MQTT.js 接口保持对齐;
- 增加了像 Node.js N-API 一样地原生模块加载方式;
- 开放了部分 ES2015 特性如:箭头函数、字符串模版等;
- 修复了若干与 Node.js 的兼容性问题;
我也在今天抽空增加了在 TravisCI 的自动构建,在 ShadowNode 下个版本(v0.8.0)将会着手优化内存和性能方面的问题,以及 100% 兼容 N-API 的写法。内置模块以及社区兼容性将暂时不会再增加更多特性。
彩蛋!破壳记
另外,今天将放出一个彩蛋,ShadowNode 的破壳记分享给大家。
之所以会产出 ShadowNode 的原因完全是因为之前大量基于 Node.js 在设备端开发的应用程序,在移植到一些更低端的平台时,遇到的最大问题就是内存,想过很多办法包括:
- 参考 node-charkracore,把 Node.js 移植到其他轻量级的 JavaScript 引擎,如 JerryScript、Duketype;
- 使用 TypeScript 重写我们的业务逻辑,然后生成 LLVM 后,再编译成纯机器代码;
上述的两个方案,在我看来都是可行性不错的,不过前者对 V8 以及相关 API 的工作量依然很大,后者我个人倒是相当感兴趣去实现,不过这样会失去脚本语言的优势,再加上增加了交叉编译的门槛,得不偿失。
最终机缘巧合之下,我找到了三星开源的 IoT.js,当时发现这个项目时,看到文档的时候就已经开心得想跳起来了。IoT.js 已经做了相当一部分重要的工作了,包括增加 CommonJS 模块系统、文件系统模块、网络模块、UDP 模块、Buffer 还有最重要的 Stream 类族,而且整个构建系统也相当简单易懂,基于这些工作,我才可以轻松得往完成目前 ShadowNode 的工作。
然而在慢慢迁移的过程中,有一些观点与 IoT.js 的开发团队是不同的:
- IoT.js 原来并不支持从 node_modules 下加载模块,理由是希望区分两个社区的模块,而 ShadowNode 的原则则是兼容更多的 NPM 模块;
- IoT.js 由于需要支持其更低端的设备,RAM 一般在几百 KB 左右,不过也损失了很多开发体验,比如不支持调试,const/let 关键字,以及对内存的严格控制,然而 ShadowNode 环境相对宽松一些,因此开发体验将优于 IoT.js;
好,以上其实就是 ShadowNode 的一则短小的开发故事,如果你从中觉得有趣,不妨也加入到 ShadowNode 开发社区中来,下面的链接,欢迎 Star 🌟
下次将分享在开发 ShadowNode 过程中,对于 NPM 以及模块化的一些看法重塑,敬请期待!
赞~
想问下。。能够兼容整个npm体系吗?
@kid-wumeng 会尽量兼容,不过一些不适合在嵌入式设备运行的库,不会主动去支持~
@yorkie 是否推荐一些开发板和应用方案,让我们新手基于sn玩起来 自豪地采用 CNodeJS ionic
@fengmk2 多谢苏千大大给的建议,非常好。 我计划是在 v0.8.x 版本发布的时候,会内置在 Rokid 开发板最新的镜像中,并且同时也会发树莓派和 OpenWrt 的包,到时候应该就可以正式体验了~