如何评价大漠穷秋的文章《Vue从Angular里面抄了哪些东西?》?

论坛 期权论坛 知乎     
知乎的用户   2019-8-16 02:16   12853   5
转载声明:本文由互联网用户自发贡献,部分转载来源来自知乎(zhihu.com),强烈建议您访问知乎查看完整内容。本社区不拥有所有权,也不承担任何法律责任。如有侵权,请联系optbbs@163.com。一经查实,即刻删除。
分享到 :
0 人收藏

5 个回复

倒序浏览
2#
热心回应  16级独孤 | 2019-8-16 02:16:57 发帖IP地址来自
先补充几个历史知识点。MVVM 这个,很多人都说过了,不赘述。数据绑定这个事情,IE6就原生支持。双向绑定,2003年成为W3C推荐标准的 XForms 里就有。要是当初浏览器厂商有点远见,在浏览器里实现了 XForms,以后的历史根本不会有 Angular 什么事情。
“抄袭”完全是泼脏水了。React社区有无数跟React几乎完全兼容的实现,facebook有任何人(胆敢)污蔑人家抄袭么?连当初minggleJS,我们也只是鄙视作者代码那么烂,都没骂抄袭呢。


说点题外话。
穷秋同学出道还是挺早的,圈内人缘原本还不错,前个月的TFC,穷秋还是嘉宾之一,我还正好跟他两人一桌吃午饭。不过当时我跟他尬聊时,就略感他对一些技术的历史认知有些偏激。本来,有观点是好事,但是得建立在相对准确的历史事实认知上才行。我想着以后有机会再聊好了。(呃,我还没跟别人吐槽过,现在就已经变成马后炮了。)不料这次搞了个大新闻。自作孽啊,眼见着要沦为比某当老师更惨的境地了(毕竟某当老师现在也不混前端,所以无所谓),一段时间内恐怕很难再在各技术会议的台上看到他了。因为不仅是认可Vue的人对他不满。React社区的,比如郭达峰,也看不下去。非前端社区的,比如左耳朵耗子,也看不下去(他在微博上回复“一个给国人争气,一个给国人丢脸,鲜明的对比。做个布道师不是这么没有下限的……”)。最惨的是,很可能连Angular圈子都混不下去了。之前两篇,主要搞(或曾经主要搞)Angular的业界同仁,比如徐飞、汤桂川等还能出来打打圆场,但现在这篇,真是没得洗,太low了。还有一点,我在其他地方评论里说了,穷秋找错对象了。论框架设计,你要去怼Avalon(正美不好意思又让你躺枪了),或许还能半斤八两;要是去怼RegularJS(海波不好意思,连累你也躺枪),我已觉得胜算堪忧。何况是Vue!!在前端框架这个Arena,小右是世界冠军级别的。随便都跟React核心团队、Angular核心团队的人(也就是穷秋的老板)谈笑风生。所以,各位蠢蠢欲动,想要搞大新闻的同学,以后一定要引以为戒啊,引以为戒!

3#
热心回应  16级独孤 | 2019-8-16 02:16:58 发帖IP地址来自
我不是来回答问题的。
只是想提醒在用Vue和Angular的学生,如果你学了用了Vue,就学下去,用下去。如果你学了Angular,就学下去,用下去。根本性的概念是相通的。我知道有些人耳根子软,听大神一句就立刻调转船头。
搞技术谁都有自己偏好,正常。但初学者在形成自己偏好前,请自觉忽略这些噪音,少既是多。本事先学到,再来论长短,而不是本事没学到,就东家长西家短。
4#
热心回应  16级独孤 | 2019-8-16 02:16:59 发帖IP地址来自
抄袭这个帽子扣的太大了,我觉得首先得确定“抄袭”的定义是什么,才能说你抄了我哪些东西。
计算机出现的数十年来,出现了极为庞大的编程语言、工具、软件、应用,细化到了比如密码学、通信学、图形学、PLT、软件工程、机器学习等等各种大领域,每个领域都有庞大的分支和深度,这里面有奠基者、有开拓者、有集大成者,更有很多站在巨人肩膀的普罗大众们。
就拿编程语言举例,现代编程语言影响最广的C语言,也从ALGOL 68、FORTRAN甚至是PL语言里借鉴了大量特性,如果说C语言用了a = 10;这个作为赋值语法,你其他语言就不能用的话,那么后来的编程语言该有多么苦逼啊。
不管vue还是angular,他们都是以JS编写的,而JS这门编程语言,从开始创建的时候就已经到处借鉴了,比如说它的语法、控制流来自于C语言,函数值、闭包来自于scheme,原型链来自于self,正则表达式借鉴当时大火的perl,而且还模仿java把数据分为原始值和对象。
如果按照这种扩大化的抄袭定义,那么JS这门编程语言几乎全是抄袭,事实上到了ES6时代,它的各种新添加的语法和特性,全部可以在其他编程语言里找到对应,就拿python做对比:
  • destructuring:  python早就支持 a,b,c = [1,2,3]    x,(y,z) = [2,(3,4)] 这种多层解构语法,ES6“抄袭”。
  • class: python早就支持class、super关键字,ES6“抄袭”。
  • default function parameters: python早几百年就function(a=1) 了,ES6“抄袭”。
  • rest parameters:es6新加的三点号函数参数,python只要一个function (*a)就可以让a变成一个参数tuple,ES6“抄袭”。
  • template literals: python的一个%操作符就可以做到的事情,ES6“抄袭”后还没法动态绑定变量。
  • generator:python在2002年就可以用yield语法解八皇后了,那个时候ES3.5还没有,ES6在十几年后“抄袭”。
  • iterator:python里大行其道的iterator也在ES6被“抄袭”。
  • module:ES6的import b from a“抄袭”了python是from a import b。
我在上面所有的抄袭二字上都加了引号,是因为我对于抄袭这两个字所承担的罪名看的比较重,我认为这个词不能轻飘飘的随便用,它是一种性质非常严重的指控。
回到本次问题上面,专栏文章列举出来很多相似特性,然后指控为抄袭,在加上文章的严厉措辞,这种基本上等同于战时檄文了。
然而我们稍微分析一下,能发现这篇文章有很多问题。
[h1]MVVM[/h1]文章一开始交待了传统表单的操作多么别扭,需要一个新的解决方案,于是前端引入mvvm就成了解决这个问题的一条路,这里vue涉嫌抄袭angular的双向绑定,但事实上:
  • mvvm思想不是angular提出来的,是在WPF时代被Cooper首先应用上的设计思想,它和MVC、MVP有很强的渊源,并不是凭空出现。
  • mvvm也不是由angular首先引入前端框架的,knockout可能是首个大规模引入该特性的前端框架。
  • mvvm只是一个思想,对于如何把数据和dom绑定,其实现上有很大不同,angular1.x的脏检查、vue的Object.defineProperty、更新框架用到的Proxy,甚至像avalon那种为了兼容IE而用上的vbscript。大家对于一道题的解法都不同,说抄袭太过了。
[h1]html-parser[/h1]angular1.x的时候就使用html-parser这个依赖了,但这不能断定vue用相同依赖就是抄袭。
事实上,vue以前是没有这个依赖的,vue1.x的编译流程也不是文章里所述的那样,而是直接采用了document的api来做的,用的最多的是document.createDocumentFragment,所以vue1.x有个局限性就是要求所有的template都合法。
Vue.js uses a DOM-based templating implementation. This means that all Vue.js templates are essentially valid, parsable HTML enhanced with some special attributes
vue2.x大改,不再使用DocumentFragment,为的是让parser和dom不耦合,分离了编译和渲染这两个阶段,加入vdom这个过渡并不是为了监听数据变化(vue随时都能知道哪个数据改变了),而是为了能支持更多平台,所以才能有vue-ssr或者weex这样工具出现。
拿vue2.x加入了html-parser来说明抄袭angular,真的是搞错了。
vue一开始不用html-parser有其理由,加入html-parser也有其理由,和angular1.x是否用了html-parser真的没关系。
[h1]filters[/h1]
  • filters这个特性用来解决同一数据不同展示的需求,既不是angular开创的,也不是angular首先引入前端的。
  • 后端mvc时代,各种后端语言(例如php)模板里就已经有filters这个特性了
  • angular之前的前端模板时代,采用helper func的实际上就是filters的变种
  • filters这个特性的思想可以追溯到pipe,但在前端应用上它基本上是format、helper这种功能,改名为pipe不见得就比filters更能表达意思。
[h1]directive[/h1]文章说了angular1.x没有突出组件,所以大量使用directive,随后断定vue也是这个情况,但事实并非如此。
vue的directive和angular1.x的directive完全不是一个概念,它一开始就把component和directive的功能分开了,所以用户一直使用的是component,而极少使用directive,这个可不是angular那种directive满地爬的情况。
如果按照文章的逻辑,angular应该是“抄袭”了vue,因为vue一直是把两者分开的,vue的directive完全没有什么模板功能,只是一个附带的扩充功能而已。
至于原文里那句标粗的大字:“一直在抄袭,几乎没原创”,恶意太大了。


最近三天发了三篇文章怼vue,引发了一场前端圈撕逼热潮,各种圈外的人士也纷纷笑看热闹,各种站队的、吃瓜的、泼水的、搅水的、蹭热点的络绎不绝。
现在是树欲静而风不止,但这件事情最终会消停的,看客们也会回归日常或者追下一个乐子,谁也伤害不了谁,甚至可以说对于angular或者vue的口碑的影响也不会很大,未来这两个框架份额如何,很难说,但不会因为一次喷口水推广就能让份额大增或者大降。
有句老话叫一山不容二虎,但若一山真的只有一只老虎的话,老虎很快就会灭绝了。
5#
热心回应  16级独孤 | 2019-8-16 02:17:00 发帖IP地址来自
逐条反驳
“双向数据绑定”的设计思想最早是在微软的.NET实现的,2009年,AngularJS 1.x第一个把这种思想应用到了前端开发领域。现在,几乎所有前端开发框架都接受了“双向数据绑定”的设计思想,当然也包括一直不断抄袭的Vue。
照作者的逻辑,如果实现先后算是后实现的抄的先实现的,那大家都抄的WPF。
再让我们看看到底是不是AngularJS第一个把MVVM带到前端。我clone了几个流行的js MVVM框架,我们看第一次commit的时间:
AngularJS:2010-01-06

Vue.js:2013-07-28

Knockout:2010-07-05



avalon:2013-06-09
ember:2011-05-24
CanJS:2010-02-11
乍一看,好像AngularJS确实是“第一个”。但是我们别忘了,那只是first commit,不是一个可用的版本,那又怎么能算是“2009年,AngularJS 1.x第一个把这种思想应用到了前端开发领域”这样的话来呢?况且,first commit是在2010年。
更新:@Trotyl Yu 聚聚指出:Hello World,  is here AngularJS的Github 的 Repo 是后面抽出来的。那上面这段就不成立了,大家见笑

如果真的实现了这样一种“绑定机制”,你会发现,上面那种“面条”代码全部都会被消除掉,前端代码量会突然被大幅度简化。从这个角度说,“双向数据绑定”是目前评判一款前端框架是否优秀的核心要素。
React哭晕在厕所


注意看下面的对比
如何才能检测到某个JS对象的值被修改了:AnguarJS 1.x里面给了一个很粗暴的实现来解决这个问题,AngularJS 1.x会为每一个进行数据绑定的HTML标签创建一个watcher。然后,当发生任何可能会导致数据模型被修改的情况下,就会启动一轮$digest循环,把所有watcher全部运行一遍,看看有没有东西需要自己更新(目前Vue的实现思想与此类似,它底层使用了Object.defineProperty)
对,Vue底层是使用了Object.defineProperty,AngularJS确实用的dirty check。
可能有人不懂这些是什么,我简单说明一下。
要实现双向绑定,肯定要实现“怎样知道某个值变动了”这么一个机制。那么我们可以怎么得知哪个值变动了呢?有两种办法。
一种是,我一直去扫描它。比如我扫描的上一次a是1,我把这个1记住。下一次扫描的时候,发现a变成了2,跟我记住的值不一样,那么这个值就变了,可以通知其他机制进行同步。这叫dirty check,也就是AngularJS采用的办法。这种办法会遭遇ABA问题,就是,在一个扫描周期内,触发了两次赋值:a初始值是1,a=2,a=1。那这时候,扫描到的值没变,但实际上已经变过了。
还有一种是,我既然要更改这个值,那我肯定有个操作进行了更改。那么,我注入这个操作,然后让这个操作更改完成后,给我发一个通知,我就知道这个值变了,也就是Vue.js 1.x采用的办法。Object.defineProperty可以定义属性的setter,那么有人调用setter改动这个值的时候,我就能进行值是否变动的确认。不说Vue有多高效,但AngularJS是真的低效。当然,Angular已经解决了这个问题,也就就变成了所说的第二种办法。(此处说法有误,见评论区)

恭喜Vue,以后VDom就是你的“核心特性”了,可以挺直腰板对外宣称,Vue比React的渲染速度还要快!
也恭喜React社区,你们迎来了史上最强大的抄袭者。它会把最核心的设计思想全部抄走,然后再把自己宣传得比原版还要强大好多倍。
再看看Vue.js的文档:对比其他框架 — Vue.js
React 社区为我们准确进行平衡的考量提供了非常积极的帮助,特别感谢来自 React 团队的 Dan Abramov 。他非常慷慨的花费时间来贡献专业知识来帮助我们完善这篇文档。
不想多说




再到html parser这里,我没懂作者想表达什么。不是很懂。附原文:
这里面有一步操作需要“编译”开发者自定义的指令(组件),所以,我们需要一个parser,然后我们非常欣喜地看到Vue-2.0.0-alpha.1里面引入了和AngularJS 1.x同一款开源的htmlparser,请看图:
(图片略)
当然,这个地方有可能是个巧合,毕竟英雄所见略同嘛。对于Vue历次发布的版本,我正在和AngularJS 1.x的各个版本做详细的源代码交叉对比。我会尽量详细阅读每个版本的代码,看看Vue是如何从一个只有2760行代码(VueJS 0.6.0,含注释)的小玩具,一步一步抄到今天这么庞大的,希望源代码里面不要出现让人更加尴尬的情况。
引用同一个库有什么问题?为什么要被喷?John Resig是AngularJS的人吗?htmlparser是专门给AngularJS准备的吗?不是很懂。
6#
热心回应  16级独孤 | 2019-8-16 02:17:01 发帖IP地址来自
首先,不得不承认vue早期参考了angular,编程风格和双向绑定等等,后来也借鉴了react的一些思想,virtual-dom,jsx,单向数据流。
先说一下这些概念,双向绑定,虚拟dom,jsx,单向数据流等这些新技术出现,都是对老技术的革命性的改进,能淘汰或替代老技术,在这一方面,angular和react不一定是最先的开创者,但是因为它们,这些概念得到了普及,他们的优秀自然是公认的。但是,拥抱新技术就叫抄袭吗?如果好的技术不被推广和使用,人类如何进步?你可以这么想,比如设计模式IOC控制反转肯定不是你发明的,你在写代码中使用了这个模式,你为自己抄袭设计模式感到羞愧吗?你当然不会,你反而会自豪我用了这么一个高级的东西。
其次,Vue并不是简单抄袭这些概念,vue基本上实现angular和react大部分优秀的部分,看性能,看体积,比灵活性,客观数据请看这个 对比其他框架 — Vue.js,一个框架能实现了当前最优秀的技术,而且能保持灵活性和较小的体积和较高的性能,这个就是艺术,当你能做出比这个更好的框架,再喷他不迟。我一路是从angular1,react到vue,而且不太想再回到react了,不是我用了react、vue或者angular,我就牛逼了,而是我用他们做出了什么,所以我们不应该更关注的是开发效率和灵活性和性能吗?这一方面我觉得vue胜出。
再次,说一下框架抄袭这个问题
你难道是希望我们的所有框架完全没有任何公共点?这就叫原创吗?这是你希望看到的吗?
你真的有精力永不知疲倦去学每一个完全不一样的新框架吗?
前端技术本来就是颠覆式的发展,曾经的头牌jquery,现在门前冷落鞍马稀。曾经的amd、cmd的模块化requirejs,seajs,都已经被立上了墓碑。5年前你会java,今天你应该还会,5年前你会前端,对不起,今天不一样了。这些颠覆大部分是源于javascript出生时先天缺陷,现在已经逐步的完善和强壮。我不希望这种颠覆式发展是持久的,作为一个常态更因该是累积式发展的。所以我更希望我们的框架表面都长一个样,但背后各有各的优点和优势。
你做了一个手机,然后别人做了类似的手机,你可以说人家抄袭你,但人们真正买他手机的原因肯定是因为他背后的用心和品质让别人感受到了。同样,真正让人选择vue的原因不是他抄袭了angular和react,而是它表现出来的各种优点。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:4265
帖子:853
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP