V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
temberature
V2EX  ›  问与答

Angularjs 现在是前端 mv 框架的首选吗?如果是,为什么没有著名的产品呢?

  •  
  •   temberature · 2015-08-18 23:18:27 +08:00 via iPad · 7037 次点击
    这是一个创建于 3415 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2015-08-19 11:51:15 +08:00
    一些 angularjs 的统计数据
    http://trends.builtwith.com/javascript/Angular-JS
    https://builtwith.angularjs.org/
    使用了的产品
    https://www.google.com/trends/explore#q=angularjs%2C%20ember.js%2C%20backbone.js%2C%20react.js%2C%20avalon.js&cmpt=q&tz=Etc%2FGMT-8
    各大框架的 google 搜索趋势
    http://www.infoq.com/research/top-javascript-mvc-frameworks/
    网友投票
    http://pic3.zhimg.com/a8858cefeb0c7cd6b8431becf5bc7a3e_b.jpg
    http://todomvc.com/
    teahour 上有 vue 的访谈,大家可以去听下 (也有不同框架见的比较,我也听了)
    周边统计

    http://ionichina.com/topic/55af62210c6a8c0e05f82ed3
    “ AngularJS 当初是提供给设计人员用来快速构建 HTML 表单的一个内部工具。”我想这句话能说明很多。

    写前端代码没多久,说些浅见: AngularJS 适合前期快速迭代,在精细的控制上可以不太适合, 2.x 之所以有如此大的变化,应该也是为了在两者间取得更好的平衡。
    无论如何选择,最终面向的是产品需求,在精通 A 的情况下,相信也对 B 、 C 等等的特性有着更好的理解。
    现在感觉还没有某一款框架明显超越别的,应该是发展阶段的原因,选择是一方面,使用又是一方面,随着自己的经验的积累肯定会对不同框架和框架内的使用有着更好的判断,最后应该是殊途同归的。
    77 条回复    2015-08-20 09:22:20 +08:00
    zsx
        1
    zsx  
       2015-08-18 23:21:08 +08:00   ❤️ 1
    NemoAlex
        2
    NemoAlex  
       2015-08-18 23:21:50 +08:00
    因为并不是
    FrankFang128
        3
    FrankFang128  
       2015-08-18 23:28:20 +08:00
    是吧,就是入门比较难,概念太多。
    grzhan
        4
    grzhan  
       2015-08-18 23:44:31 +08:00
    收藏,想看看回复里会不会推荐分享其他的框架(比如 Vue ?),看看有没有分享的有关实践,然后看看会不会吵起来。
    chengzhoukun
        5
    chengzhoukun  
       2015-08-18 23:50:50 +08:00
    知乎上阿里前端工程师说他们在部分产品上用了 react
    plqws
        6
    plqws  
       2015-08-19 00:00:53 +08:00
    ES6+ 实现简单的 MVC 框架挺简单的吧,自己写一个也许会更好?用编码成本代替学习成本,还能学到不少东西呢~
    jarlyyn
        7
    jarlyyn  
       2015-08-19 00:09:06 +08:00
    喜欢 react+backbones.
    jarlyyn
        8
    jarlyyn  
       2015-08-19 00:16:25 +08:00
    Angularjs
    最大的有点也是最大的缺点就是

    他自己提供了一整套方案。替换不易。

    然后, 1.x 和 2.x 还不兼容……

    Angularjs,react+backbones,ko,纯 backbones 都试过。

    纯以做项目来说,Angularjs 的确上手最快。基本一个统一的模式。

    但还是 react+backbones 更容易和别的代码做结合。
    Phariel
        9
    Phariel  
       2015-08-19 00:19:05 +08:00
    并不是, AngularJS 我认为过几年会自己被自己玩残,死倒不可能,框架并不像产品一样说没就没。(对,我就是说的 Reader )
    chairuosen
        10
    chairuosen  
       2015-08-19 00:22:16 +08:00
    只 mvvm 首选 vue
    df4VW
        11
    df4VW  
       2015-08-19 00:46:17 +08:00
    angular 算是入门最容易了的吧。。为啥说难
    maxiujun
        12
    maxiujun  
       2015-08-19 01:06:41 +08:00
    没人提 ember.js , 真的很小众吗?
    ChanneW
        13
    ChanneW  
       2015-08-19 01:07:36 +08:00
    lightening
        14
    lightening  
       2015-08-19 01:26:35 +08:00
    越到后来坑越多……
    jruif
        15
    jruif  
       2015-08-19 01:31:53 +08:00 via iPhone
    @lightening 能说说都遇到了那些坑吗?
    lightening
        16
    lightening  
       2015-08-19 01:52:07 +08:00
    @jruif
    Angular 的特点就是双向绑定。一个页面上的 input 可以和一个变量绑定,再把这个变量和一个 label 绑定的话,就能实现 input 输入的同时 label 跟着变了。整个页面的构成都是靠双向绑定建立的反馈环。
    当页面加载时,整个反馈系统开始运作,互相变来变去,直到形成一个稳定的状态,所有变量之间的制约关系都被满足为止。

    这样一开始是很好的,但是有一个致命问题——不存在类似“$(document ).ready ”这个 event 。因为 document 永远在动态平衡中。于是如果 Angular 程序想要和外部 js 服务通信,基本是没法把握这个时机的。目前我们知道的唯一办法就是手动延迟 2 秒,然后加载外部服务,比如 Google Analytics 等。

    另外就是加载时序的问题。经常有一个 directive 和另一个 directive 互相比赛谁先获取到需要的数据,然后呈现随机的结果……
    mongodb
        17
    mongodb  
       2015-08-19 03:21:58 +08:00
    总想起当年 Python 的 Zope
    ChefIsAwesome
        18
    ChefIsAwesome  
       2015-08-19 05:51:01 +08:00 via Android
    完全不是。坑多难学,骂成狗。
    loading
        19
    loading  
       2015-08-19 07:27:35 +08:00 via Android
    teahour 上有 vue 的访谈,大家可以去听下
    virusdefender
        20
    virusdefender  
       2015-08-19 08:27:28 +08:00
    简单用的话 强烈推荐 avalon
    juneszh
        21
    juneszh  
       2015-08-19 08:36:09 +08:00
    @lightening 用.$watch 解决 ready 问题会不会好点
    morethansean
        22
    morethansean  
       2015-08-19 09:20:01 +08:00
    @lightening 没太明白你的 ready 的问题,能解释一下吗?
    qw7692336
        23
    qw7692336  
       2015-08-19 09:22:44 +08:00
    temberature
        24
    temberature  
    OP
       2015-08-19 09:42:23 +08:00 via iPhone
    @NemoAlex 那请问有什么可推荐的吗?
    learnshare
        25
    learnshare  
       2015-08-19 09:44:34 +08:00
    大概是用的最广泛的,不过可能不是最好的
    temberature
        26
    temberature  
    OP
       2015-08-19 09:47:42 +08:00 via iPhone
    @FrankFang128 先忘掉原先的开发思路,感觉入门还行,就是特定问题无法很好利用前人的代码
    temberature
        27
    temberature  
    OP
       2015-08-19 09:49:35 +08:00 via iPhone
    @grzhan 看来你是推荐 vue 的了,哈哈😄
    temberature
        28
    temberature  
    OP
       2015-08-19 10:20:12 +08:00
    @chengzhoukun 能分享下链接吗:)
    temberature
        29
    temberature  
    OP
       2015-08-19 10:21:41 +08:00
    @plqws 产品上用 ES6 还是不太行吧 ES6 转 ES5 应该还是不完善
    plqws
        30
    plqws  
       2015-08-19 10:23:40 +08:00
    @temberature 嗯,当然不是现在,不过现在很多项目都开始转 ES6 了,转译器的效果也都还不错。
    zythum
        31
    zythum  
       2015-08-19 10:28:55 +08:00
    Angular 适合用于做快速原型开发。小规模的网站开发。代码越多维护成本越大。
    ljbha007
        32
    ljbha007  
       2015-08-19 10:35:00 +08:00
    @lightening 可以写在 app.run 里边 或者用 directive
    temberature
        33
    temberature  
    OP
       2015-08-19 10:43:03 +08:00
    @ChefIsAwesome 那有什么推荐的吗
    temberature
        34
    temberature  
    OP
       2015-08-19 10:44:07 +08:00
    @Phariel 为什么说会被自己玩残呢?
    temberature
        35
    temberature  
    OP
       2015-08-19 10:45:58 +08:00
    @virusdefender 那如果是产品上用呢
    temberature
        36
    temberature  
    OP
       2015-08-19 10:48:00 +08:00
    @learnshare 想起了 yy 是最好的 xx
    temberature
        37
    temberature  
    OP
       2015-08-19 10:49:50 +08:00
    @zythum 那中上规模有什么推荐的吗
    temberature
        38
    temberature  
    OP
       2015-08-19 10:52:03 +08:00
    @qw7692336 这个项目大概意味着,其实现在没有那个框架优于其他,所以自己按个尝尝,喜欢哪个用哪个吧
    hxtheone
        39
    hxtheone  
       2015-08-19 10:55:15 +08:00
    @lightening 非常同意,在我看来双向绑定虽然简化了数据的获取和 dom 的更新操作,但是让整个应用的 lifecycle 变的很混乱

    @morethansean 我觉得他说的是在 angular 里没有一个清晰的事件走向,比如有时候我们需要在所有的 dom 都 render 完成后进行一些操作,但是在 angular 里是不知道什么时候 dom 都 ready 了的,因为数据和 dom 都处在动态平衡的状态,我们的写的一个操作很可能在这个平衡达到之前就执行了,这时就只能用$watch 或者手动 setTimeout 来让应用按照预期的方式运行

    这个我觉得是一个普遍的痛点,君不见 stackoverflow 上一堆问 angular 怎么实现 afterRender callback 的= =
    summic
        40
    summic  
       2015-08-19 10:56:34 +08:00
    微众银行 APP 算不算著名?
    temberature
        41
    temberature  
    OP
       2015-08-19 10:57:59 +08:00
    @zsx 能说说 angularjs 专攻在或者适合怎么用吗?
    ChefIsAwesome
        42
    ChefIsAwesome  
       2015-08-19 11:02:44 +08:00 via Android
    先学习 flux ,很实在的一种设计模式,简单,扩展性好。学会之后找个你觉得合适的实现 flux 的 library 。 view 那层用 react , vue 等等,找个你觉得简单易用的 data binding 的库。 react 流行度高,相关的讨论,插件会更多。
    用小而精的 library ,按照你自己的想法构建程序是趋势。
    zythum
        43
    zythum  
       2015-08-19 11:03:35 +08:00
    中上规模的时候就不应该问别人了。中上规模应该已经有一个完善的系统了。你应该分析自己现有的系统,结合之后的项目走向来选择。并不是说用哪个就是哪个的。就好比 react 做的不错,但是 react 只是个 view 框架路由啊,数据处理啊, io 通信啊什么的都没有。你还需要自己搞。任何框架都有利弊,需要找适合你的。
    不然需要前端架构师干嘛。直接网上找个框架就 OK 了。
    ttph1oc
        44
    ttph1oc  
       2015-08-19 11:05:22 +08:00
    国内的话有 Worktile 、知乎日爆;国外就多了去了,详见 https://builtwith.angularjs.org/
    ttph1oc
        45
    ttph1oc  
       2015-08-19 11:06:59 +08:00
    说错了,不是知乎日爆,是知乎专栏。
    zsx
        46
    zsx  
       2015-08-19 11:11:07 +08:00
    @temberature Angular 2.x 没看过。窃以为 Angularjs 特别适用于如后台这种,中小型网站且需要大量前后端数据交互的场景;或者是需要大量逻辑代码控制 View 这种。要是搞个大型的……你说为啥人家要造 2.0 ……
    其实现在的前端框架,无论是 Angular 还是 Vuejs 还是 React ,都是蛮多坑的……是项目挑选框架,选一个能解决项目痛点问题的框架用吧……

    @hxtheone @lightening +1 我目前的解决方案是 directive 里面$timeout (0 )再 scope.$emit ……

    (轻喷)
    akinoniku
        47
    akinoniku  
       2015-08-19 11:30:29 +08:00
    我在负责一份从 12 年开始写的 angular 项目, JS 3w 行,质量蛮不错的,运行稳定,性能也够好。

    说 Angular 坑多的同学恐怕是只学了个一知半解然后把它当 Library 用的
    pljhonglu
        48
    pljhonglu  
       2015-08-19 11:50:48 +08:00
    用在移动端应该是个不错的选择~
    micate
        49
    micate  
       2015-08-19 12:11:52 +08:00
    @summic 刚刚下载试用,体验几乎不可用啊,各种界面叠压错乱
    magicdawn
        50
    magicdawn  
       2015-08-19 13:00:35 +08:00
    sodatea
        51
    sodatea  
       2015-08-19 13:04:31 +08:00
    个人觉得并不是首选
    著名产品的话,饿了么 PC 站不知道算不算一个
    可以考虑试一下 vue
    temberature
        52
    temberature  
    OP
       2015-08-19 13:39:15 +08:00 via iPhone
    @zythum 常见的应用之间的差别没有那么大吧,无论小或大的应用,总有些共通的体制,每个具体的应用都可以在这个框架上扩展,甚至修改框架本身以适应自己的需要。
    temberature
        53
    temberature  
    OP
       2015-08-19 13:40:36 +08:00 via iPhone
    @pljhonglu 为什么是移动端不是 pc 端呢
    zonghua
        54
    zonghua  
       2015-08-19 13:41:36 +08:00
    使用 ng 给人的错觉就是这个网站相应速度好快啊 https://www.iosx.me/
    temberature
        55
    temberature  
    OP
       2015-08-19 13:50:55 +08:00
    @zonghua 感觉这个和 ng 不是那么相关,主要还是分步渲染的结果吧
    pljhonglu
        56
    pljhonglu  
       2015-08-19 13:51:41 +08:00
    @temberature
    一方面移动端多是 single page APP ,交互逻辑简单,感觉 angular 比较合适。
    另一方面 pc 端还是觉得服务器渲染比较好些,页面逻辑复杂使用 JS 渲染的效率还是有些差。
    temberature
        57
    temberature  
    OP
       2015-08-19 13:51:55 +08:00
    @ChefIsAwesome 有时间应该去看看 flux ~
    temberature
        58
    temberature  
    OP
       2015-08-19 13:58:36 +08:00
    @pljhonglu 1 、 angular 好像确实不适合交互逻辑,但移动端惯性滑动、下拉刷新类似的功能,好像是很基本的交互需求, angular 支持并不好
    2 、服务端渲染影响最大的是不是 SEO ,效率上还没感到太大差别
    pljhonglu
        59
    pljhonglu  
       2015-08-19 14:08:20 +08:00
    @temberature SEO 确实是个问题,我也觉得客户端渲染比较好,这样服务器只需要提供结构化数据就可以了, APP 和 PC 的开发方式可以统一了。但是本人不是前端开发,对 JS 并不擅长,只是觉得 angular 这种把所有文件全部加载然后内部渲染的方式可能会引起效率低下,然而并没有测试过。。。
    kenshinhu
        60
    kenshinhu  
       2015-08-19 14:09:54 +08:00
    还有 大大的 EXTJS 和 dojo 什么什么(这个忘了叫什么)
    EchoChan
        61
    EchoChan  
       2015-08-19 14:12:46 +08:00   ❤️ 1
    temberature
        62
    temberature  
    OP
       2015-08-19 14:27:48 +08:00
    @pljhonglu
    “关于异步加载, AngularJS 的开发指南中大概这样说:
    AngularJS 的模块只关注依赖注入,不关注脚本是怎么加载的。 目前已经有项目来处理脚本加载, 可以和 AngularJS 一起使用。 模块在加载的过程中什么都没做, 可以按照任意顺序加载, 因此脚本加载器可以使用这个特性进行并发加载。” http://beginor.github.io/2014/12/20/angularjs-controller-load-on-demand.html
    我也还没用到,分享只说明下一起加载不是唯一。
    temberature
        63
    temberature  
    OP
       2015-08-19 14:30:01 +08:00
    @EchoChan 枯坐半小时,没看出联系:(
    EchoChan
        64
    EchoChan  
       2015-08-19 14:34:28 +08:00
    @temberature 也是用 angularjs 的啊~不过不出名而已。
    temberature
        65
    temberature  
    OP
       2015-08-19 14:44:30 +08:00
    @EchoChan 哦~~原来是这个意思,只关注路由器了,而现在我好奇的是,你是怎么发现的?
    jsq2627
        66
    jsq2627  
       2015-08-19 15:07:50 +08:00
    饿了么在用
    pljhonglu
        67
    pljhonglu  
       2015-08-19 15:36:37 +08:00
    @temberature 谢谢分享~
    lightening
        68
    lightening  
       2015-08-19 15:51:36 +08:00
    @ljbha007 run 只是在页面开始 interpolate 的时候执行,但是有的代码我要它在页面完成 interpolate 的时候再执行
    @juneszh 那也算是一种方法,但是各种 watcher 混在代码里会让整个代码很混乱
    @zsx 还有一个办法是套在 ng-if 里,那就算是监视一个变量了
    zsx
        69
    zsx  
       2015-08-19 15:59:28 +08:00
    @lightening 套 ng-if 确认不会让逻辑变得很混乱(至少从代码层面上看?)
    @pljhonglu SEO 的解决方案是服务器按照和客户端相同的路由输出数据,这个数据反正没人看只要有 HTML 标签就行。不过既然这样还不如不用呢。 BTW, Google 能抓 Angular 的网站。
    如果你说 PC 端效率问题的话,那手机 WebView 简直要哭了……
    zythum
        70
    zythum  
       2015-08-19 17:39:39 +08:00
    @temberature 如果你想要大而全就不灵活,灵活就难以管理。都是有权衡的。如果你想要大而全推荐 emberjs 。
    ljbha007
        71
    ljbha007  
       2015-08-19 18:01:33 +08:00
    @lightening 我的经验是这种情况一般都可以找到别的时候来执行
    qq12365411
        72
    qq12365411  
       2015-08-19 18:09:12 +08:00
    路过,支持 Angular
    temberature
        73
    temberature  
    OP
       2015-08-19 18:11:02 +08:00 via iPhone
    @zythum 我想咱俩说的是底层库和框架的区别,意思是一致的。谢谢推荐~
    temberature
        74
    temberature  
    OP
       2015-08-19 18:12:44 +08:00 via iPhone
    @qq12365411 小心社区指南哟:)
    br00k
        75
    br00k  
       2015-08-19 22:56:04 +08:00
    @lightening 你需要用 promise 来解决异步的问题。
    lightening
        76
    lightening  
       2015-08-19 23:29:51 +08:00
    @br00k 我不是要用一个某个 function 的结果,而是要 angular 自身 interpolate 完成后开始执行一个 function …… 不太清楚如何用 promise 解决这个问题?
    juneszh
        77
    juneszh  
       2015-08-20 09:22:20 +08:00
    最近几周尝试用 ng 写了两个基于微信的红包小游戏(XX 钱罐 不知道这里有人玩过不), 其实还蛮好用, 总结下:

    1.不用一直 dom 来 dom 去. 有点类似后端+smarty 的感觉
    2.灵活性没那么大(相对 jq ), 双向绑定是一把双刃剑.
    3.微信支持度不是 100%, 会有一点点小问题, 特别是在 ng 调用他们的 jssdk 的话
    4.里面有各种坑(其实 jq 也不少)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1224 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:00 · PVG 02:00 · LAX 10:00 · JFK 13:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.