抄袭这个帽子扣的太大了,我觉得首先得确定“抄袭”的定义是什么,才能说你抄了我哪些东西。
计算机出现的数十年来,出现了极为庞大的编程语言、工具、软件、应用,细化到了比如密码学、通信学、图形学、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的口碑的影响也不会很大,未来这两个框架份额如何,很难说,但不会因为一次喷口水推广就能让份额大增或者大降。
有句老话叫一山不容二虎,但若一山真的只有一只老虎的话,老虎很快就会灭绝了。
|