九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
致我們終將組件化的Web

原文出處: AlloyTeam 歡迎分享原創(chuàng)到伯樂頭條

《=》

”按模塊劃分“目錄結構,把當前模塊下的所有邏輯和資源都放一起了,這對于多人獨自開發(fā)和維護個人模塊不是很好嗎?當然了,那爭論的結果是我乖乖地改回主流的”按資源劃分“的目錄結構。因為,沒有做到JS模塊化和資源模塊化,僅僅物理位置上的模塊劃分是沒有意義的,只會增加構建的成本而已。

雖然他說得好有道理我無言以對,但是我心不甘,等待他日前端組件化成熟了,再來一戰(zhàn)!

而今天就是我重申正義的日子!只是當年那個跟你撕逼的人不在。

模塊化的不足

模塊一般指能夠獨立拆分且通用的代碼單元。由于JavaScript語言本身沒有內置的模塊機制(ES6有了!?。覀円话銜褂肅MD或ADM建立起模塊機制?,F在大部分稍微大型一點的項目,都會使用requirejs或者seajs來實現JS的模塊化。多人分工合作開發(fā),其各自定義依賴和暴露接口,維護功能模塊間獨立性,對于項目的開發(fā)效率和項目后期擴展和維護,都是是有很大的幫助作用。

但,麻煩大家稍微略讀一下下面的代碼

JavaScript

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

require([

'Tmpl!../tmpl/list.html','lib/qqapi','module/position','module/refresh','module/page','module/net'

], function(listTmpl, QQapi, Position, Refresh, Page, NET){

var foo = '',

bar = [];

QQapi.report();

Position.getLocaiton(function(data){

//...

});

var init = function(){

bind();

NET.get('/cgi-bin/xxx/xxx',function(data){

renderA(data.banner);

renderB(data.list);

});

};

var processData = function(){

};

var bind = function(){

};

var renderA = function(){

};

var renderB = function(data){

listTmpl.render('#listContent',processData(data));

};

var refresh = function(){

Page.refresh();

};

// app start

init();

});

上面是具體某個頁面的主js,已經封裝了像Position,NET,Refresh等功能模塊,但頁面的主邏輯依舊是”面向過程“的代碼結構。所謂面向過程,是指根據頁面的渲染過程來編寫代碼結構。像:init -> getData -> processData -> bindevent -> report -> xxx 。 方法之間線性跳轉,你大概也能感受這樣代碼弊端。隨著頁面邏輯越來越復雜,這條”過程線“也會越來越長,并且越來越繞。加之缺少規(guī)范約束,其他項目成員根據各自需要,在”過程線“加插各自邏輯,最終這個頁面的邏輯變得難以維護。

開發(fā)需要小心翼翼,生怕影響“過程線”后面正常邏輯。并且每一次加插或修改都是bug泛濫,無不令產品相關人員個個提心吊膽。

頁面結構模塊化

基于上面的面向過程的問題,行業(yè)內也有不少解決方案,而我們團隊也總結出一套成熟的解決方案:Abstractjs,頁面結構模塊化。我們可以把我們的頁面想象為一個樂高機器人,需要不同零件組裝,如下圖,假設頁面劃分為tabContainer,listContainer和imgsContainer三個模塊。最終把這些模塊add到最終的pageModel里面,最終使用rock方法讓頁面啟動起來。


(原過程線示例圖)


(頁面結構化示例圖)

下面是偽代碼的實現

JavaScript

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

require([

'Tmpl!../tmpl/list.html','Tmpl!../tmpl/imgs.html','lib/qqapi','module/refresh','module/page'

], function(listTmpl, imgsTmpl, QQapi, Refresh, Page ){


var tabContainer = new RenderModel({

renderContainer: '#tabWrap',

data: {},

renderTmpl: '

  • {{item}}
  • ',

    event: function(){

    // tab's event

    }

    });


    var listContainer = new ScrollModel({

    scrollEl: $.os.ios ? $('#Page') : window,

    renderContainer: '#listWrap',

    renderTmpl: listTmpl,

    cgiName: '/cgi-bin/index-list?num=1',

    processData: function(data) {

    //...

    },

    event: function(){

    // listElement's event

    },

    error: function(data) {

    Page.show('數據返回異常[' + data.retcode + ']');

    }

    });


    var imgsContainer = new renderModel({

    renderContainer: '#imgsWrap',

    renderTmpl: listTmpl,

    cgiName: '/cgi-bin/getPics',

    processData: function(data) {

    //...

    },

    event: function(){

    // imgsElement's event

    },

    complete: function(data) {

    QQapi.report();

    }

    });


    var page = new PageModel();

    page.add([tabContainer,listContainer,imgsContainer]);

    page.rock();


    });

    我們把這些常用的請求CGI,處理數據,事件綁定,上報,容錯處理等一系列邏輯方法,以頁面塊為單位封裝成一個Model模塊。

    這樣的一個抽象層Model,我們可以清晰地看到該頁面塊,請求的CGI是什么,綁定了什么事件,做了什么上報,出錯怎么處理。新增的代碼就應該放置在相應的模塊上相應的狀態(tài)方法(preload,process,event,complete…),杜絕了以往的無規(guī)則亂增代碼的行文。并且,根據不同業(yè)務邏輯封裝不同類型的Model,如列表滾動的ScrollModel,滑塊功能的SliderModel等等,可以進行高度封裝,集中優(yōu)化。

    現在基于Model的頁面結構開發(fā),已經帶有一點”組件化“的味道。每個Model都帶有各自的數據,模板,邏輯。已經算是一個完整的功能單元。但距離真正的WebComponent還是有一段距離,至少滿足不了我的”理想目錄結構“。

    WebComponents 標準

    我們回顧一下使用一個datapicker的jquery的插件,所需要的步奏:

    1. 引入插件js

    2. 引入插件所需的css(如果有)

    3. copy 組件的所需的html片段

    4. 添加代碼觸發(fā)組件啟動

    現階段的“組件”基本上只能達到是某個功能單元上的集合。他的資源都是松散地分散在三種資源文件中,而且組件作用域暴露在全局作用域下,缺乏內聚性很容易就會跟其他組件產生沖突,如最簡單的css命名沖突。對于這種“組件”,還不如上面的頁面結構模塊化。

    于是W3C按耐不住了,制定一個WebComponents標準,為組件化的未來指引了明路。

    下面以較為簡潔的方式介紹這份標準,力求大家能夠快速了解實現組件化的內容。(對這部分了解的同學,可以跳過這一小節(jié))

    1.

    模板這東西大家最熟悉不過了,前些年見的較多的模板性能大戰(zhàn)artTemplate,juicer,tmpl,underscoretemplate等等。而現在又有mustachejs無邏輯模板引擎等新入選手。可是大家有沒有想過,這么基礎的能力,原生HTML5是不支持的(T_T)。

    而今天WebComponent將要提供原生的模板能力

    XHTML

    1

    2

    3

    id='datapcikerTmpl'>

    我是原生的模板

    template標簽內定義了myTmpl的模板,需要使用的時候就要innerHTML= document.querySelector('#myTmpl').content;可以看出這個原生的模板夠原始,模板占位符等功能都沒有,對于動態(tài)數據渲染模板能力只能自力更新。

    2. ShadowDom 封裝組件獨立的內部結構

    ShadowDom可以理解為一份有獨立作用域的html片段。這些html片段的CSS環(huán)境和主文檔隔離的,各自保持內部的獨立性。也正是ShadowDom的獨立特性,使得組件化成為了可能。

    JavaScript

    1

    2

    3

    var wrap = document.querySelector('#wrap');

    var shadow = wrap.createShadowRoot();

    shadow.innerHTML = '

    you can not see me

    '

    在具體dom節(jié)點上使用createShadowRoot方法即可生成其ShadowDom。就像在整份Html的屋子里面,新建了一個shadow的房間。房間外的人都不知道房間內有什么,保持shadowDom的獨立性。

    3. 自定義原生標簽

    初次接觸Angularjs的directive指令功能,設定好組件的邏輯后,一個就能引入整個組件。如此狂炫酷炸碉堡天的功能,實在令人拍手稱快,躍地三尺。

    JavaScript

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    var tmpl = document.querySelector('#datapickerTmpl');

    var datapickerProto = Object.create(HTMLElement.prototype);


    // 設置把我們模板內容我們的shadowDom

    datapickerProto.createdCallback = function() {

    var root = this.createShadowRoot();

    root.appendChild(document.importNode(tmpl.content, true));

    };


    var datapicker = docuemnt.registerElement('datapicker',{

    prototype: datapickerProto

    });

    Object.create方式繼承HTMLElement.prototype,得到一個新的prototype。當解析器發(fā)現我們在文檔中標記它將檢查是否一個名為createdCallback的方法。如果找到這個方法它將立即運行它,所以我們把克隆模板的內容來創(chuàng)建的ShadowDom。

    最后,registerElement的方法傳遞我們的prototype來注冊自定義標簽。

    上面的代碼開始略顯復雜了,把前面兩個能力“模板”“shadowDom”結合,形成組件的內部邏輯。最后通過registerElement的方式注冊組件。之后可以愉快地的使用。

    4. imports解決組件間的依賴

    XHTML

    1

    rel='import' href='datapciker.html'>

    這個類php最常用的html導入功能,HTML原生也能支持了。

    WebComponents標準內容大概到這里,是的,我這里沒有什么Demo,也沒有實踐經驗分享。由于webComponents新特性,基本上除了高版本的Chrome支持外,其他瀏覽器的支持度甚少。雖然有polymer幫忙推動webcompoents的庫存在,但是polymer自身的要求版本也是非常高(IE10+)。所以今天的主角并不是他。

    我們簡單來回顧一下WebCompoents的四部分功能:

    1 .

    本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報。
    打開APP,閱讀全文并永久保存 查看更多類似文章
    猜你喜歡
    類似文章
    歷年前端經典面試題
    React,一次學習,到處編碼
    webpack+react+nodejs服務端渲染
    Webpack+React+ES6開發(fā)模式入門指南
    Webpack的工程化實踐
    web前端教程:新手應該怎么學習webpack
    更多類似文章 >>
    生活服務
    熱點新聞
    分享 收藏 導長圖 關注 下載文章
    綁定賬號成功
    后續(xù)可登錄賬號暢享VIP特權!
    如果VIP功能使用有故障,
    可點擊這里聯(lián)系客服!

    聯(lián)系客服