前端框架用vue还是react?清晰对比两者差异( 四 )


vue2016 年 10 月 25 日,zeit.co背后的团队对外发布了 Next.js,一个 React 的服务端渲染应用框架 。几小时后,与 Next.js 异曲同工,一个基于 Vue.js 的服务端渲染应用框架应运而生,我们称之为:Nuxt.js 。
服务端渲染支持流式渲染,因为HTTP请求也是流式,Vue 的服务端渲染结果可以直接 pipe 到返回的请求里面 。这样一来,就可以更早地在浏览器中呈现给用户内容,通过合理的缓存策略,可以有效地提升服务端渲染的性能 。

  • 基于 Vue.js
  • 自动代码分层
  • 服务端渲染
  • 强大的路由功能,支持异步数据
  • 静态文件服务
  • ES2015+ 语法支持
  • 打包和压缩 JS 和 CSS
  • HTML 头部标签管理
  • 本地开发支持热加载
  • 集成 ESLint
  • 支持各种样式预处理器: SASS、LESS、 Stylus 等等
  • 支持 HTTP/2 推送
reactNext是一个React框架,允许使用React构建SSR和静态web应用
  • 服务器渲染,获取数据非常简单
  • 无需学习新框架,支持静态导出 。
  • 支持CSS-in-JS库
  • 自动代码拆分,加快页面加载速度,不加载不必要的代码
  • 基于Webpack的开发环境,支持模块热更新(HMR)
  • 支持Babel和Webpack自定义配置服务器、路由和next插件 。
  • 能够部署在任何能运行node的平台
  • 内置页面搜索引擎优化(SEO)处理
  • 在生产环境下,打包文件体积更小,运行速度更快
生命周期vue【初始化阶段(4个)】
(1)beforeCreate
此钩子函数不能获取到数据,dom元素也没有渲染出来,此钩子函数不会用来做什么事情 。
(2)created
此钩子函数,数据已经挂载了,但是dom节点还是没有渲染出来,在这个钩子函数里面,如果同步更改数据的话,不会影响运行中钩子函数的执行 。可以用来发送ajax请求,也可以做一些初始化事件的相关操作 。
(3)beforeMount
代表dom节点马上要被渲染出来了,但是还没有真正的渲染出来,此钩子函数跟created钩子函数基本一样,也可以做一些初始化数据的配置 。
(4)mounted
是生命周期初始化阶段的最后一个钩子函数,数据已经挂载完毕了,真实dom也可以获取到了 。
【运行中阶段(2个)】
(5)beforeUpdate
运行中钩子函数beforeUpdate默认是不会执行的,当数据更改的时候,才会执行 。数据更新的时候,先调用beforeUpdate,然后数据更新引发视图渲染完成之后,再会执行updated 。运行时beforeUpdate这个钩子函数获取的数据还是更新之前的数据(获取的是更新前的dom内容),在这个钩子函数里面,千万不能对数据进行更改,会造成死循环 。
(6)updated
这个钩子函数获取的数据是更新后的数据,生成新的虚拟dom,跟上一次的虚拟dom结构进行比较,比较出来差异(diff算法)后再渲染真实dom,当数据引发dom重新渲染的时候,在updated钩子函数里面就可以获取最新的真实dom了 。
【销毁阶段(2个)】
(7)beforeDestroy
切换路由的时候,组件就会被销毁了,销毁之前执行beforeDestroy 。在这个钩子函数里面,我们可以做一些善后的操作,例如可以清空一下全局的定时器(created钩子函数绑定的初始化阶段的事件)、清除事件绑定 。
(8)destoryed
组件销毁后执行destroyed,销毁后组件的双向数据绑定、事件监听watcher相关的都被移除掉了,但是组件的真实dom结构还是存在在页面中的 。
添加keep-alive标签后会增加active和deactive这两个生命周期函数,初始化操作放在actived里面,一旦切换组件,因为组件没有被销毁,所以它不会执行销毁阶段的钩子函数,所以移除操作需要放在deactived里面,在里面进行一些善后操作,这个时候created钩子函数只会执行一次,销毁的钩子函数一直没有执行 。
 
前端框架用vue还是react?清晰对比两者差异

文章插图
 
 
react【初始化阶段(5个)】:
(1)getDefaultProps:实例化组件之后,组件的getDefaultProps钩子函数会执行
这个钩子函数的目的是为组件的实例挂载默认的属性
这个钩子函数只会执行一次,也就是说,只在第一次实例化的时候执行,创建出所有实例共享的默认属性,后面再实例化的时候,不会执行getDefaultProps,直接使用已有的共享的默认属性
理论上来说,写成函数返回对象的方式,是为了防止实例共享,但是react专门为了让实例共享,只能让这个函数只执行一次
组件间共享默认属性会减少内存空间的浪费,而且也不需要担心某一个实例更改属性后其他的实例也会更改的问题,因为组件不能自己更改属性,而且默认属性的优先级低 。


推荐阅读