金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > web前端 > 前端这条路,谈笑风生组件化

前端这条路,谈笑风生组件化

发布时间:2019-12-15 23:15编辑:web前端浏览(50)

    谈笑风生组件化

    2016/02/28 · 基础技术 · 组件化

    原文出处: 木的树   

      在当今的前端开发领域,大红大紫的组件化开发如万人空巷,前端技术圈中关于组件化讨论的文章亦如汗牛充栋。然而别人的理解终归是别人的,作为一个胸存小志的开发者,我还是希望能够根据自己的理解和实际工作,总结自己对组件和组件化开发的认知。

    在我第一次接触组件化概念时,一时迷迷糊糊,如坠云雾深处。组件是什么?组件化开发是什么?为什么大牛们知道这么多而我不知道?这应该并不是我个人的疑问,每一个除此接触概念的新手,都会有此疑惑。

     

    为什么大牛们知道这么多而我不知道?

    我曾经无数次为类似的问题而烦恼,也曾感到急躁难耐。回答这个问题,我们需要有一个基本认知:任何一个新概念都是在无数前辈先贤的实践、总结中继承发展而来的。组件化开发也不例外。这个问题涉及认知学,能够引出很多值得探讨的问题,但这并不是本文的重点。关于前端组件化的发展过程,我推荐xufei大神的这篇文章:Web应用的组件化(一)——基本思路。

    组件化开发是什么?

    原来架构设计比较多关注的是横向的分层,即数据层,逻辑层和UI层。而组件化架构必须同时关注纵向的隔离和解耦。在分层和分模块后,每一个业务组件由三层各自存在的部署包组成,包本身是一个包含了技术组件和服务组件的一个结合体。由数据层,逻辑层,界面层三层的三个业务包可以构成一个完整的具备独立功能的业务组件。【人月神话的博客】

    这个解释很正确,但太概念化,我理解的组件化开发是将复杂并混乱的页面逻辑,分割成一个个独立的业务单元。

    组件是什么?

    根据上面的回答,我们基本可以确定,组件就是页面中一个个独立的逻辑单元。这个结论是放之四海而皆准的,然每一个高高在上的理论都要落地,根据具体情况具体回答。组件放到前端就要有一个符合前端技术的回答:前端组件就是模板、样式、代码逻辑相结合的、独立的、可复用的业务逻辑单元,其中模板由html承担、样式由css负责、代码逻辑由JavaScript编写。

    由张云龙大神的这张图,可以看出组件化的基本意图以及组件的基本组成。

    图片 1

    任何一种新的开发方式,都不能靠只读几篇文章就能明白,必须要实际动手并在工作中有所总结,才能彻底掌握。所以我并不奢望靠上文的几段文字就能让读者完全明白组件与组件化开发。

      接下来我将根据自己实际的开发经验,与大家分享一下我对组件的认知的和经验总结。

     

    组件的基本修养

    任何一个华丽的思想都有一套朴实的代码实现。上面我们从抽象的层次上谈了谈组件的概念,放到实际的代码世界,该如何去实现呢?众所周知,JavaScript是一门面向对象语言,面向对象语言最重要的特性就是——抽象。放到实际开发中就是定义一个基类,应用的我们现在的场景,我们需要一个组件基类——Component。由这个基类来提供组件的基础功能。具体都应该有什么方面的基础功能呢?别急,这个问题先放一放。

    组件的管理

    先看一下上面的这张图,我们会发现,整个页面都是由不同的功能的业务组件组成的。这就引出了另一个问题,当一个页面的组件非常多时,我们需要一套统一管理的仓库——CRepository。每一个组件都要将自身id向仓库注册,仓库提供管理功能,如增删改查。具体的方法由实际应用而异,但几个通用的方法可以参考:

    count: Number.//整个app中组件的数量 add: function(component){....} //将一个组件添加到仓库中 remove: function(id){....} //将一个组件从仓库中移除 byId: function(id){....} //根据id从仓库中查找组件

    1
    2
    3
    4
    5
    6
    7
    count: Number.//整个app中组件的数量
     
    add: function(component){....} //将一个组件添加到仓库中
     
    remove: function(id){....} //将一个组件从仓库中移除
     
    byId: function(id){....} //根据id从仓库中查找组件

    了解完仓库之后,我们便可以将主要精力放回到Component上了。

     

    组件的生命周期

    生命周期这个概念最早在软件工程中接触到,可惜我对那些枯燥的理论没有什么兴趣,上起课来云里雾里,早就还给教授了。那我就举一个大家都有体会的例子。组件如人,人的生命有尽头,组件的生命必然有。将组件的生命周期分割成不同的几个阶段来处理不同的逻辑,就如同人的一生不同阶段要面对不同的烦恼一样。

    constructor:function(){} //构造函数,处理外部参数 mixinProperties:function(){} //在这个阶段,混入必要的属性 parseTemplate:function(){}//在这个阶段解析模板,将模板由字符串转化成dom节点 postCreate:function(){}//在这个阶段,模板解析完毕,可以访问component的根节点cRoot。此时可以对组件的dom树进行访问或绑定事件。但此时组件还未加到页面dom树中。 startup:function(){}//此时组件以加入dom树中,这里可以在组件加入页面dom后做一些初始化工作。对于嵌套组件,需要处理子组件的startup destroy:function(){}//组件生命结束,进入销毁阶段,从组件仓库中注销

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    constructor:function(){} //构造函数,处理外部参数
     
    mixinProperties:function(){} //在这个阶段,混入必要的属性
     
    parseTemplate:function(){}//在这个阶段解析模板,将模板由字符串转化成dom节点
     
    postCreate:function(){}//在这个阶段,模板解析完毕,可以访问component的根节点cRoot。此时可以对组件的dom树进行访问或绑定事件。但此时组件还未加到页面dom树中。
     
    startup:function(){}//此时组件以加入dom树中,这里可以在组件加入页面dom后做一些初始化工作。对于嵌套组件,需要处理子组件的startup
     
    destroy:function(){}//组件生命结束,进入销毁阶段,从组件仓库中注销

    凡是比喻就一定有失真的地方,组件的生命当然不可能与人相比,但我却发现上面的生命周期与婴儿从被怀孕与诞生的过程极其相似。

    constructor:function(){} //受精卵状态 mixinProperties:function(){} //染色体重组 parseTemplate:function(){}//婴儿在母体内的生长发育过程 postCreate:function(){}//婴儿在母体内生长发育完成,母亲即将临盆 startup:function(){}//婴儿出生,被社会认可 destroy:function(){}//个体消亡,取消社会户籍等等

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    constructor:function(){} //受精卵状态
     
    mixinProperties:function(){} //染色体重组
     
    parseTemplate:function(){}//婴儿在母体内的生长发育过程
     
    postCreate:function(){}//婴儿在母体内生长发育完成,母亲即将临盆
     
    startup:function(){}//婴儿出生,被社会认可
     
    destroy:function(){}//个体消亡,取消社会户籍等等

    组件的属性访问器

    对于组件内部数据的访问,应当对外提供统一的访问渠道,通常来讲这部分内容就是属性的取值器与赋值器(get和set)。

    set(prop, value)//为组件的某个属性赋值 get(prop)//为从组件中取得某个属性值

    1
    2
    3
    set(prop, value)//为组件的某个属性赋值
     
    get(prop)//为从组件中取得某个属性值

    要明确的一点是,这里的set与get不仅仅像点语法一样单纯的赋值与取值,否则就是画蛇添足。使用过C#的兄台知道,C#中存在“属性的Get与Set”,它们能够避免直接对字段进行访问,这里提到组件的get与set应当具有同样的功能,具体的实现方式敬请关注后续文章。

     

    组件的模板解析

    遇到模板通常会遇到数据绑定的需求,可能是双向绑定也可能是单向绑定。双向绑定如众多的MVVM框架,模板解析过程中可能会读取组件内数据来渲染dom元素,亦或者组件dom树生成后,dom元素的变动即可作用于组件内部数据。单向绑定常出现在MVC框架中,如dojo,只是将dom元素与组件内部某个属性绑定,或者将交互事件与组件内部方法绑定。

    JavaScript中没有注解特性,所以众多绑定功能都是在template中添加自定义特性,并在解析过程中处理自定义特性。

    说到事件的绑定,事件带来的内存泄露问题不容忽视。这就要在组件销毁时,一并处理组件内部绑定的事件。包括在模板中绑定的事件与组件内部手动绑定的事件。

     

    组件关系

    当一个页面变得越来越复杂时,组件之间必然会出现嵌套。嵌套意味会出现父子关系、兄弟关系等。嵌套的管理可以参照DOM中的层级关系,提供相应的处理方法。但通常来讲,只需要管理好父子关系即可,兄弟关系的管理往往太复杂,而且通常情况下,一个getChildren,然后根据索引便能满足需求。所以大部分类库中组件关系的管理,往往只需要两个方法:

    getParent:function(){}//获取组件的父组件 getChildren:function(){}//获取组件内部所有子组件

    1
    2
    3
    getParent:function(){}//获取组件的父组件
     
    getChildren:function(){}//获取组件内部所有子组件

     

    组件通信

    组件变得复杂增多时,另组件之间如何通信的问题便被应当被提上议事日程。JavaScript本身便适用于消息驱动,处理组件间的通信当然要就地取材,事件机制便是最佳方案,所以前端组件应当在事件机制(往往是语义事件)的基础 提供通信功能。组件应当既可以接收事件也可以发送事件,于是应当分别提供方法:

    on:function(component, eventName, handler) //用于绑定组件事件 emit:function(eventName, event) //组件对外发送事件

    1
    2
    3
    on:function(component, eventName, handler) //用于绑定组件事件
     
    emit:function(eventName, event) //组件对外发送事件

     

      组件的销毁

    组件的销毁属于组件生命周期的一部分,当组件功能变得复杂,组件正确合理的销毁就变得尤为重要。组件的销毁通常要考虑以下几个方面:

    • 组件内部事件的解绑
    • 组件dom的销毁
    • 组件内部属性的销毁
    • 子组件的销毁
    • 组件注销

     

    组件的解析

    如果所有的组件都要通过new class的方式去手动初始化,这本无可厚非,然而在现今标签化语言盛行的时代,是否能够有一种更为方便的开发方式,将自定义组件也能够以标签化的方式来书写。答案是肯定的,主流的类库对此一般有两种做法:一种是完全的自定义标签方式,如angular2;一种是以自定义标签特性的方式,如dojo等。所有的这些都需要基础库能够提供组件解析的功能。

    通常的思路是以深度优先搜索的方式,扫描整个DOM树,解析自定义标签、自定义特性,将其实例化成自定义组件。有意思的是,因为组件嵌套关系的存在,自定义组件之间就像DOM树一样也是一个倒长的树形结构。

     

     

    感谢读到这里的兄台,有的兄台可能会说,这篇文章大谈特谈了一堆组件、组件化开发,但都是理论性的东西。说好听了叫方法论,说不好听了是扯淡。若不来点实际东西,那便是虚与委蛇之气溢于朱墨之表,扑人眉宇。那么接下面的几篇文章,我将与大家一起根据本文的理论,一步步实现一套基础的组件类库。

     

    参考文章:

    Web应用的组件化(一)——基本思路

    Web应用的组件化(二)——管控平台

    2015前端组件化框架之路

    前端开发的模块化和组件化的定义,以及两者的关系?

    对组件化架构的再思考

    1 赞 5 收藏 评论

    图片 2

    前端这条路,我们该何去何从

    2016/10/06 · 前端职场 · 4 评论

    本文作者: 伯乐在线 - 追梦子 。未经作者许可,禁止转载!
    欢迎加入伯乐在线 专栏作者。

    昨日在园子里看到几篇关于程序生涯的几篇文章博有感触,想想自己这几个月多少有些堕落了,想起刚学那会,连过年那天晚上还在看js,这些天在想自己为什么会突然的感觉迷茫了,想起有次去面试的时候,面试官问起的,你的职业规划是什么。沉默一会,技术大牛?项目经理?架构师?这些不是我听他们说的吗?为什么我也回答了这些。偶然想起自己好像一直从未有过职业规划,虽然半年前也有过那么一段时间考虑过,但最终失败之,因为那时候的我认为每一天就是最好的证明。看来我是一个比较喜欢用过去的经验来判断某个事物的价值,或许是太过于年轻,年轻总是起伏很大,喜欢把东西认死理,后来发现其实他们没有对错,不过是它们都占有一些罢了。

    为什么需要职业规划,曾经以为做好每一天就是职业规划固然没有错,但是你总得有一个长远的方向吧,这样也不会太过于迷茫,别人说这个好就去学这个,跟随潮流没有错,错的是你得有自己的方向。人生之所以迷茫,不就是因为我们不知道该何去何从吗

    虽然年轻,但一味的错下去,将来不也和他们一样了吗,是啊,我们该有一个规划了。

    这里再说一下自己为什么会迷茫,技术学到某个阶段就很难提升了,更多只能靠自己摸索,没有人可以指导,就像是创业公司的CEO,突然想起之前的一家公司老板当时说的话,你看我现在好像是成功了,但是每天付出的却是你的10倍,你们只要把每天的工作完成就算合格了,要是再好一点就是优秀,但是我呢,没有人可以给我指导,更没有人给我方向,我工资是比你们高,但你们想想要是公司倒闭了,我就全没了,你们工资还是一样的,你付出的多少回报的就是多少,自然风险也更大。

    在创业公司呆过以后让我懂得了创业并不是那么容易,扯歪了,回到上面的,到了这个阶段,本想说想自己的经验,但想想自己正在这个阶段也就没有经验可谈,那我说说我之前的进阶之路怎么走的吧。

    初级:

    如果你是想学好JS:预解析、作用域、作用域链、|| &&、什么是原始类型、什么是引用类型、闭包、for循环运行机制、多重for循环、递归、原型链、继承、(数组、字符串、函数的各种内置方法,不需要全部记住但你得知道它们能干嘛,在将来你用到的时候可以想到那去。看似没有用,但无数的经验告诉我,非常有用。)。

    这些必须学会!!!必须静下心来,这些你不学,永远入不了门。这段时间其他什么都不要看,就好好把这些概念理解以及实践。

    高级:

    call,apply,bind,面向对象、函数式编程、搞懂异步、学习算法、设计模式。这是一条很长的路,此地我也没啥经验可讲,一起加油吧。

    扩展能力:

    了解HTTP、linus、(nodejs、php、python、java、c)等、只需要了解即可,当然最好熟练使用其中一项。

    HTTP,设计模式,算法,非常建议你去学,对于互联网大部分编程都会用到,你会知道它们是多么的通用,不要仅仅局限在前端,不然很难学好的。

    这里没有提到各种框架,不是说它们不重要,而是你把这些搞懂了,再去学习会简单很多,而且大部分框架的核心都差不多学习其中一到两种即可,框架这里就不推荐了,另外这里可能更多说的关于JS的学习,但是学习的思想是不会变的,也因为本人的精力有限,其他方面你还得多去看看其他文章。

    其实在很长的一段前端学习过程中,我始终是觉得自己是不会的,但我又多少有些懂,但就是说不上个之所以然,也就谈不上去实践。后来想想自己其实是懂的,有很多时候我在路上想,那个东西为什么这样的,另外一个东西又是那样的,当然这是后话了,因为在刚开始学这个东西的时候往往是很难静下心来去思考的,刚学东西的时候容易浮躁,但当你静下来多去问几个为什么之后很多东西就自然懂了。当然这里有个小技巧,就是问自己最核心的,比如很久以后我才彻底明白的闭包,我当时路上问自己,闭包究竟什么东西,为什么外部就可以访问内部的东西,突然顿悟,可以通过reurn,也可以想其他办法让外部可以访问内部变量,解决作用域,变量不被回收。

    这里要说的技巧就是:当你觉得你会了,但是不会用的时候,是时候静下心来多问自己几个为什么。当然还有一点作为初学者一定要把复杂的东西变简单,现在的教程往往喜欢复杂化,很可能你就看不懂,这个时候,你应该问自己以下几件事:

    1.这些代码全部都是必要的吗?

    2.这个代码最核心是什么。

    更新:2016.08.21

    先学会怎么去用,再来编写核心代码。

    别小瞧这两句话,它们却至关重要,比如你想学php,你先搜索一下PHP是干什么的?它有什么用?OK,接着你问自己,他最核心的是什么?,按照最核心的去做,其他的暂时都不要管,比如你只要知道PHP中的GET,POST接收前端发送的数据,接着你用PHP把数据发给前端这就是最简单的交互,但你不得不承认这就是最核心的。做为初期我们只能这样,等你理解了这一点之后,你可以开始进阶学习。

    学习的建议:

    不要为了找教程而找教程,这句话我多该和自己多说上几句,因为我就是这样一个人,资源很多了,但我还是喜欢不断的去找,现在还好一点,我希望你们不要这样,因为你会发现,如果你觉得某个教程写的不好,那可能很难找到一个教程适合你的,不是因为别人教程写的差(除非特别那种的),而是你该问问自己,是否有静下心来认真去看。找教程我给一个建议,建议你刚入门不要去看大牛的作品,最好看那些菜鸟或者和你技术差不多的,因为他们更容易让你懂,大牛的作品一般里面会涉及到很多东西,你去看的话,难免受打击,等到你了解部分之后再去品味大牛的作品。

    当然菜鸟的文章多少有些错误的观点,但学习就是这个过程,不断的跟进,等到你有能力自己去研究的时候自然会知道哪些是错误的,同样道理本人博客也有大量的错误,也许有人会说,错误的你为什么还要去写,这不是教坏别人吗,当然这多少有些道理,但如果因为这个我就不去写了,那怎么能进步呢,再者说,如果看文章的人知道这是错的,自然也不会同意的我的观点,如果他不清楚,那只能说明他也不清楚什么是对错,尽管如此一旦他懂得了以后他会更加深刻的明白为什么这个是对的,为什么那个是错的。

    后期的学习,静~~~专注!!!

    坚持,我一直告诉自己,坚持,不然一切都白费,堕落很正常,难过也很正常,但想想他们不也是这样的吗,想起曾经有人和我说,他们都能,你为什么不能。

    最后的最后,程序的路很长,如果你想在这条路上走,快快调整好你的心态,毕竟不是5年就是10年,是快乐是悲伤的过,一切由你,如果没有人给你指导,没有人给你鼓励时,请记得不时给自己一份鼓励和关心,虽然我们是程序员,但你应该利用剩余时间学会生活,我们不只是活在计算机世界里,我们还有很多,它们一样精彩,希望你留心的去关注它们。

    2016.08.18更新

    很多没有工作过的朋友尤其是那些喜欢专研的同学认为技术===工资,然而很大一部分却是:技术!==工资,曾经我就是这样天真的认为,然并不是这样的,工资往往和你的沟通能力,交际能力,思想,学历,技术这些方面挂钩,而不是单方面,为什么这么说,比如你在公司里面确实很努力,每天拼命的干活,但你从来都是干自己的事,那么公司老板根本不觉得你做了什么,有些人确实没干什么,但是他们每天在和老板沟通,这样的话就算他没做什么,老板也觉得他做的比你多,所有你最好得学会沟通。还有思想的提升,不要把自己当成一个彻彻底底的程序员,我们的生活不是为了程序而程序,这个你得时刻知道。

    时刻给自己放松一下,别压抑的去学习。

    这篇文章算是我大部分的学习经历吧,不一定你能产生共鸣,毕竟大家的生活环境都不一样,建议不要看太多这种类型的文章,就像不要为了找方法而找方法,大部分都差不多,只是你没有去运用罢了,人本身就不喜欢学习别人的方法,多少还是喜欢自己研究出来的,有些错还是得自己去尝试。

    里面多少有些废话,可以把里面的重点抽里面,慢慢体会。

    时间就像一条大河,我不知道我们说过多少的谎,又有多少是因为当时而说的。

    2016.09.09更新

    不要一直困在自己所限的技术里面,多看看其他的写法往往会有意想不到的所获,很多自己是想不到的,只有不断的学习才能进步的更快些。如果你觉得你懂了但是还是不会,其实缺少的是你站在更高的角度看待这个问题,因为我们往往容易把事情复杂化。多问个为什么,你那样做是在干嘛?该干嘛干嘛。

    打赏支持我写出更多好文章,谢谢!

    打赏作者

    CSS进阶:提高你前端水平的 4 个技巧

    2016/07/06 · CSS

    本文由 伯乐在线 - 小谢 翻译。未经许可,禁止转载!
    英文出处:Jonathan Z. White。欢迎加入翻译组。

    译者注:随着 Node.js 、react-native 等技术的不断出现,和互联网行业的创业的层出不穷,了解些前端知识,成为全栈攻城师,快速的产出原型,展示你的创意,对程序员,尤其是在创业的程序员来说,越来越重要,下面我们就跟随著名国外开发者网站上的热推文章《Leveling up in CSS》,从提升你的CSS技巧开始。

    图片 3

    打赏支持我写出更多好文章,谢谢!

    任选一种支付方式

    图片 4 图片 5

    2 赞 18 收藏 4 评论

    CSS 在刚开始学习的时候看起来非常简单。毕竟,它仅仅就是些样式而已,事实上是这样吗?

    但是,随着你的不断了解。很快,你会发现 CSS 没你想象的那么简单,它复杂且有深度。

    做好这四件事情,能让你在大规模使用 CSS 的时候保证代码的健壮性:使用适当的语义,模块化,采用统一的命名规范,遵循单一功能原则。

    关于作者:追梦子

    图片 6

    快乐一直在我们身边,不管你身处何地何时,只要心是快乐的,一切都是快乐的。是那一秒,也是那一秒,都不会改变。 个人主页 · 我的文章 · 8 ·    

    图片 7

    使用适当的语义

    在 HTML 和 CSS 编程中有语义标注的概念。语义是指单词的含义和他们间的关系。在 HTML 编程中,意味着你需要使用一个合适的标签名字来标记。下面是一个经典的例子。

    XHTML

    <!-- bad --> <div class=”footer”></div> <!-- good --> <footer></footer>

    1
    2
    3
    4
    <!-- bad -->
    <div class=”footer”></div>
    <!-- good -->
    <footer></footer>

    富有语义的 HTML 是非常简单明确的。另一方面,富有语义的 CSS 则是更抽象和主观的。编写富有语义的 CSS 意味着在选择类型的时候,类名要传达出结构和功能信息。类名要很容易被理解。确保它们不要太具体、太特殊。这样,你就可以复用它了。

    图片 8

    为了阐述什么是一个良好的类名,请看这个简化了的 Medium 网站的 CSS 例子。

    XHTML

    <div class="stream"> <div class="streamItem"> <article class="postArticle"> <div class="postArticle-content"> <!-- content --> </div> </article> </div> </div>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <div class="stream">
      <div class="streamItem">
        <article class="postArticle">
          <div class="postArticle-content">
            <!-- content -->
          </div>
        </article>
      </div>
    </div>

    通过这些代码,你可以立即识别出它们的结构、功能和含义。父节点的类名是 stream ,内容是一个文章列表。它的子节点的类名是 streamItem ,内容是文章列表中的一篇具体的文章。这使我们很容易的了解到父节点和子节点之间的关系。并且,这些类可以在每一个有文章功能的页面中使用。

    你可以像阅读一本书一样读 HTML 和 CSS。它会给你讲一个故事。通过故事你可以了解故事中的每一个角色和他们之间的关系。语义丰富的 CSS 代码容易理解,更便于维护。

    若果你想进一步了解语义相关的内容,看看 《怎么富有语义的为类命名》、《CSS 命名不简单》 和 《富有语义和容易识别(的代码命名)》,再看 《关于 HTML 命名和前端架构》。

    本文由金沙国际官网发布于web前端,转载请注明出处:前端这条路,谈笑风生组件化

    关键词: