一些前端框架组件化实现的比较(转)

转自:https://segmentfault.com/a/1190000005831159

第一次接触到前端组件的概念是在学习Extjs的时候,有一个名叫Ext.Component的对象,所有的组件都是继承自这个对象。Extjs有很多自带的组件,种类齐全,可以应对大部分后台页面的需求,而且实现了页面全部由组件组成的宏伟目标。组件的编写几乎都是靠JS,而弱化了HTML和CSS。虽然现在已经不用Extjs了但有机会一定要好好研究下它对组件概念的理解。

花了近一天的时间,用我认为比较主流的前端框架分别实现了同一个简单的功能,看图就能明白这个功能,这里也只比较简单的单层组件的实现。

当然几种框架的实现都使用了组件化的方式,并实例化三次,所以你看到图上有三行且每行的初始文字不同。接下来我将分别展示Angular2、Vue、React和Molecule的组件实现。注:Molecule不是流行组件化框架,但是用与众不同的方式实现组件。

Angular2

import { Component, Input } from ‘@angular/core‘;

@Component({
    selector: ‘amazing-angular2‘,
    template: `<input [(ngModel)]="text">
            <button (click)="changeToUpperCase()">Upper Case</button>`,
    styles: [``]
})
export class ItemComponent {
    @Input()
    text = ‘Hello Wolrd‘;

    changeToUpperCase() {
        this.text = this.text.toUpperCase();
    }
};

Angular2用ES7的装饰器特性将一个类标记为组件。

  • template属性用HTML定义了组件的结构
  • styles属性用CSS定义了组件的样式(Scoped CSS,即这里写的样式只作用于此组件)
  • 组件的逻辑实现和Angular1类似,在类中声明成员来与HTML结构绑定
  • Input装饰器让组件接收外部参数,这里外部的text参数会覆盖text成员的原始值,缺省则为text成员的原始值
  • 在HTML结构中通过selector指定的标签来实例化组件,<amazing-angular2 [text]="‘Hello Angular2!‘">Loading...</amazing-angular2>

Vue

var Vue = require(‘vue‘);

Vue.component(‘amazing-vue‘, {
    props: [‘text‘],
    template: ‘<div><input v-model="text"><button @click="changeToUpperCase">Upper Case</button></div>‘,
    data: function () {
        return { };
    },
    methods: {
        changeToUpperCase: function () {
            this.text = this.text.toUpperCase();
        }
    }
});

这里用了Vue的语法糖把组件定义和注册合成了一步。

  • 在template属性中定义组件的HTML结构
  • 奇怪的是没有找到定义组件样式的API,可能是我没找到。但在Vue单文件组件中是实现Scoped CSS
  • 与其它MVVM框架一样,定义数据属性和操作属性与HTML结构绑定,实现各种业务逻辑,避免了繁琐的DOM操作
  • props属性定义了组件可以接受的外部参数的数组,如果传入外部参数,则可以直接当做数据属性来使用
  • 组件的实例化可以通过标签来实现,<amazing-vue text="Hello Vue!"></amazing-vue>

React

var AmazingReact = React.createClass({
    getInitialState: function () {
        return {
            text: this.props.text
        };
    },
    changeToUpperCase: function () {
        this.setState({
            text: this.state.text.toUpperCase()
        });
    },
    render: function () {
        return (
            <div>
                <input type="text" value={this.state.text} />
                <button onClick={this.changeToUpperCase}>Upper Case</button>
            </div>
        );
    }
});

creatClass创建组件,由于采用了单向数据流,所以与Angular和Vue的实现有一些差别。

  • 在render中用jsx的语法定义组件的HTML结构
  • React似乎也没有实现组件内部样式
  • getInitialState初始化内部state,自定义方法操作state,state改变会导致重新渲染,以此来实现业务逻辑
  • 外部参数可直接通过this.props获取
  • 通过react-dom的render方法以标签的形式实例化组件,<AmazingReact text="Hello React!"/>

Molecule

<div molecule-def="AmazingMolecule">
    <input value="Hello World"><button id="bnUpperCase">Upper Case</button>
    <script>
        // MOLECULE_DEF
        function AmazingMolecule(){
            this.$el.find(‘input‘).val(this.$el.data(‘text‘));
            this.$el.find(‘#bnUpperCase‘).click(function(){
                var $tx = $(this).parent().find(‘input‘);
                $tx.val($tx.val().toUpperCase());
            })
        }
        // MOLECULE_DEF_END
        Molecule.create(AmazingMolecule);
    </script>
</div>

Molecule采用了基于HTML定义组件的方式。

  • 由于是HTML主场,所以组件HTML结构直接在在里面
  • 猜你一定想到了,组件的样式可以写在style标签内。不过Molecule目前还未实现Scoped CSS,所以定义样式要多加小心
  • JS到了客场也不得不包一层script标签,使用jquery实现业务逻辑
  • 外部参数也用jquery来获取
  • 在HTML中通过标签属性来实例化组件,<div molecule="AmazingMolecule" data-text="Hello Molecule!"></div>

总结

可以看出虽然各个框架实现组件的方式各不相同,但总体思想是一致的,内部都包含组件结构和组件行为的定义,外部则都提供了接口实现参数传递。至于有些框架没有实现内部的CSS,我猜应该是考虑了表现的多样性。而实例化的方式则都采用了HTML标签的方式,利用HTML的树形结构,让多个组件的组织更加方便和一目了然。

时间: 2024-10-26 14:23:35

一些前端框架组件化实现的比较(转)的相关文章

闲话js前端框架(4)——组件化?有没有后端的事?

闲话js前端框架 前端人员=美工+设计+代码+测试 --题记 专题文章: 一.从avalonjs的模板说起 二.庞大的angularjs 三.再也不想碰DOM 四.组件化?有没有后端的事? 五.再看自己一年前设计的微型渲染引擎 六.在浏览器标准上做文章 七.抛开浏览器,构建应用容器 八.为何Flash.银光和Java都在网页端一蹶不振 本文属 西风逍遥游 原创, 转载请注明出处: 西风世界 http://blog.csdn.net/xfxyy_sxfancy 四.组件化?有没有后端的事? 提到组

2015前端组件化框架之路(转)

https://github.com/xufei/blog/issues/19 1. 为什么组件化这么难做 Web应用的组件化是一个很复杂的话题. 在大型软件中,组件化是一种共识,它一方面提高了开发效率,另一方面降低了维护成本.但是在Web前端这个领域,并没有很通用的组件模式,因为缺少一个大家都能认同的实现方式,所以很多框架/库都实现了自己的组件化方式. 前端圈最热衷于造轮子了,没有哪个别的领域能出现这么混乱而欣欣向荣的景象.这一方面说明前端领域的创造力很旺盛,另一方面却说明了基础设施是不完善的

2015前端组件化框架之路

特别声明:本文转自@民工精髓的<2015前端组件化框架之路>.谢谢@民工精髓的分享!著作权归作者所有. 编辑推荐: 掘金是一个高质量的技术社区,从 CSS 到 Vue.js,性能优化到开源类库,让你不错过前端开发的每一个技术干货. 点击链接查看最新前端内容,或到各大应用市场搜索「 掘金」下载APP,技术干货尽在掌握中著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.原文: http://www.w3cplus.com/components-in-webapp.html ? w

【转】前端组件化框架之路

1. 为什么组件化这么难做 Web应用的组件化是一个很复杂的话题. 在大型软件中,组件化是一种共识,它一方面提高了开发效率,另一方面降低了维护成本.但是在Web前端这个领域,并没有很通用的组件模式,因为缺少一个大家都能认同的实现方式,所以很多框架/库都实现了自己的组件化方式. 前端圈最热衷于造轮子了,没有哪个别的领域能出现这么混乱而欣欣向荣的景象.这一方面说明前端领域的创造力很旺盛,另一方面却说明了基础设施是不完善的. 我曾经有过这么一个类比,说明某种编程技术及其生态发展的几个阶段: 最初的时候

前端框架Vue自学之Vue组件化开发(三)

终极目标:掌握和使用Vue(全家桶:Core+Vue-router+Vuex) 本博客目的:记录Vue学习的进度和心得(Vue组件化开发) 内容:通过官网说明,掌握Vue组件化开发. 正文: Vue组件化开发 一.认识组件化 原文地址:https://www.cnblogs.com/xinkuiwu/p/12037281.html

前端为何要组件化——看山还是山

前端组件化,将页面中的各个部分分割成单独的一部分进行开发,在和别人协同工作的时候能够有效.独立的进行开发,比如你写你的header,我写我的footer,写好了往index里面加,我的模块只影响我,包括css.js. 前端页面中,能够让浏览器渲染出效果需要的其实说到底就3个东西:HTML(结构).CSS(样式).JavaScript(行为).不管是VUE.Angular还是jQuery等框架,之所以叫做框架就是因为他并没有改变本质上的东西,比如jQuery中获取元素 $("#container&

客户端高性能组件化框架React简介、特点、环境搭建及常用语法

明天就是春节了 预祝大家新春快乐 [ ]~( ̄▽ ̄)~* 天天饭局搞得我是身心疲惫= = 所以更新比较慢 今天想跟大家分享的就是这个大名鼎鼎的React框架 简介 React是这两年非常流行的框架 并不难,还是挺容易上手的 起源于Facebook内部项目(一个广告系统) 传统页面从服务器获取数据,显示到浏览器上,用户输入数据传入服务器 但随着数据量增大,越来越难以维护了 Facebook觉得MVC不能满足他们的扩展需求了(巨大的代码库和庞大的组织) 每当需要添加一项新的功能或特性时,系统复杂度就

到底是什么是前端工程化、模块化、组件化

引言 提到前端往往很多人的映像就是入门简单,HTML.CSS加一起一个星期基本上就能大概上手,JS难一点但也能很快写一些简单的小效果,在网上随便一搜索各种特效代码随意用,一个新手前端也能在很短的时间里写出炫酷的页面效果,然而入门简单并不意味着前端这碗饭很好吃,做惯了切图.布局.扣特效的前端新同学在向前发展的路上越来越觉得吃力,而没有任何编程思想和软件开发基础很多人对前端工程化.组件化.模块化.MVC这些"高大上"的词汇云里雾里.本文用最简单的语言介绍一下我对工程化.组件化.模块化的理解

谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo

前言 前端已经过了单兵作战的时代了,现在一个稍微复杂一点的项目都需要几个人协同开发,一个战略级别的APP的话分工会更细,比如携程: 携程app = 机票频道 + 酒店频道 + 旅游频道 + ...... 每个频道有独立的团队去维护这些代码,具体到某一个频道的话有会由数十个不等的页面组成,在各个页面开发过程中,会产生很多重复的功能,比如弹出层提示框,像这种纯粹非业务的UI,便成了我们所谓的UI组件,最初的前端组件也就仅仅指的是UI组件. 而由于移动端的兴起,前端页面的逻辑已经变得很重了,一个页面的