位元詩人 [技術雜談] Dart — JavaScript 的理想狀態

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

筆者在某個偶然的機會接觸到 Dart 語言,並用 Dart 實際撰寫一些網頁程式;透過一些使用經驗,筆者覺得 Dart 是一個本質良好的程式語言,甚至, JavaScript 的理想狀態應該就是 Dart。為什麼筆者會如此論述呢?因為 Dart 有著數種優良的特性:

  • 在語法上,Dart 吸收了 JavaScript、Java 和 C# 的優點。JavaScript 中常見的函數式程式 (functional programming) 特性,在 Dart 中都可以使用。但是,Dart 不使用 JavaScript 為人詬病的原型物件 (prototype-based object) 系統,而採用 Java 所用的類別物件 (class-based object) 系統,另外又加上一些 C# 自 Java 改良的部分。但 Dart 不會像 Java 或 C# 般,強制加入物件導向的語法,開發者可自行選擇所習慣的模式 (paradigm)。使用 Dart 撰寫程式,感覺愉悅而有生産力。
  • Dart 內建現代程式語言應有的工具鏈 (toolchain),除了基本的直譯器以外,還包括套件管理程式、程式碼重排工具、語法檢查器、IDE 外掛、測試程式、流程自動化 (透過 Grinder) 等,開發者不需費心在建置環境上,可以專注在開發軟體本身。對比於 JavaScript,開發者時常得耗費心力在工具鏈上,像是流程自動化就有 Grunt 和 Gulp 兩種,模組管理工具則有 Browserify、Bower、CommonJS、RequireJS、SystemJS 等數種,測試程式有 Mocha、Jasmine 等,直到現在,仍然沒有實質上的最佳方案,網路上的教學也相當混雜,使得學習相對不易。
  • Dart 可以轉換成高效率的 JavaScript 程式碼。雖然 Dart 原先是要取代 JavaScript,但這個決定兹事體大,而且網頁技術是兵家必爭之地,讓某家商業公司主導未來的網頁技術,相信各方勢力都不會樂見這個結果。所幸,Dart 可以轉換成 JavaScript,保留和網頁技術接軌的一線生機。使用 Dart 撰寫網頁前端程式,大概就是取代原先 jQuery 的角色,由於 Dart 體質良好,IDE 支援也相當豐富,用 Dart 寫大抵上經驗還算良好。
  • Dart 自帶一個高效率的虛擬機器 (virtual machine)。由於 Dart 的開發者就是原先 Node.js 的 V8 引擎的開發者,有這些相關的經驗,使得 Dart 虛擬機器效能良好,甚至比 Node.js 虛擬機器還要更快。這也意味著,Dart 可以像 JavaScript 般,使用單一語言進行全端 (end to end) 開發。

然而,Dart 除了 Google 大量採用外,其能見度相對不高。在筆者撰寫這篇文章的時間 (2017 年六月),在 TIOBE 的排名約在 21 至 30 名之間,在 PYPL 和 RedMonk 都沒有上前 20 名。筆者實際使用 Dart 撰寫全端網頁程式,在這個過程中,發現一些 Dart 相關議題:

  • 程式設計者的慣性:雖然 Dart 設計良好,但程式設計者往往傾向使用現有的工具解決問題。尤其 Dart 主打網頁前端,而 JavaScript 在網頁前端的地位已不可動搖。在數年來,數個試圖取代 JavaScript 的技術都沒有成功,像是 VBScript、ActiveX、Silverlight、Flash 等。目前 Dart 以 JavaScript 轉譯器的姿態試圖進入前端,但使用 JavaScript 轉譯器會使開發過程變複雜,因程式設計者無法追踨原始碼所在位置,只能透過錯誤訊息來猜測。使用過多語言開發程式對日後的維護也是另外一種壓力。
  • 架構複雜:和大部分的語言相異,Dart 一開始就強調前後端分離的設計,這種做法在工程上是有益的;但大部分現有的網頁技術是以後端為中心,將前後端合在一起,相較起來,初學者一開始可能無法馬上意會這種架構的益處。此外,雖然 Dart 想發展前後端分離,但目前 Dart 在後端相對薄弱,往往需要額外引入其他較成熟的後端技術,反而更增加專案的複雜度。
  • 學習資源過少:這是雞和蛋的議題,總是要先有一批早期使用者撰寫教學文件或書籍,再吸引更多使用者投入,以形成一個程式語言生態圈正向的循環,但 Dart 在這個議題上尚待突破。第一步總是最困難的,但 Go (Golang) 在不到十年的時間,從一個全新的專案到 TIOBE 2016 最佳語言,代表這並不是不可能。Dart 現在已經有網頁前端 (Angular Dart) 和行動端 (Flutter) 的方案,若持續推廣前述專案,再補強網頁後端,Dart 就可以一舉成為網頁全端和行動兩大熱門領域的解決方案。
  • 社群套件過少:這和前述的議題相似,要先有一批先行者撰寫常用的基礎元件,再吸引更多開發者使用 Dart 開發應用程式,透過正向循環,使得 Dart 社群更加茁壯。但是 Dart 在這方面尚待努力。以 MySQL 橋接套件來說,目前的套件相當老舊,而且竟然是以 GPL 發行,對商業應用來說,GPL 套件通常是能不用就不用。目前 Dart 的模板語言 (template language) 僅有 Mustache,而這個語言比起其他語言來說算是比較陽春。另外,Dart 竟然沒有官方的 JWT (JSON Web Token) 套件,而社群套件又相對陳舊。投入 Dart 一陣子就會發現 Dart 社群套件其實還有一些努力的空間。

前述的議題都和 Dart 的年紀有關。對於新興語言來說,這些類似的議題都需要一一去克服。但和 Dart 年紀相仿且領域重疊的 TypeScript 出現後,Dart 的生存空間某種程度受到擠壓。可以觀察以下的 Google Trend:

其實 TypeScript 也有一些自己的議題,筆者有機會會再另行撰文。不過,TypeScript 的應用領域比 Dart 來得窄,而其工具鏈也不若 Dart 來得方便,其實 Dart 仍然是有機會突圍。Dart 的本質良好,但某些因素使得 Dart 的普及度仍待加強。對於願意花時間自行撰寫一些套件的開發者來說,Dart 仍然是可以考慮的選項。

[Update on 2018/01/09] Dart 現在的定位其實相當尷尬,在網頁後端,Dart 相當於另一個高效能的 Node.js,但 Dart 的套件數量卻遠遠不及 Node 的套件數,而且 Dart 的後端網頁框架也不若 Node 的 Express 和 Sails.js 來得普遍。在網頁前端,Dart 主要的競爭者是 TypeScript 和 Babel (ECMAScript 6),雖然 Dart 的語法設計得還不錯,但 TypeScript 和 Babel 也沒有比較差,而 TypeScript 和 Babel 更貼近原先的 JavaScript,使用 Dart 並沒有特別的好處。Dart 在行動端有 Flutter,但實際上使用該框架的人數不多,而 Flutter 本身的進展看起來沒有很快。Dart 仍然主打於網頁程式設計,但目前暫時沒有強烈吸引人轉換的理由。

[Update on 2018/03/04] Dart 即將邁入 Dart 2 的大改版,官方網頁最近也更新了。從更新後的官網看起來,Dart 的定位更加著重在網頁前端 (AngularDart) 和行動端 (Flutter),對於網頁後端反而不是那麼強調。筆者以為,可能在網頁後端已經有 Go (golang) 這個成功的語言,Dart 在網頁後端的角色就重疊了;對同一家公司來說,開發兩套功能重覆的語言生態圈其實意義不大,雖然 Dart 可以做為網頁後端,但不會是日後的重點項目。如果 Flutter 能夠持續發展下去,或許會成為日後開發者學習 Dart 最大的誘因。

關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。