@
clino 我举的例子就是官方的方案,官方文档和翻译都比较坑,没有很明确地说明其实可以和压缩器友好相处,详情可以看 $inject 的文档。
司徒说的其实这样:angular.controller('MainCtrl', function($scope){}) -> angular.controller('MainCtrl', function(a){}),因为 AngularJS 的黑技术原因,需要 $scope 保持 $scope 这个名字,理解成字符串匹配好了,匹配不了,就认为这有错。
angular.controller('MainCtrl', ['$scope', function($scope){}]) 就像 source map,明确告诉 AngularJS,函数参数的第一个变量,就叫 $scope,这样 AngularJS 就知道找什么对象。另一个用法:
function MainCtrl ($scope) {}
MainCtrl.$inject = ['$scope']
一样的效果。我手头的 AngularJS 全部都是经过 uglify.js 压缩的,用的是 CoffeeScript,都正常运行。
上手难度的问题嘛,别说我没碰到问题,比如 $httpProvider 自定义 headers 的坑……只不过大部分都可以通过 StackOverflow、文档解决,所以谈不上坑,这也就是我说的社区力量。
关于性能的问题,你的话也有问题,「性能明显有问题 vs 性能较好」,本身就有答案。事实上 AngularJS 真不是有问题(
http://jsperf.com/angularjs-vs-backbone http://jsfiddle.net/jashkenas/CGSd5/ )。
$parse getter 的效率
http://jsperf.com/angularjs-parse-getter/4但 AngularJS 不适合重型 app 是事实,看这个
http://jsperf.com/angularjs-digest/2 :利用 $new 建立了 100 个 $scope,每个 $scope 还要设立 100 个 $watch,在 Chrome v30 里只有可怜巴巴的 2000 ops/sec(AngularJS 版本是 1.0.1/1.0.2)。
拿 10s 和 1s 比,傻子也知道该选 1s,但 10ms 和 100ms,就没所谓了。这就是为什么
http://builtwith.angularjs.org/ 里的项目有 10 页之多。
我认为司徒对性能过度偏执,就是这个原因。比如 forEach 等方法和 for loop 的选择,司徒会毫不犹豫选择 for loop 吧,毕竟在 Chrome v29 里 forEach 跑 7000 ops/sec 的时候,for loop 是 20000 ops/sec 的(
http://jsperf.com/for-vs-foreach/100 ),但是一秒跑 7000 ops/sec 对我来说足够满足大部分场景,所以我喜欢:
if ( arr.some(function(item){ return item == whatever } ) { /* do something */ }
or
arr.some(function(item){ if (item == whatever) { /* do something */; return true; })
而不是:
for (var i = arr.length; i--;) {
if (arr[i] == whatever) { /* do something */ }
}
我对性能的看法是,针对场景选择最适合的,比如说,不管是什么 MVVM 都不可能比得上 elem.innerHTML 的效率,算上下载的体积,生成模板必定比不上 doT 等模板库(不算额外库,doT.js 3,324 bytes, AngularJS 1.2.0rc2 91,028 bytes,Ember.js 235,368 bytes,屌爆了有没有)。