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 做硬體程式設計。