blog icon indicating copy to clipboard operation
blog copied to clipboard

你好,AngularJS

Open lmk123 opened this issue 10 years ago • 0 comments

AngularJS 刚问世的时候,我一眼就看到(并认为)它把逻辑写在了模板里:

<button ng-click="edit()">编辑</button>

这也是我一直不看好、并且再也没有关注过它的原因。

然而前两天,我买了两本书(《用 AngularJS 开发下一代 Web 应用》与《AngularJS 权威指南》),并准备深入学习它。原因起于一个 PhoneGap 手机 APP。

为何学习 AngularJS

当我开发这个 APP 的时候,我的思想仍然停留在“网站”的层面上。于是我组织代码的形式就跟搭一个网站一样。

可是写到后面,我发现使用“网站”的经验来写手机 APP 有点力不从心了。在构建网站的时候,一般都是已经由服务器构建好了页面,然后再使用 jQuerydoT 等方式操作 dom;但这样让大部分的代码都绑死在了 dom 上,并不能让我真正的关注核心逻辑。

另外,由于手机 APP 里无法依靠服务器来生成 HTML 了,所以假如我要打开一个商品详情页,我要先向服务器请求商品数据,然后再由前端模板(如前面提到的 doT)生成 HTML,然后还得写进 dom 里。如果逻辑再复杂一些,每当商品的数量变动时,我都需要实时计算价格,而显示价格的时候又涉及到了 dom……这个展开已经让我“惶恐不安”了。

这个时候,我才明白AngularJS 为什么这么火了。

我的学习习惯

在读书的时候我有一个习惯,就是把书上的例子都自己写一遍,并随意的进行一点修改。这样做有两个原因:

  1. 写一遍记忆更深
  2. 书中的代码有可能已经失效,写一遍才能把这些坑提前填完,以免真正准备用来开发的时候浪费时间

果然如我所料,那两本书使用的是 v1.2.x ,而目前最新版本是 v1.3.15,好多代码都失效了——这并不让我感到失望,反而让我觉得有趣:如果代码都按照预期的正常运行,那该少了多少编码的乐趣啊。

AngularJS 的利弊

深入了解 AngularJS 之后,我发自内心为它折服。但我是一个前端,难免会从“网站”的角度来思考问题,于是我发现:

  1. AngularJS 对搜索引擎不友好
  2. AngularJS 的初衷是面向 web 应用程序,所有依赖都需要提前加载好,这意味着如果我用它来构建网站,那么我得提前加载完所有的控制器

第一点没有比较好的解决方案,只能用一个折中的办法:文本内容居多的页面不要使用 AngularJS。

第二点在网上已经有解决方案了,可以做到按需加载控制器——虽然不少人觉得这样做并不合适。有的人认为,如果项目真的大到需要按需加载的程度,那么就应该把项目进行合理拆分,分成两个或多个小项目;还有人认为,按需加载的功能应该等待 AngularJS 官方支持,而不应该 “hack” 它。

而我自己觉得,从构建手机 APP 的角度来看,按需加载是没必要的,但如果用来做网站就另当别论了。

有人会说,我可以将所有 js 合并成一个单独的文件,例如 all.js。尽管这个文件可能会比较大,但我们可以给它加上时间戳,然后设一年的缓存,所以只有在用户第一次加载的时候才会觉得比较慢。但这里有一个问题:任何一点小改动,都需要重新合成这个 all.js,这样,用户又得重新加载这个大文件了。

同样的,“all.css” 也有这个问题。

如果将控制器(以及控制器对应的样式)做成按需加载的话,这样的问题就不会有了——虽然实行过程中可能会另有一些问题,但是利大于弊。我们要做的就是在利弊中做一个权衡。

AngularJS 确实是一个很成功的框架,对开发者非常友好。但我还是要做一点破坏气氛的提醒:对开发者和对用户友好,一直都是对立面。在自己代码写的爽的时候,也不要忘了考虑使用者的感受。

一个无关紧要的小故事

关于最后一点,我想引用一下《牧羊少年奇幻之旅》里面的一则小故事,没兴趣的读者可以略过 :)

有一个商店老板叫他的儿子到世界上最有智慧的人那儿,去学习幸福的秘密。少年于是穿越沙漠,跋涉了四十天,终于来到一座盖在山顶上的美丽城堡。那是智者住的地方。

他本以为会遇见一位摆脱尘俗的智者,结果他一踏入城堡大厅,却看见了闹哄哄的聚会,商人来来去去,人们挤在各个角落里聊天,一个小型的乐团正在演奏着抒情音乐,还有一张桌子上摆满了各式各样的美味佳肴。而智者正在跟每个人谈话,少年只好等候了两个小时,直到终于轮到他和智者说话。

智者专心听少年解释他来这里的原因,却说他没时间立刻解释幸福的秘密。他建议少年到四处去逛逛,两个小时后再回来。

“同时我也要你做一件事,”智者递给少年一根汤匙,匙上滴了两滴油。“当你在四处逛的时候,不要让油滴出来。”

男孩开始沿着城堡的楼梯爬上爬下,眼光却一刻未离开汤匙。两个小时后,他回到大厅,找到智者。

“好啦,”智者问,“你有没有看见挂在餐厅里的波斯壁毯?你有没有欣赏那个精心设计的主花园?那可是花了十年才造好的。你有没有注意到图书馆里那张美丽的羊皮纸呀?”

男孩觉得十分尴尬,坦承他根本什么也没注意看。他只全神贯注不让油滴出来。

“那就再回去欣赏这个城堡的美丽壮观吧!”智者说,“你不应该相信一个人,如果你不了解他的房子。”

于是少年就放松心情,开始探索这个城堡。这一次,他仔细地欣赏了天花板、地板,和樯上的绘画,他看了花园,也瞭望了四周的山景、美丽的花朵,还有各个精心挑选的艺术品。等再回到智者身边时,他仔细描述了他所见的一切。

“可是那些油呢?”智者问。

少年低头看汤匙,发现汤匙里的油早就没了。

“我只能提供你一个建议,”这个最有智慧的人说,“幸福的秘密就是去欣赏世界上所有的奇妙景观,但不要忘了汤匙里的油。”

lmk123 avatar Apr 01 '15 05:04 lmk123