雖然10年前搞過一段時間的Web應用開發,且為所在企業設計了一個基於ASP.NET WebForms(在.NET 1.1的基礎上)的Web應用開發架構。但是,後來一直做的都是案頭類的應用,比如SmartClient,基於Silverlight的RIA,甚至到現在,我們公司的產品就是一個純用戶端的單機WinForms應用。所以,我應該是一個徹徹底底的傳統型應用程式員了。已經很久不碰JavaScript這樣的東西了。
最近開始對JavaScript感興趣的原因,不外乎下面幾個:
- 最近1年Node.js的極其火熱,想深入瞭解一下,尤其Azure(及WebMatrix)對Node.js強力支援更是加深了我的興趣;
- ASP.NET MVC中內建了一個MVVM的JavaScript庫——KnockoutJS,想知道為什麼微軟對KO情有獨鐘;
- Windows 8 App可以使用JavaScript和HTML5來開發,可見就算是案頭應用,JavaScript未來也有用武之地;
- 微軟推出了TypeScript,以及之前微軟非官方的Script#,還有CoffeeScript的被持續關注,都說明人們希望以更加簡單的方式來使用JavaScript開發大型更加Rich的應用程式
我做的簡單嘗試的情境如下:
- 公司官網用php構建的,對php不是太熟悉,也不想去對原有網站架構做調整;
- 公司部落格基於wordpress構建
- 需要在官網中自動顯示部落格的最新文章列表
由於之前已經開始學習Knockout的東西,所以昨天決定基於KO來實現上述情境,這可以說是對KO的一點實際嘗試。具體做法如下:
- 在wordpress中安裝feed json外掛程式,暴露json的介面
- 建立一個html檔案部署到網站根目錄
- 在官網中建立一個欄目塊(支援自訂HTML),在其中插入iframe元素,指向上面的html檔案。之前嘗試過在HTML中直接實現代碼,但是由於jQuery版本會衝突,所以改用iframe。
這個簡單應用程式的HTML檔案如下:
<body> <div> <div data-bind="foreach: blogs"> <p> <a data-bind="attr: {href: $data.permalink, title: $data.title}" target="_blank"> <span data-bind="text: $data.date"></span>: <span data-bind="text: $data.title"></span> </a> </p> </div> <a href="blog" title="More" target="_blank">More</a> </div> <script type='text/javascript'> function Blog(data) { this.title = ko.observable(data.title); this.permalink = ko.observable(data.permalink); this.date = ko.observable(data.date.substr(0, 10)); } function BlogViewModel() { var self = this; self.blogs = ko.observableArray([]); $.getJSON("/blog/?feed=json", function (allData) { var mappedBlogs = $.map(allData, function (item) { return new Blog(item) }); self.blogs(mappedBlogs); }); } ko.applyBindings(new BlogViewModel()); </script></body>
上面HTML檔案分作兩個部分。第一個部分就是用於顯示介面的HTML,第二部分是實體物件的定義和擷取資料執行綁定的JavaScript代碼。
在第一部分中,由於使用了MVVM思想的綁定機制,對於我而言是非常熟悉的,這個和XAML沒有太多區別。
第二部分中,首先利用jQuery擷取JSON資料並轉換為可綁定的JavaScript對象(這裡真的簡單的讓我感到驚喜),可綁定是通過ko.observable來實現的;然後在ViewModel對象中提供一個可綁定的數組屬性給介面(即blogs屬性)。
上述功能雖然簡單,但是我覺得已經觸摸到了所謂Rich JavaScript Application或微軟稱之為 Scale JavaScript Application的實現途徑了。即:
- 使用jQuery這樣的架構來簡化DOM的操作
- 使用KnockoutJS或者AngularJS這樣庫或架構來簡化資料呈現,行為處理
- 使用CoffeeScript或者TypeScript來簡化JavaScript的編寫
- 開發可以跨瀏覽器啟動並執行純用戶端應用,也具備和服務端的互動能力(一般基於RESTful),這樣的應用具有良好的互動性,可以完成複雜的資料操縱。
這裡有一篇參考文章,值得一讀:
Rich JavaScript Applications – the Seven Frameworks (Throne of JS, 2012)