精华内容
下载资源
问答
  • 本文将会浅析Hadoop生态的发展历程及其中部分组件的技术原理,最终就Hadoop是否会被Spark取代给出结论。 一、Hadoop的核心组件 在对Hadoop核心组件进行介绍之前,我们需要先了解Hadoop解决了什么问题。Hadoop...

    Hadoop和Spark都是目前主流的大数据框架,但是随着Spark在速度和易用性方面表现出的优势,一些国内外专家逐渐推崇Spark技术,并且认为Spark才是大数据的未来。本文将会浅析Hadoop生态的发展历程及其中部分组件的技术原理,最终就Hadoop是否会被Spark取代给出结论。

     

     

    一、Hadoop的核心组件

    在对Hadoop核心组件进行介绍之前,我们需要先了解Hadoop解决了什么问题。Hadoop主要就是解决了大数据(大到一台计算机无法进行存储,一台计算机无法在要求的时间内进行处理)的可靠存储和处理。

     

    Hadoop的核心组件主要有三个,分别是:HDFS、YARN和MapReduce。HDFS是是google三大论文之一的GFS的开源实现,是一个高度容错性的系统,适合部署在廉价的机器上的,适合存储海量数据的分布式文件系统。而YARN是Hadoop的资源管理器,可以视为一个分布式的操作系统平台。相比于HDFS和YARN,MapReduce可以说是Hadoop的核心组件,以下会就MapReduce进行重点讨论。

     

    MapReduce,通过简单的Mapper和Reducer的抽象提供一个编程模型,可以在一个由几十台上百台的PC组成的不可靠集群上并发地,分布式地处理大量的数据集,而把并发、分布式(如机器间通信)和故障恢复等计算细节隐藏起来。而Mapper和Reducer的抽象,又是各种各样的复杂数据处理都可以分解为的基本元素。这样,复杂的数据处理可以分解为由多个Job(包含一个Mapper和一个Reducer)组成的有向无环图(DAG),然后每个Mapper和Reducer放到Hadoop集群上执行,就可以得出结果。

     

    在MapReduce中,Shuffle是一个非常重要的过程,正是有了看不见的Shuffle过程,才可以使在MapReduce之上写数据处理的开发者完全感知不到分布式和并发的存在。

     

     

    广义的Shuffle是指图中在Map和Reuce之间的一系列过程。

     

     

     

    二、Hadoop的局限和改进

    尽管Hadoop提供了处理海量数据的能力,但是Hadoop的核心组件——MapReduce的使用问题还是一直困扰着Hadoop的发展,MapReduce的局限主要可以总结为以下几点:

    • 抽象层次低,需要手工编写代码来完成,使用上难以上手

    • 只提供两个操作,Map和Reduce,表达力欠缺

    • 一个Job只有Map和Reduce两个阶段(Phase),复杂的计算需要大量的Job完成,Job之间的依赖关系是由开发者自己管理的

    • 处理逻辑隐藏在代码细节中,没有整体逻辑

    • 中间结果也放在HDFS文件系统中

    • ReduceTask需要等待所有MapTask都完成后才可以开始

    • 时延高,只适用Batch数据处理,对于交互式数据处理,实时数据处理的支持不够

    • 对于迭代式数据处理性能比较差

     

    比如说,用MapReduce实现两个表的Join都是一个很有技巧性的过程,如下图所示:

    因此,在Hadoop推出之后,出现了很多相关的技术对其中的局限进行改进,如Pig,Cascading,JAQL,OOzie,Tez,Spark等,下面就对一些重要技术进行重点的讨论。

     

    1.Apache Pig

    Apache Pig是Hadoop框架中的一部分,Pig提供类SQL语言(Pig Latin)通过MapReduce来处理大规模半结构化数据。而Pig Latin是更高级的过程语言,通过将MapReduce中的设计模式抽象为操作,如Filter,GroupBy,Join,OrderBy,由这些操作组成有向无环图(DAG)。例如如下程序就描述了数据处理的整个过程。

     

    visits       = load ‘/data/visits’ as (user, url, time);gVisits      = group visits by url;visitCounts  = foreach gVisits generate url, count(visits);urlInfo      = load ‘/data/urlInfo’ as (url, category, pRank);visitCounts  = join visitCounts by url, urlInfo by url;gCategories  = group visitCounts by category;topUrls = foreach gCategories generate top(visitCounts,10);store topUrls into ‘/data/topUrls’;
    

    而Pig Latin又是通过编译为MapReduce,在Hadoop集群上执行的。上述程序被编译成MapReduce时,会产生如下图所示的Map和Reduce:

     

     

    Apache Pig解决了MapReduce存在的大量手写代码,语义隐藏,提供操作种类少的问题。类似的项目还有Cascading,JAQL等。

     

    2.Apache Tez

    Apache Tez,Tez是HortonWorks的Stinger Initiative的的一部分。作为执行引擎,Tez也提供了有向无环图(DAG),DAG由顶点(Vertex)和边(Edge)组成,Edge是对数据的移动的抽象,提供了One-To-One,BroadCast,和Scatter-Gather三种类型,只有Scatter-Gather才需要进行Shuffle。

     

    以如下SQL为例:

    SELECT a.state, COUNT(*),AVERAGE(c.price)FROM aJOIN b ON (a.id = b.id)JOIN c ON (a.itemId = c.itemId)GROUP BY a.state

     

     

    图中蓝色方块表示Map,绿色方块表示Reduce,云状表示写屏障(write barrier,一种内核机制,可以理解为持久的写),Tez的优化主要体现在:

    • 去除了连续两个作业之间的写屏障

    • 去除了每个工作流中多余的Map阶段(Stage)

       

    通过提供DAG语义和操作,提供了整体的逻辑,通过减少不必要的操作,Tez提升了数据处理的执行性能。

     

    3.Apache Spark

    Apache Spark是一个新兴的大数据处理的引擎,主要特点是提供了一个集群的分布式内存抽象,以支持需要工作集的应用。

     

    这个抽象就是RDD(Resilient Distributed Dataset),RDD就是一个不可变的带分区的记录集合,RDD也是Spark中的编程模型。Spark提供了RDD上的两类操作,转换和动作。转换是用来定义一个新的RDD,包括map, flatMap, filter, union, sample, join, groupByKey, cogroup, ReduceByKey, cros, sortByKey, mapValues等,动作是返回一个结果,包括collect, reduce, count, save, lookupKey。

     

    Spark的API非常简单易用,Spark的WordCount的示例如下所示:

    val spark = new SparkContext(master, appName, [sparkHome], [jars])val file = spark.textFile("hdfs://...")val counts = file.flatMap(line => line.split(" "))                 .map(word => (word, 1))                 .reduceByKey(_ + _)counts.saveAsTextFile("hdfs://...")

     

    其中的file是根据HDFS上的文件创建的RDD,后面的flatMap,map,reduceByKe都创建出一个新的RDD,一个简短的程序就能够执行很多个转换和动作。

     

    在Spark中,所有RDD的转换都是是惰性求值的。RDD的转换操作会生成新的RDD,新的RDD的数据依赖于原来的RDD的数据,每个RDD又包含多个分区。那么一段程序实际上就构造了一个由相互依赖的多个RDD组成的有向无环图(DAG)。并通过在RDD上执行动作将这个有向无环图作为一个Job提交给Spark执行。

     

    例如,上面的WordCount程序就会生成如下的DAG:

    scala> counts.toDebugStringres0: String =MapPartitionsRDD[7] at reduceByKey at <console>:14 (1 partitions)  ShuffledRDD[6] at reduceByKey at <console>:14 (1 partitions)    MapPartitionsRDD[5] at reduceByKey at <console>:14 (1 partitions)      MappedRDD[4] at map at <console>:14 (1 partitions)        FlatMappedRDD[3] at flatMap at <console>:14 (1 partitions)          MappedRDD[1] at textFile at <console>:12 (1 partitions)            HadoopRDD[0] at textFile at <console>:12 (1 partitions)

     

    Spark对于有向无环图Job进行调度,确定阶段(Stage)分区(Partition)流水线(Pipeline)任务(Task)缓存(Cache),进行优化,并在Spark集群上运行Job。RDD之间的依赖分为宽依赖(依赖多个分区)和窄依赖(只依赖一个分区),在确定阶段时,需要根据宽依赖划分阶段。根据分区划分任务。

     

     

    Spark支持故障恢复的方式也不同,提供两种方式,Linage,通过数据的血缘关系,再执行一遍前面的处理,Checkpoint,将数据集存储到持久存储中。

     

    Spark为迭代式数据处理提供更好的支持。每次迭代的数据可以保存在内存中,而不是写入文件。

     

    Spark的性能相比Hadoop有很大提升,2014年10月,Spark完成了一个Daytona Gray类别的Sort Benchmark测试,排序完全是在磁盘上进行的,与Hadoop之前的测试的对比结果如表格所示:

     

     

    从表格中可以看出排序100TB的数据(1万亿条数据),Spark只用了Hadoop所用1/10的计算资源,耗时只有Hadoop的1/3。

     

    Spark的优势不仅体现在性能提升上的,Spark框架为批处理(Spark Core),交互式(Spark SQL),流式(Spark Streaming),机器学习(MLlib),图计算(GraphX)提供一个统一的数据处理平台,这相对于使用Hadoop有很大优势。

     

     

    特别是在有些情况下,你需要进行一些ETL工作,然后训练一个机器学习的模型,最后进行一些查询,如果是使用Spark,你可以在一段程序中将这三部分的逻辑完成形成一个大的有向无环图(DAG),而且Spark会对大的有向无环图进行整体优化。

     

    例如下面的程序:

    val points = sqlContext.sql(   “SELECT latitude, longitude FROM historic_tweets”)  val model = KMeans.train(points, 10)  sc.twitterStream(...)   .map(t => (model.closestCenter(t.location), 1))   .reduceByWindow(“5s”, _ + _)

     

    这段程序的第一行是用Spark SQL 查寻出了一些点,第二行是用MLlib中的K-means算法使用这些点训练了一个模型,第三行是用Spark Streaming处理流中的消息,使用了训练好的模型。

     

     

     

    三、总结

    我们可以借助于逻辑电路来理解MapReduce和Spark。如果说MapReduce是公认的分布式数据处理的低层次抽象,类似逻辑门电路中的与门,或门和非门,那么Spark的RDD就是分布式大数据处理的高层次抽象,类似逻辑电路中的编码器或译码器等。

     

    RDD就是一个分布式的数据集合(Collection),对这个集合的任何操作都可以像函数式编程中操作内存中的集合一样直观、简便,但集合操作的实现却是在后台分解成一系列Task发送到几十台上百台服务器组成的集群上完成的。最近新推出的大数据处理框架Apache Flink也使用数据集(Data Set)和其上的操作作为编程模型的。

     

    由RDD组成的有向无环图(DAG)的执行是调度程序将其生成物理计划并进行优化,然后在Spark集群上执行的。Spark还提供了一个类似于MapReduce的执行引擎,该引擎更多地使用内存,而不是磁盘,得到了更好的执行性能。

     

    基于此,Spark针对于Hadoop的一些局限进行了解决:

    • 抽象层次低,需要手工编写代码来完成,使用上难以上手

      =>基于RDD的抽象,实数据处理逻辑的代码非常简短

    • 只提供两个操作,Map和Reduce,表达力欠缺

      =>提供很多转换和动作,很多基本操作如Join,GroupBy已经在RDD转换和动作中实现

    • 一个Job只有Map和Reduce两个阶段(Phase),复杂的计算需要大量的Job完成,Job之间的依赖关系是由开发者自己管理的

      =>一个Job可以包含RDD的多个转换操作,在调度时可以生成多个阶段(Stage),而且如果多个map操作的RDD的分区不变,是可以放在同一个Task中进行

    • 处理逻辑隐藏在代码细节中,没有整体逻辑

      =>在Scala中,通过匿名函数和高阶函数,RDD的转换支持流式API,可以提供处理逻辑的整体视图。代码不包含具体操作的实现细节,逻辑更清晰

    • 中间结果也放在HDFS文件系统中

      =>中间结果放在内存中,内存放不下了会写入本地磁盘,而不是HDFS

    • ReduceTask需要等待所有MapTask都完成后才可以开始

      => 分区相同的转换构成流水线放在一个Task中运行,分区不同的转换需要Shuffle,被划分到不同的Stage中,需要等待前面的Stage完成后才可以开始

    • 时延高,只适用Batch数据处理,对于交互式数据处理,实时数据处理的支持不够

      =>通过将流拆成小的batch提供Discretized Stream处理流数据

    • 对于迭代式数据处理性能比较差

      =>通过在内存中缓存数据,提高迭代式计算的性能

     

    因此,Hadoop MapReduce会被新一代的大数据处理平台替代是技术发展的趋势,而在新一代的大数据处理平台中,Spark目前得到了最广泛的认可和支持。

     

    最后,我们通过Lambda Architecture的一个案例作为结束和补充,Lambda Architecture是一个大数据处理平台的参考模型,如下图所示:

     

     

    其中包含3层,Batch Layer,Speed Layer和Serving Layer,由于Batch Layer和Speed Layer的数据处理逻辑是一致的,如果用Hadoop作为Batch Layer,而用Storm作为Speed Layer,你需要维护两份使用不同技术的代码

     

    而Spark可以作为Lambda Architecture一体化的解决方案,大致如下:

     

    • Batch Layer,HDFS+Spark Core,将实时的增量数据追加到HDFS中,使用Spark Core批量处理全量数据,生成全量数据的视图

    • Speed Layer,Spark Streaming来处理实时的增量数据,以较低的时延生成实时数据的视图

    • Serving Layer,HDFS+Spark SQL(也许还有BlinkDB),存储Batch Layer和Speed Layer输出的视图,提供低时延的即席查询功能,将批量数据的视图与实时数据的视图合并

     

    通过这个案例,我们也可以再一次重申上述结论,Spark是可以取代MapReduce从而成为Hadoop系统中不可或缺的一部分,但是无法取代Hadoop生态。

     

    END

    更多干货内容请关注微信公众号“录信数软”~

    展开全文
  • 不仅仅因为通过上下文机制实现了客户端和服务器交互简单化目的,更为了flask的生态发展,可插拔式组件开发提供了很好支持。什么是Flask中上下文?从生活中理解Flask上下文假设说你要去取快递(发送请求)...

    本文基于python的Flask框架,分享其上下文机制的实现和原理。在Flask中,上下文机制是最核心的概念之一。不仅仅是因为通过上下文机制实现了客户端和服务器交互简单化的目的,更为了flask的生态发展,可插拔式的组件开发提供了很好的支持。

    cceeb78d77e14963c914013c7cce68c0.png

    什么是Flask中的上下文?

    从生活中理解Flask的上下文

    假设说你要去取快递(发送请求),你来到了快递站点,然后你需要告诉工作人员你的快递单号,你的电话号码等个人信息,工作人员才会在系统中(系统中的信息可以理解为已经创建好的上下文代理,只有当你的信息需要被需要时,才会动态生成你的信息)查找,会根据你的提货码将快递取出给你(根据你提供的上下文信息给出响应),并在系统中修改为此快递已被取走(删除此次的上下文信息)

    专业化的解释

    上下文其实就是你向服务器发送请求时所需要的'资料'(包括请求参数,配置,验证等等),需要的时候取资料,用完则释放

    flask中的上下文变量有哪些

    flask中的上下文变量一共有4个,分为两类,分别是请求上下文和应用上下文

    请求上下文:request和session

    request:客户端的请求参数session:作为用户唯一标志,一般用来做用户登录状态的记录等

    程序上下文:current_app和g

    current_app:指向当前应用实例g:一次请求中的全局变量,负责加载当前请求的一些操作,比如说连接数据库,响应结束,连接关闭

    源码解读

    先来看看上下文变量在哪里,怎么写的

    38c32f7ff99ffcf8888b27057949f1e2.png

    我们知道Proxy是代理的意思,那么也就是说,这几个上下文变量其实都是通过代理类实现的,我们研究下这个代理类

    代理类

    1f53f9e6822ed8dacfb7e2cabc7632fc.png

    实例方法中,object.__setattr__(self, "_LocalProxy__local", local)这个写法可能有人不太理解,其实等价于self.__local = local

    其实就是类的私有变量(双下划线属性)进行外部调用的写法

    这个local是必须要传进来的变量,是一个偏函数,那么啥叫偏函数?

    偏函数

    51d7e522b42b4b95c2dc3437520604bf.png

    通过上述我们知道偏函数其实就是调用原有函数,只不过可以添加需要传递的参数,这样在后面调用偏函数时就可以少传递几个变量,那么我们看下上下文变量的偏函数都干了什么(用request举例)

    4b4dba34f153b43dbc5a5811da827019.png

    总结来说:上下文变量request就是通过代理类拿到了请求上下文的RequestContext中的request属性,这个request属性拥有客户端请求的所有参数。

    既然属性已经拿到了,就可以使用request.method,request.args等方式进行调用客户端参数,这个调用的原理又是什么呢?

    既然是request对象进行调用,而request又是LocalProxy的代理类的对象,我们知道,"对象点方法"的使用,是去类中寻找__getattr__方法,那么我们看下这个方法

    LocalProxy.__getattr__方法

    这个方法基于反射原理,实现了动态取request对象中存在的方法,看下源码

    a1c46c9f42791313426f395a2c0b1d83.png

    通过上述的过程,request对象成功的找到了method方法。同理,但凡是需要使用的客户端的请求参数,就是在这里根据不同的name进行反射提取

    其他几个上下文变量实现的方法大同小异,都是通过代理类(除了current_app),偏函数,反射实现,这里就不作一一的解释了。

    应用上下文作用和意义

    官方文档

    应用上下问存在的主要原因是,在过去,请求上下文被附加了一堆函数,但是又没有什么好的解决方案。因为 Flask 设计的支柱之一是你可以在一个 Python 进程中拥有多个应用。

    那么代码如何找到“正确的”应用?在过去,我们推荐显式地到处传递应用,但是这会让我们在使用不是以这种理念设计的库时遇到问题。

    解决上述问题的常用方法是使用后面将会提到的current_app代理对象,它被绑定到当前请求的应用的引用。既然无论如何在没有请求时创建一个这样的请求上下文是一个没有必要的昂贵操作,应用上下文就被引入了。

    我的理解

    这样设计的优势在于上下文的推送和删除是动态进行的,如果需要使用,则动态的加载,不需要使用,则放在内存中不用管。

    我是一名奋战在编程界的pythoner,工作中既要和数据打交道,也要和erp系统,web网站保持友好的沟通……时不时的会分享一些提高效率的编程小技巧,在实际应用中遇到的问题以及解决方案,或者源码的阅读等等,欢迎大家一起来讨论!如果觉得写得还不错,欢迎关注点赞,谢谢。

    展开全文
  • 技术的发展产生了程序员这个职位,从这些年各大互联网公司曝光一些员工收入水平来看,程序员工资还是相对比较高,可是我们在互联网上还听到了另外一种声音,很多程序员想转行,特别大龄程序员,这可能会令...

    开头

    技术的发展产生了程序员这个职位,从这些年各大互联网公司曝光的一些员工收入水平来看,程序员的工资还是相对比较高的,可是我们在互联网上还听到了另外一种声音,很多程序员想转行,特别是大龄程序员,这可能会令很多人纳闷。为什么工资这么高还想转行呢?其实他们也很无奈,从下面几点可以看得出来。

    Android高级知识点

    一、Android性能优化

    1.描述一下android的系统架构?

    2.Android线程间通信有哪几种方式

    3. 如何避免OOM异常

    4.Android程序运行时权限与文件系统权限的区别?

    5.Hybrid 通信原理是什么,有做研究吗?

    6.Framework工作方式及原理,Activity是如何生成一个view的,机制是什么

    7.ANR是什么?怎样避免和解决ANR

    8.Devik进程,linux进程,线程的区别

    9.卡顿 {如何检测卡顿,卡顿原理是什么,怎么判断页面响应卡顿还是逻辑处理造成的卡顿} ,BlockCanary 的原理

    二、Android热修复、插件化、组件化

    1.谈谈对 ClassLoader 的理解

    2.自定义 ClassLoader

    3.插件化为什么会出现,如何代码加载,资源加载,代理 Hook)

    4.如何从一个老项目一步步实现组件化,主要问思路,考察架构能力和思考能力。(需要考虑很多,每一步做什么,顺序很重要)

    5.组件化和模块化的理解与区别?

    6.class文件加载Dex原理

    7.Gradle自动补丁包生成原理

    三、Android Framework、 ROM定制、Ubuntu、Linux之类的问题

    1.Binder 机制(IPC、AIDL 的使用)

    2.Activity 启动流程,App 启动流程

    3.Android 图像显示相关流程,Vsync 信号等

    4.为什么使用 Parcelable,好处是什么

    5.AMS 、PMS

    6.类加载机制

    7.Ubuntu编译安卓系统

    8.对Dalvik、ART虚拟机有什么了解?

    9.JVM内存区域,开线程影响哪块内存

    四、架构设计和设计模式

    1.MVC MVP MVVM原理和区别

    2.项目中常用的设计模式

    3.说说EventBus作用,实现方式,代替EventBus的方式

    4.Fragment如果在Adapter中使用应该如何解耦?

    5.实现一个Json解析器(可以通过正则提高速度)

    6.从0设计一款App整体架构,如何去做?

    7.Fragment如果在Adapter中使用应该如何解耦?

    8.谈谈你对Android设计模式的理解

    五、算法

    1.手写一个冒泡排序

    2.快速排序的过程、时间复杂度、空间复杂度

    3.蚁群算法与蒙特卡洛算法

    4.两个不重复的数组集合中,求共同的元素。

    5.2000万个整数,找出第五十大的数字?

    6.求1000以内的水仙花数以及40亿以内的水仙花数

    7.写出你所知道的排序算法及时空复杂度,稳定性

    8.二叉树给出根节点和目标节点,找出从根节点到目标节点的路径

    六、网络和安全机制

    1.TCP的3次握手和四次挥手

    2.HTTP与HTTPS的区别以及如何实现安全性

    3.App 是如何沙箱化,为什么要这么做?

    4.谈谈你对WebSocket的理解

    5.请解释安卓为啥要加签名机制?

    6.HTTP1.0与2.0的区别

    7.视频加密传输

    8.https中哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解?

    七、Flutter相关

    1.Flutter 中的生命周期

    2.Widget 和 element 和 RenderObject 之间的关系?

    3.Flutter中的Widget、State、Context 的核心概念?是为了解决什么问题?

    4.State 对象的初始化流程?

    5.讲一下flutter的几个特点/优缺点

    6.Flutter 如何与 Android iOS 通信?

    7.说一下什么是状态管理,为什么需要它?

    8.说一下 BLoC 模式?

    最后

    如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

    最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

    需要资料的朋友可以点击我的腾讯文档免费领取

    ter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

    需要资料的朋友可以点击我的腾讯文档免费领取
    展开全文
  • 1. 前端框架的发展历史 前端工程师( 攻城狮 ) 12年左右 html css + div 13年左右 js 加入 jquery 14年左右 MVC angular1.0 react 15年 vue研发 16年左右 vue 微信小程序 2. Vue.js第一次使用 什么是框架?什么是...

    1. 前端框架的发展历史

    前端工程师( 攻城狮 )
    12年左右 html css + div
    13年左右 js 加入 jquery
    14年左右 MVC angular1.0 react
    15年 vue研发
    16年左右 vue 微信小程序

    2. Vue.js第一次使用

    1. 什么是框架?什么是库

    框架是有一套自己的生态系统的
    库是没有自己的生态系统的, 它就是一个工具

    1. 查看vue.js的源代码

    2. 暂时学习使用的是 全局变量 形式

    3. jsx( javascript + xml )

    4. 总结vue.js第一次使用

    • 使用script标签引入Vue.js
    • 实例化全局暴露的变量Vue构造器函数得到一个实例
    • 配置Vue构造器函数中的配置项,一个配置项一个功能
      • el – 将id为app的一部分DOM结构当做模板传入配置项,然后挂载在页面中
      • data – 用来定义数据的
    • 将数据展示在视图中,通过使用 双大括号语法 ( mustache 语法 ) 来展示数据
    • 这时候我们发现在我们的模板(DOM结构)中可以使用 javascript语法,那么我们把这个类型称之为 ‘jsx语法糖’
    • 当我们将数据修改后发现,视图就会更新,这种情况我们称之为‘数据驱动(视图)’
    <script src="vue.js"></script>
    <script>
      // console.log( Vue )  function  Vue( options ) {}
    
      /* 
        学习的是  Vue构造函数中的options  和  vm身上的属性和方法
      */
    
    var vm = new Vue({
          el: '#app', // 将id为app的一部分DOM结构当做模板传入配置项,然后挂载在页面中
          data: {
              msg: 'hello Vue.js'
          }
      })
    
      console.log(vm)
    </script>
    
    1. 既然Vue是一个框架, 那么它使用了什么架构模式?
    • 目前我们市面上基本上是以 MVC 这个架构思维 为主
    • Vue使用 MVC 的衍生的模式,这个模式叫做 MVVM
    • MVC
    • Backbone.js
    • MVP
    • MVVM
    1. 名词解释:
      • M Model 表示数据
      • V View 表示视图
      • P/C/VM Presenter/Controller/ViewModel(视图模型) 表示就是逻辑
    • Vue使用的是MVVM

    • Vue中 VM改变,那么 V也会改变 , 反之也是一样的, 我们称之为 ‘双向数据绑定’

    数据驱动/ 双向数据绑定的原理 / 深入响应式的原理

      -当我们将数据写在data选项时, Vue会通过observer将data对象中的所有的属性都设置上getter和setter
    
      -当我们将数据绑定在视图时,自动触发getter,会将默认值,展示在视图
      -当我们通过视图修改数据是, 会自动触发setter,将数据修改,同时视图也会发生更新
    
    • 双向数据绑定
       <div id="app">
        <h3> VMV 跟着变 </h3>
        <p> {{ msg }} </p>
        <h3> V变 Vm也跟着变 </h3>
        <input type="text" v-model = "msg">
      </div>
    </body>
    <script src="./vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        data: {
          msg: 'hello Vue.js '
        }
      })
    </script>
    
    • 双向数据绑定原理
      V -> VM

      VM -> V

      -这个是使用了es5中的一个特性,这个特性叫做 Object.definedPropty( obj, 对象的属性, 配置项)

      Object.definedPropty
      配置项:
      1. 属性是否可写
      2. 属性是否可以遍历
      3. 存储器
      get 函数 和 set 函数 也称之为 getter && setter

      数据 驱动只和存储器有关系

    var box = document.querySelector('.box')
        var input = document.querySelector('input')
        var obj = {
          a: ' I love you '
        }
    
        Object.defineProperty( obj , 'a' , {
          get () {
            return 'I do not love you ' //设置当前属性的初始值
          },
          set ( value ) {
            console.log( value )
            box.innerHTML = value
            console.log( obj )
          }
        })
        input.onchange = function () {
          obj.a = input.value
          return ;
        }
        box.innerHTML = obj.a
    
    展开全文
  • vue基础与原理

    2019-05-22 21:40:59
    vue 1.前端框架的发展历史 前端工程师(攻城狮) ...13.js加入 & jquery 14.MVC angular1.0 ...库没有自己的生态系统,他就是一个工具 jsx(javascript+xml) 使用script标签引入Vue.js 实例化全局暴露变量...
  • Spark是什么

    2020-05-17 21:35:03
    目录 1.什么是Spark 2.为什么使用Spark 3.Spark特点 4.Spark体系架构 5.Spark运行机制及原理分析 ...目前,Spark生态系统已经发展成为一个包含多个子项目集合,其中包含SparkSQL、Spark St.
  • 不仅仅因为通过上下文机制实现了客户端和服务器交互简单化目的,更为了flask的生态发展,可插拔式组件开发提供了很好支持。 文章目录01 什么是Flask中上下文?生活中上下文模型专业化解释02 flask中...
  • 自Facebook在2013年5月开源React,经历了7年多的发展,react社区生态体系非常庞大,若是使用react来构建小程序,那么在小程序开发中可以充分利用 React 生态体系中大量技术沉淀(比如:react-use、field-form)。...
  • 如今它也出现在了汽车里面,随着智能驾驶不断发展,传感器已成为打造汽车生态的主要砝码之一,无论是激光雷达、毫米波雷达、摄像头等,都将成为日后必要的配件。下面我们就来科普一下毫米波雷达到底是什么?此文分两...
  • spark 核心原理及运行架构spark 系列前言Spark 简介Spark 发展史Spark是什么?Spark 生态及运行原理spark 生态圈Spark主要特点Spark 与 Hadoop 对比优势Spark使用情况常见问题spark运行架构spark基础运行架构图...
  • 前几天,有小伙伴面试的时候被面试官问:谈谈Ajax的原理~ 他说回答得不太好。我想,Ajax有什么原理?不就是发请求拿数据渲染页面吗?抱着怀疑即寻求真理的想法,我重新梳理了一遍Ajax的发展过程。发现Ajax简直凭...
  • HaaS生态硬件积木库总纲

    千次阅读 多人点赞 2021-01-02 13:15:14
    传感器是什么呢? 有人说:传感器存在和发展,让物体有了触觉、味觉和嗅觉等感官,让物体慢慢变得活了起来。 也有人说:传感器是人类五官延长,又称之为电五官,是人类在研究自然现象和规律以及生产活动不可...
  • 生态Ajax基础

    2012-02-06 22:12:15
    之前写了一遍blog,很笼统的说了说Ajax的原理.新年来的第一个周末,从新来温故知新一下. 1.什么是Ajax Ajax不是一种技术,实际上,他由几种蓬勃发展的技术以新的强大方式组合而成的. 基于XMLHTML和CSS标准的表示...
  • 当然,在设计选择和开发容器技术团队使用DevOps过程中,DevOps实践迅猛普及将使容器生态系统受益。 由于这种并行发展,在生产中使用容器可以教会团队DevOps基本知识及其三大Struts: 三种方式 。 流动...
  • Hbase是什么 hbase历史 Hbase开始于谷歌发表一片论文《大表:一个半结构化数据分布式存储...hbase加入hadoop生态为hbase社区发展带来了巨大便利,但是依赖于hdfs和MapReduce使得hbase不太适合处理小数据。 hbas
  • 《软件定义存储:原理,实践与生态》作者,同时也微信公众号”乐生活与爱IT” 作者,本文由作者授权发布。 一、什么是超融合架构(HCI)?“2012年8月,VCE CTO办公室Steve Chambers,在其博客中首次提出Hyper ...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 204
精华内容 81
关键字:

发展生态的原理是什么