前端框架 - kylin-qin/Blog GitHub Wiki

框架带来的操作转变

从事件驱动到数据驱动,将交互的逻辑从DOM的操作转化为对数据的处理,提高开发效率。

 1.事件驱动,经典作Jquery(关注点在DOM上)

 <div id="main">你好世界</div>
 
 $('#main').on('click', function () {
   $(this).html('你好朋友')
 })

 2. 数据驱动,例如Vue(关注点在数据上)
 <div id="main"><div v-on:click="hello">{{message}}</div></div>

 var app = new Vue({
   el: '#main',
   data: {
     message: '你好世界'
   },
   methods: {
     hello: function () {
       this.message= '你好朋友'
     }
   }
 })

三大主流框架

React

React 是一个采用声明式,高效而且灵活的用来构建用户界面的框架。 并不能算完整的MVC框架,只是View。

class ShoppingList extends React.Component {
  render() {
    return (
      <div className="shopping-list">
        <h1>Shopping List for {this.props.name}</h1>
        <ul>
          <li>Instagram</li>
          <li>WhatsApp</li>
          <li>Oculus</li>
        </ul>
      </div>
    );
  }
}

// 通过这种标签语法来使用我们上面声明的组件: <ShoppingList name="Mark" />

特点:

  1. JSX语法,为函数式的 UI 编程方式打开了大门。
  2. 组件化& Props & State。
  3. 高效,虚拟DOM和Diff算法, 最小化页面重绘。

虚拟DOM:
React将DOM抽象为虚拟DOM,虚拟DOM其实就是用一个对象来描述DOM,通过对比前后两个对象的差异,最终只把变化的部分重新渲染,提高渲染的效率。
为什么用虚拟dom,当dom反生更改时需要遍历 而原生dom可遍历属性多大231个 且大部分与渲染无关 更新页面代价太大。

Diff算法:
当你使用React的时候,在某个时间点 render() 函数创建了一棵React元素树。
在下一个state或者props更新的时候,render() 函数将创建一棵新的React元素树。
React将对比这两棵树的不同之处,计算出如何高效的更新UI(只更新变化的地方)。

React下的React-Native

React-Native 看起来很像 React,只不过其基础组件是原生组件而非 web 组件。
React-Native 框架分析:

  • Java层:该层主要提供了Android的UI渲染器UIManager(将JavaScript映射成Android Widget)以及一些其他的功能组件(例如:Fresco、Okhttp)等,在java层均封装为Module,java层核心jar包是react-native.jar,封装了众多上层的interface,如Module,Registry,bridge等。

  • C++层:主要处理Java与JavaScript的通信以及执行JavaScript代码工作,该层封装了JavaScriptCore,执行对js的解析。基于JavaScriptCore,Web开发者可以尽情使用ES6的新特性,如class、箭头操作符等,而且 React Native运行在JavaScriptCore中的,完全不存在浏览器兼容的情况。Bridge桥接了java , js 通信的核心接口。JSLoader主要是将来自assets目录的或本地file加载javascriptCore,再通过JSCExectutor解析js文件。

  • Js层:该层提供了各种供开发者使用的组件以及一些工具库。 Component:Js层通js/jsx编写的Virtual Dom来构建Component或Module,Virtual DOM是DOM在内存中的一种轻量级表达方式,可以通过不同的渲染引擎生成不同平台下的UI。component的使用在 React 里极为重要, 因为component的存在让计算 DOM diff 更高效。 ReactReconciler : 用于管理顶层组件或子组件的挂载、卸载、重绘。
    公寓锁B端APP项目:

Angular

AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。
AngularJS有着诸多特性,最为核心的是:MVVM、模块化、自动化双向数据绑定、语义化标签、依赖注入等等。

<!doctype html>
<html ng-app>
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script>
  </head>
  <body>
    <div>
      <label>Name:</label>
      <input type="text" ng-model="yourName" placeholder="Enter a name here">
      <hr>
      <h1>Hello {{yourName}}!</h1>
    </div>
  </body>
</html>

一个完整的前端解决方案
在构建WEB应用的前端时,Angular提供的不是一个部分解决方案,而是一个完整的解决方案。它能够处理所有你写过的混杂了DOM和AJAX的代码,并能够将它们组织的结构良好。这使得Angular在决定应该怎样构建一个CRUD应用时显得甚至有些“偏执(opinionated)”,但是尽管它“偏执”,它也尝试确保使用它构建的应用能够灵活的适应变化。

下面是Angular的一些出众之处:
构建一个CRUD应用时可能用到的所有技术:数据绑定、基本模板指令、表单验证、路由、深度链接、组件重用、依赖注入。
可测试性:单元测试、端到端测试、模拟对象(mocks)、测试工具。
拥有一定目录结构和测试脚本的种子应用。

Vue

Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<div id="app">
  {{ message }}
</div>
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})

特点:

  • 小而简单
  • 双向绑定
  • 组件化-模块化
    Vue和React很相似,只是写法不一样。

各框架的对比:

  • 纯模板引擎:最少的就是纯模板引擎,只管状态到界面的映射。

  • React和Vue:其实这两者都是非常专注的只做状态到界面映射,以及组件。

  • Backbone:它会给你多一些架构上指导,比如它会让你分层。

  • Angular:它做的事情就更多,它有自己的路由,这些都会包含在里面。

  • Ember:相比Angular,Ember做得就更加彻底,Ember信奉的是约定优于配置,它会将一切都帮你设计好打包好,你就开箱用就可以了。

  • Meteor:Meteor只是一个极端,它是从前到后全都包含,从前端到数据层到数据库,全都帮你打包好。

    通过简单的分析,我们可以感受到, 做得少的框架不一定就不如做得多的框架,这体现出一种取舍 。也就是说,做得少的框架可以给你更多的灵活性,但你需要做更多的选择;做得多的框架有更强的侵入性,学习成本更高,灵活性更低。一旦选择了一个侵入性强的框架,那么一些小的部分你就没有机会去切换成其他你更想用的方案。

    所以,React和Vue有一个共同特点,它们都有各自的配套工具,核心虽然只解决一个很小的问题,但它们有生态圈及配套的可选工具,当你把他们一个一个加进来的时候,就可以组合成非常强大的栈,就可以涵盖其他的这些更完整的框架所涵盖的问题。

公寓锁Vue项目技术方案:

  • Vue框架
  • Element-ui UI组件库
  • vue-router 路由
  • vue-i18n 国际化
  • vuex 状态管理
  • axios 接口请求
  • 等等

个人常用工具

webpack

npm

yarn

Jquery

animate.css

Font-Awesome

moment.js

element.js

underscore

axios

validator

其他常见库

  1. D3.js
  2. char.js
  3. Echar.js
  4. thress.js
  5. ionic
  6. jQuery-File-Upload
  7. gulp
  8. babel
  9. hammer.js
  10. layer.js
  11. Swiper.js

Top 100

⚠️ **GitHub.com Fallback** ⚠️