雖然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),這樣的應用具有良好的交互性,可以完成復雜的數據操縱。
這里有一篇參考文章,值得一讀: