Elm 語言初體驗

小創發表於2016-11-16

上個週末兩天一直在看Elm,這是一門函數語言程式設計語言。所謂函數語言程式設計(Functional Programming,FP),跟物件導向程式設計(Object Oriented,OO)是同一種型別的概念,是一種程式設計模式。具體什麼叫函數語言程式設計,它有什麼特徵,有什麼優勢,這裡不作具體解釋。只放出一個大膽的預言,就是在未來,尤其是在Server端,將會是函數語言程式設計的天下。
Anyway,Elm是一門函數語言程式設計語言,它是一門靜態的,強型別的語言,目前主要targeting在Web端,因此它有一個compiler可以編譯成JS。
目前,編譯成JS的語言已經有非常多了,如CoffeeScriptTypeScriptPureScript等等,甚至很多現有的general purpose語言現在也有了一些工具,用來把它們編譯成JS,如Clojure 有ClojureScript,Scala有Scalajs,Ruby有Opal等等等等。
為什麼有這麼多的新語言編譯成JS,又有這麼多工具把其它語言編譯成JS呢?這些說白了其實都是想取代JS,這說明一個問題,那就是JS不夠好,這個跟JVM上面有這麼多語言原因是類似的。
Elm也是出於同樣的原因,它想要發明一種全新的Web語言,用於取代JS。那在這麼多語言中,Elm的優勢是什麼?
經過這兩天的接觸,我瞭解到它的優勢有以下幾個:

  1. No Runtime Error。”Undefined is not a function” 有沒有遇到過?如果你做過一段時間前端開發,你不可能沒有遇到過這個問題。類似的Runtime Error還有非常多。然而,Elm聲稱可以完成避免Runtime Error!這絕對是無可比擬的一個優勢。美國的一家公司NoRedLink聲稱,他們的產品上線一年多,目前遇到的Runtime Error是0個!這個還是非常有誘惑力的。
  2. 純粹的函數語言程式設計,Immutable data和pure function,讓你的程式碼變得乾淨,0耦合,不易出錯,容易重構,易讀,易測。這些都是JS界目前大力推進的方向啊,不然要immutable.js幹嗎?要Ramda幹嗎?要RxJs幹嗎?
  3. 有一個“官方”的App architecture,這是一個非常優秀的architecture,有多優秀?Redux大家都知道,現在其實已經是Web app實際上的標準architecture,然而Redux的思想其實是從Elm的architecture學來的!

    Redux evolves the ideas of Flux, but avoids its complexity by taking cues from Elm.
    ---- redux.js.org/

總之,我覺得這個視訊裡面有一句話總結得非常好,那就是Elm是現在整個JS界的發展趨勢,然而JS還有很長一段路要走。

那Elm完美的嗎?當然不是,我這兩天接觸下來,發現它仍然處於比較年輕的狀態,雖然官方聲稱它已經production ready,也確實有好一些公司已經用於正式的產品中。然而我相信都不是很容易的事情。目前來說,我覺得有以下幾個問題需要極需改善:

  1. 社群太小,這可能是目前最大的問題,在國內更是如此。如果你在百度上面搜”Elm“,出來的結果基本都不是Elm語言相關的。當然這也不賴Elm,因為你在百度上搜其它東西,基本出來的結果也不是你想要的。
  2. 函數語言程式設計與OO或程式式程式設計差別太大,上手真不是很容易,這會在很大的程度上影響到它的採用率。
  3. Elm語言和編譯器本身也有一些東西有等完善,如目前還不支援String interpolationelm reactor(類似於webpack-dev-server)不支援hot reload,其實之前是支援的,後來發現了bug,就去掉了。Time travel debugger也是,本來是有的,後來發現有bug又去掉了。當前這些都不是很嚴重的問題,比如hot reload只是節省了你手動重新整理頁面的功力而已。然而從這些”原來有,後來發現有bug又去掉“這些事情中就能說明這個東西還不是很穩定的問題。

接下來打算在公司的內部小工具上面試用一下,因為Elm檔案是可以跟JS互動的,所以應該不是太大的問題,大不了再用回JS嘛。但是函數語言程式設計作為未來的發展趨勢,還是要了解一下的。所以,總體來說,我覺得這是一門非常值得學習的語言。

如果你對Elm感興趣,歡迎加微信群,共同交流。

Elm 語言初體驗

(為避免二維碼失效,請關注公眾號從裡面加入)