標籤:

關於 AngularJS 框架的使用有哪些經驗值得分享?

分享的時候遲緩地發現知乎專欄是使用AngularJS的。最近也用AngularJS做了幾個小項目。似乎國內目前AngularJS的使用者還是挺少的,但是這又是個很不錯的框架,所以希望知乎專欄的前端工程師能分享下你們使用AngularJS的經驗。

我比較感興趣的是,怎麼解決搜索引擎的問題?AngularJS測試工具的使用經驗?

謝謝!


謝提醒,之前還沒注意到這個。

最近做的某個項目的 UI 部分 Mobile Campus(Google Drive 可能需要跨牆)

代碼:https://github.com/morlay/angular-mobile-ui

然後,說說我的一些做法。可能不夠完善,畢竟還在折騰中。

## DOM 的整體 or 零散

首先是這篇神貼:

javascript - How do I "think in AngularJS" if I have a jQuery background?

AngularJS 與 jQuery 等傳統操作 DOM 的思想有所不同,

對於 jQuery 等,一般是先有完整 DOM 然後在這些 DOM 的基礎上進行二次調教。

而 AngularJS 等框架則是 根據 數據模型 以及其對應的 DOM 模版,然後通過模版像搭積木那樣組合頁面。

顯然的,前者在 SEO 上有天然優勢;而後者,搜索引擎還只能拿到某個模版,而無內容。

暫時沒想到有什麼特別好的解決方案,或許,對於內容頁,可以繼續使用傳統方式,而只在需要更多交互的地方應用 AngularJS,特別是在移動端應用上。

同理適用於各種 前端的 MVC 框架,後端只要為前端提供數據介面,而不再需要為其拼接 HTML.

## 模塊化

AngularJS 也是遵循 AMD 的。(AMD 是啥,參考:使用 AMD、CommonJS 及 ES Harmony 編寫模塊化的 JavaScript)

雖然它也可以按照傳統代碼方式來寫(其首頁介紹的用法 AngularJS — Superheroic JavaScript MVW Framework),但是,既然都提供了這麼一種模塊的方法,為何不用上呢 (參考下他已有的較成熟衍生庫 https://github.com/angular-ui/bootstrap)。

angular.module("app", [
"moduleA",
"moduleB",
])
.controller("MainCtrl", [
"$scope",
function ($scope) {

}]);

而且,這種寫法還可以方便做代碼的合併與壓縮,在後面 Grunt 自動化 一節中,就會提到使用 Nodejs/Grunt 來自動的做這些事情。

## 可復用模版 or 業務邏輯模版

今年 Google 開發者大會中 提到的 Polymer(Welcome -
Polymer)

這貨讓人感覺像是 Angular Directives 的進化。

而 Directives 做的事,就是把一堆 DOM 封裝為一條或者一組 自定義的 HTML標籤,作為可復用的模版,以供組裝業務調用。 Demos 可參看:Angular directives for Twitter"s Bootstrap

當然,為了方便修改,很多時候在做 directive 的時候需要將 template 用 templateUrl 代替,

不用擔心文件的碎片化,不利於前端載入 Grunt 自動化 一節 會提到如何合併這些碎片化的 模版。

Directives 是作為可復用的模版,

而業務邏輯則是一般是一個業務對應一個 html 及其的 controller.

## 作用域間的通信

上節提到了一個 html 及其的 controller,一個完整應用自然會包含很多的業務子塊。

自然會有很多很多 cotrollers.

AngularJS 提供了 方法, $scope 或者 $rootScope 的 $broadcast $emit / $on

$scope.$emit("eventA",msg);
$scope.$broadcast("eventA",msg);

$rootScope.$on("eventA",function(event,msg){
console.log(msg);
});

至於他們之間的差別,可參考這個 Demo, Chrome F12 ,你可以看到結果。

https://googledrive.com/host/0Bwdui5aYcEA9SzN2WDJ4cXZRTTA/index.html

## 數據池

除了作用域間的傳值外,還有個方法是統一的管理一個數據池,

對於沒有業務交叉的 controller,若是有公有數據的需要,都從這個數據池中取,

而這個數據池更可以直接作為和後端數據的統一交互口,及本地緩存管理的地方。

## Grunt 自動化

Grunt(Grunt: The JavaScript Task Runner)出現以後,我是發現 Git 上面基本上前端相關的項目上都多了個 Gruntfile.js,可見他確實好用。

不太喜歡大多數項目中把所有任務都丟在一個文件里的方式。

所以,利用 node.js 的特性,將任務集也分解開來。

在 https://github.com/morlay/angular-mobile-ui 這裡可以看到對應的代碼。

這裡只說說,如何按照 angular module 的依存關係自動合併對應文件。

https://github.com/morlay/angular-mobile-ui/blob/develop/grunt/subTasks/angular-concat-modules.js

首先是模塊的命名,使得它能夠和它的路徑一致性。

看這兩張圖就明白了。

第二,除了特殊的,全局公用的模塊外,

其他模塊在各自業務組件中建立引用關係。

避免載入多餘的模塊。

比如這裡,我只需要把 Grunt 配置中,

把 app.main 作為了入口文件,

並配置它的全局引用,ngMobile 和 tpls(可復用模版轉換而成的 js)

通過 `grunt angular-concat-modules` 和 `grunt script-uglify`

合併壓縮自動完成。

當然,這裡更是直接做了任務,`grunt release` 一條指令搞定一切。

而,對於 angular 模版轉換為 js 有現成的 grunt-angular-templates 可用,

這裡不細說了,詳看代碼。

## 測試工具

最後的,關於測試工具,官方有提供 Karma - Spectacular Test Runner for Javascript

但沒用過,也不知道怎麼用,希望有同行給予補充與介紹。

其他的,在 API 文檔里寫得挺詳細的。

P.S.

至於知乎,並非完全 Angular 的方式,

希望能夠進一步,至少在不需要 SEO 的部分。

繼續折騰去了,還有很多東西要弄。


1. 面向數據編程

使用angularjs的思路簡單:1)界面元素綁定數據,2)操作處理數據

我用這個思路編寫了一個冒泡演算法的可視化,實現十分簡單,想清楚如何綁定數據後,接下來的工作就只是操作處理數據了。

冒泡排序演算法的可視化

相比如果使用jQuery,jQuery的思想是面向界面元素編程,簡單的說如何定位和操作界面(網頁)元素,大量精力放在了界面元素的操作上,而應該是重點的數據處理卻在這個思路體系中佔了很小的位置。

2. 可測試模塊化編程

這個思路有兩點,1)模塊化 2)可測試

angularjs雖然可以很傻瓜式的編程,但是更加推薦的還是模塊化編程,而且是可測試模塊化編程。它的教程也一直把如何測試模塊的方式也寫了進去。

angularjs剛出來的時候,最詬病的地方,就是測試困難,也是backbone和其他框架使用者對它的質疑。後來angularjs team花了很大的精力去解釋angularjs如何測試,如何依賴注入,如何提高angularjs的可靠性。後來把官方網站把所有的例子上,都包括了相應的測試代碼。很好的回應了難以測試的質疑。

angularjs,本身有很多模塊,而且推薦以模塊的形式編寫angularjs插件。很大一塊是教人如何寫service,route和Declarative , 這些之間又是相互獨立的模塊,有可以把這些模塊有機的組合在一起。

3. 前端模板引擎

angularjs本身是很好的前端模板引擎,未來發展就是後端的mvc產生json視圖(view)作為前端的模型(model),而整個前端的mvc是後端的視圖(view),中間通信就靠json。這樣前後端高度解耦,可以完全達到模塊化設計的要求。

這樣前端只要知道後端產生數據的結構,給了一些數據樣本,就可以直接開發了,而無需等待後端代碼完成。

這個答案是我來說明網站開發的未來趨勢:

請簡單說明 angularJS 有什麼用?

-----暫時先寫到這裡,有了更多感悟再寫----


程序員技術網站 stackoverflow 有一則精彩問答,地址:javascript - "Thinking in AngularJS" if I have a jQuery background?

How do I 「think in AngularJS」 if I have a jQuery background?

該問題至今已集結了 4538 個贊,其中 Josh David Miller 的答案得票最高,其文洋洋洒洒,循循善誘,娓娓道來,眾望所歸地榮獲 7200 多贊,這篇文章將他的西文翻譯成國語,以饗讀者。


問題摘要

我可以熟練使用jQuery進行客戶端應用的開發,但是現在我希望開始使用Angular.js。哪位能描述一下這個過程中必要的模式變化嗎?希望您的答案能夠圍繞下面這些具體的問題:

  1. 我如何對客戶端web應用進行不同方式的架構和設計?它們之間最大的區別是什麼?(譯者註:指jQuery和Angular.js)

  2. 有什麼是我不該做或者不該使用的;而又有什麼是我應該做或者應該使用的呢?

  3. 有沒有一些服務端的考量/約束呢?

我在尋找的就是一個關於jQuery和Angular.js之間的詳細的比較。


1. 不要先設計頁面,然後再使用DOM操作來改變它的展現

在jQuery中,你通常會設計一個頁面,然後再給它動態效果。這是因為jQuery的設計就是為了擴充DOM並在這個簡單的前提下瘋狂的生長的。

但是在AngularJS里,必須從頭開始就在頭腦中思考架構。必須從你想要完成的功能開始,然後設計應用程序,最後來設計視圖,而非「我有這麼一個DOM片段,我想讓他可以實現XXX效果」。


2. 不要用AngularJS來加強jQuery

類似的,不要以這樣的思維開始:用jQuery來做X,Y和Z,然後只需要把AngularJS的models和controllers加在這上面。這在剛開始的時候顯得非常誘人,這也是為什麼我總是建議AngularJS的新手完全不使用jQuery,至少不要在習慣使用「Angular Way」開發之前這麼做。

我在郵件列表裡看到很多開發者使用150或200行代碼的jQuery插件創造出這些複雜的解決方案,然後使用一堆callback函數以及$apply把它粘合到AngularJS里,看起來複雜難懂;但是他們最終還是把它搞定了!問題是在大多數情況下這些jQuery插件可以使用很少的AngularJS代碼重寫,而且所有的一切都很簡單直接容易理解。

這裡的底線是:

當你選擇解決方案時,首先「think in AngularJS」;如果想不出一個解決方案,去社區求助;如果還是沒有簡單的解決方案,再考慮使用jQuery。但是不要讓jQuery成為你的拐杖,導致你永遠無法真正掌握AngularJS。

3. 總是以架構的角度思考

首先要知道Single-page應用是應用,不是網頁。所以我們除了像一個客戶端開發者般思考外,還需要像一個伺服器端開發者一樣思考。我們必須考慮如何把我們的應用分割成獨立的,可擴展且可測試的組件。

那麼如何做到呢?如何「think in AngularJS」?這裡有一些基本原則,對比jQuery。


視圖是「Official Record」

在jQuery里,我們編程改變視圖。我們會將一個下拉菜單定義為一個ul :

&

求助,用angularJs實現下圖功能?
有了 Angular 之類的 MVC/MVVM 框架是不是可以不學 DOM 了?或者只需簡單了解一下 DOM?
Angular js 初學者該看什麼書啊? ?
如何評價 Angular 2 發布 Beta 版本?

TAG:AngularJS |