Web端主流框架,jquery、angular、react、vue
不得不说,前端技术发展非常迅速,时不多久就有一个新的东西冒出来,并且迅速膨胀发展,让旁观者眼花缭乱,让开发者目眩神迷,但总体上来说,这波互联网大浪潮带动了前端技术的大发展,给曾经那些苦苦挣扎于DOM操作的页面工作者带来福音,也为前端技术的开发提出更高的要求。
我始终认为从 jquery 转到 angular 或 vue 是很困难的,这种困难体现在我们要从DOM驱动操作转换到数据驱动操作,从某个角度来说,DOM驱动是指,我们要在一段初始化的html代码上,简单暴力地加加减减,使显示的效果与我们的预期一致,而数据驱动,我个人认为,更像是对一份文档流的解析过程,这种解析过程是可预期的,正因为这种可预期性,使我们拥有了建构前端架构的可能性。
简单来比较一下三者:
从整体文件的典型架构来看:
jquery:
angular:
vue:
在一个大的jquery项目中,不同的页面内容是通过传统的html跳转,尽管我们可以将一些共有的 style 和 function 抽取出来复用,但在页面跳转的过程中,我们很难管理其中的一些状态保存和转移,难以满足一些复杂的交互场景。
angular项目,可通过ui-router来实现一个单页面应用,页面的跳转是可以通过监听hash的变化来实现的,所有的数据都通过$rootScope , $scope来绑定,通过 controller 来区隔各个 $scope 的边界,来操作数据,通过 service 来保存一些不常变化的内容, 通过 directive 来构建通过的组件,操作DOM,从而完成一个完整的前端项目。
Vue项目,同样可实现一个单页面应用,所有的页面其实都可以被组件化,而每个component的结构其实就是一个小的HTML,对于每个前端工程师的阅读十分友好,而通过 directive 来实现一些DOM的通性操作,从而完成一个完整的前端项目。
鉴于jquery只是一个方便操作DOM的工具,接下来对项目的具体分析,我们将忽略掉JQuery(但JQ确实是一个好的前端工程师帮手)。
首先我们来看一下两者的挂载方式
var app = angular.module('myApp', []);
app.controller('AppCtrl', ['$scope', function($scope) {
$scope.username = 'oxygen';
$scope.sayHello = function(){
console.log("hello" + $scope.username);
}
}])
const vue = new Vue({
el:"#app",
data() {
return {
username : 'oxygen',
}
},
methods:{
sayHello(){
console.log("hello" + this.username);
}
}
})
从上述简单的代码中,可以看出 angularJs 将所有的数据和方法都是挂载在$scope对象上,而 vueJs 的数据和方法分别挂载在vue对象的 data 和 methods 中上,这种挂载风格更加优雅,一切内容json格化,便于后期维护和阅读。
再谈两者双向绑定的不同
这两个都是基于MV*模式的框架,并且都提供了双向绑定,所谓双向绑定是指保证视图(View)与数据模型(Model)的一致性。
angular是基于脏检查机制的双向绑定。所谓脏检查,就是angular通过一些指令,如ng-click, ng-change等为$scope绑定一堆watcher表达式,而当其中一个数据发生变更后,就会对$scope上watcher绑定的所有数据和视图的绑定关系进行一次检测,识别是否有数据发生了改变,有变化进行处理,可能进一步引发其他数据的改变,所以这个过程可能会循环几次,一直到不再有数据变化发生后,将变更的数据发送到视图,更新页面展现。这种脏检查机制十分耗性能。
vue的双向绑定相对之下,显得更符合现代JS的语言特征。它使用 ES5 提供的 Object.defineProperty() 方法,监控对数据的操作,从而同步数据,这种精准的检查效率更高。
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter () {
const value = getter ? getter.call(obj) : val
if (Dep.target) {
dep.depend()
if (childOb) {
childOb.dep.depend()
if (Array.isArray(value)) {
dependArray(value)
}
}
}
return value
},
set: function reactiveSetter (newVal) {
const value = getter ? getter.call(obj) : val
/* eslint-disable no-self-compare */
if (newVal === value || (newVal !== newVal && value !== value)) {
return
}
/* eslint-enable no-self-compare */
if (process.env.NODE_ENV !== 'production' && customSetter) {
customSetter()
}
if (setter) {
setter.call(obj, newVal)
} else {
val = newVal
}
childOb = !shallow && observe(newVal)
//如果数据发生改变,通过dep.notify()通知所有的相关的watcher
dep.notify()
}
})
后谈项目感受
对于angular我还是蛮有感情的,毕竟用它开发了好几个项目,踩了很多坑(很多都是$scope绑定的坑),对这个框架的使用也有一定的感触和心得的。angular的学习门槛确实很高,它的很多概念在初期都是不太好理解的,比如controller 、 service 、 directive的使用情境,等等。但是它把我从DOM带到数据时代,因为它的全面,让我对前端有了一个宏观了解,比如vue+vue-router+vuex这三个东西在angular都可以找到相应的技术,此外,它的依赖注入在现在看来,它在出现的时候是相当先进的。但是,angular的组件化做的不完全,通常都是使用directive来做,但directive最好是不要接触数据的,这样违背了MV*的初衷,会造成很多潜藏的大坑,再一个,使用$scope和$rootScope绑定数据很容易会造成作用域的混乱。
对于vue,接触后我还是蛮喜欢的,它的组件化很好的维护了前端内容样式分离的思想(相对而言,不喜欢JSX),易于阅读和维护。并且组件之间的通信相对友好,加上vuex的使用,很容易管理各个组件,目前使用vue + vue-router + vuex + element-UI + webpack + node + mongoDB + mongoose编写了一个简单的后台管理系统,确实很爽。
一、jQuery
二、Angular
三、Vue
Web端主流框架,jquery、angular、react、vue的更多相关文章
- 前端三大主流框架的对比React、Vue、Angular
前端三大主流框架的对比React.Vue.Angular React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站, 并于 2013年 5 月开源.React 拥有较高的 ...
- python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...
- Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...
- 前端三大框架Angular & React & Vue
前端三大框架: Angular[Google]:一套框架,多种平台移动端 & 桌面端.学会用Angular构建应用,然后把这些代码和能力复用在多种多种不同平台的应用上 —— Web.移动 We ...
- 前端框架:Angular React 和 Vue的比较
前端这几年的技术发展很快,细分下来,主要可以分成四个方面: 1.开发语言技术,主要是ES6&7,coffeescript,typescript等: 2.开发框架,如Angular,React, ...
- vue仿微信网页版|vue+web端聊天室|仿微信客户端vue版
一.项目介绍 基于Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技术混合架构开发的仿微信web端聊天室— ...
- Python Web开发主流框架
Web 开发是Python 语言应用领域的重要部分,也是工作岗位最多的领域.如果你对基于Python的Web 开发有兴趣,正打算使用Python 做Web 开发,或者已经是一个Web 开发者有工作需要 ...
- 主流框架的搭建(VUE,React)
vue脚手架:cnpm install vue vue-cli -gvue init webpack/webpack-simple shuaige(新建文件夹的名字)cd shuaigecnpm in ...
- Liferay 7:如何在Liferay Portlet中使用Angular, React, Vue.js等前端框架
https://web.liferay.com/zh/web/ivan.zaera/blog/-/blogs/modern-frontend-workflows-in-liferay-portal L ...
随机推荐
- yii的url写法
Yii 各种url地址写法 echo Url::home(); 生成入口地址/yii2test/frontend/web/index.php: echo Url::base();生成入口文件夹地址: ...
- Object-C-Foundation-数组排序
系统类型排序; NSArray *goodsNames =@[@"computer",@"iphone",@"ipad"]; NSArray ...
- Azkaban-开源任务调度程序(安装篇)
最近项目迁移到新集群,试试同事推荐的开源任务调度程序-azkaban(阿兹卡班),没看错,就是哈利波特里的阿兹卡班,azikaban主要用来解决hadoop依赖任务的执行,但是它本身支持linux和j ...
- Linux基础命令---chgrp
chgrp 改变文件或者目录所属的群组,使用参数“--reference”,可以改变文件的群组为指定的关联文件群组. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.o ...
- php判断数组元素是否存在某个字符串的方法
php判断数组元素是否存在某个字符串的方法: 方法一:采用in_array(value,array,type) type 可选.如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同. ...
- NetSuite助力各行业企业快速发展
Oracle NetSuite今天发布了一系列全新技术创新,帮助各行各业企业提升收入.海外扩张以及赋能更多业务用户.最新推出的商务管理.财务管理和分析能力可协助企业利用NetSuite平台来超越客户预 ...
- Python入门之安装numpy和pandas
最近要对一系列数据做同比比较,需要用到numpy和pandas来计算,不过使用python安装numpy和pandas因为linux环境没有外网遇到了很多问题就记下来了. 首要条件,python版本必 ...
- Redis 如何保持和MySQL数据一致【二】
需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...
- Kali配置网络
虚拟机NAT网关:192.168.50.1 主机VM8网址:192.168.50.2 虚拟机网卡:192.168.50.30 vim /etc/network/interfaces # The loo ...
- Program Size
在Keil中编译工程成功后,在下面的Bulid Ouput窗口中会输出下面这样一段信息: Program Size: Code=6320 RO-data=4864 RW-data=44 ZI-d ...