国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

漫談Nuclear Web組件化入門篇

VPointer / 1552人閱讀

摘要:目前來(lái)看,團(tuán)隊(duì)內(nèi)部前端項(xiàng)目已全面實(shí)施組件化開發(fā)。層疊樣式保佑不要污染別的在前端,一般一個(gè)組件必須要有骨架和裝飾的以及邏輯。事件綁定條件判斷秒后改變,會(huì)自動(dòng)變更。循環(huán)姓名年齡增加修改移除的變更也能監(jiān)聽到,能夠自動(dòng)觸發(fā)的變更。

目前來(lái)看,團(tuán)隊(duì)內(nèi)部前端項(xiàng)目已全面實(shí)施組件化開發(fā)。組件化的好處太多,如:按需加載、可復(fù)用、易維護(hù)、可擴(kuò)展、少挖坑、不改組件代碼直接切成服務(wù)器端渲染(如Nuclear組件化可以做到,大家叫同構(gòu))...
怎么做到這么強(qiáng)大的優(yōu)勢(shì),來(lái)回憶下以前見過的坑,或者現(xiàn)有項(xiàng)目里的坑。

CSS層疊樣式?保佑不要污染別的HTML!

在web前端,一般一個(gè)組件必須要有骨架HTML和裝飾的CSS以及JS邏輯。而CSS要是可以是局部作用域那就再好不過了!就不用寫長(zhǎng)長(zhǎng)的前綴了,浪費(fèi)帶寬不說,而且費(fèi)勁。

.ui-popup-arrow-xx-xxxxx-xxxx-container {

}

這回夠長(zhǎng)了吧,不會(huì)污染別的HTML了吧。真的太長(zhǎng)了,沒有辦法,因?yàn)镃SS不是局部的,怕污染其他的HTML,規(guī)劃好長(zhǎng)長(zhǎng)的namespace、module是以前的最佳實(shí)踐。

怎么優(yōu)雅綁定事件?只能定義在window下?

如果HTML綁定的事件是局部作用域那就再好不過了!我真的見過模版代碼里出現(xiàn)下面的代碼:

然后在js里找到了下面的代碼:

要綁定的事件一多,得污染多少全局變量啊。所以還有的工程師這么干:

然后在js里找到了下面的代碼:

這里貌似比不設(shè)定namespace好很多,但是還是妥協(xié)的結(jié)果。一般希望能封裝成組件,組件的HTML里綁定的事件就是組件內(nèi)定義的事件,內(nèi)聚內(nèi)聚!!
通過js動(dòng)態(tài)綁定事件的壞處我以前專門寫了一篇文章來(lái)闡述,主要是lazy bind會(huì)導(dǎo)致用戶看到了頁(yè)面,但是頁(yè)面確無(wú)法響應(yīng)用戶的交互,這里不再闡述。

需求變更?找不到在哪改代碼?

大型項(xiàng)目如游戲什么的為啥都是面向?qū)ο笫降膶懛??如果一個(gè)組件剛好又能是一個(gè)Class那就再好不過,Class base可以更方便地抽象現(xiàn)實(shí)世界的物體及其屬性或者邏輯算法,所以甚至有些編程語(yǔ)言都是面向?qū)ο蟮?這里逆向邏輯),如JAVA、C#...整體過程式的代碼對(duì)于大型項(xiàng)目幾乎沒法維護(hù)(如基于jQuery就能容易寫出整體都是過程式的組織結(jié)構(gòu)),整體OO,局部過程式是可以接受的。

組件需要嵌套?只能復(fù)制粘貼原組件?

扁平無(wú)嵌套組件還是比較簡(jiǎn)單,對(duì)模板的字符串處理下,把綁定的事件全指向組件自身定義的方法,生命周期也好處理。在真正的業(yè)務(wù)里經(jīng)常需要組件嵌套,這樣也更利于復(fù)用。雖然大量模板引擎支持引用子模板、共享數(shù)據(jù)等,但是組件是有生命周期的,模板嵌套不能真正解決組件嵌套的問題。能支持組件嵌套并且聲明式嵌套就那就再好不過了!

數(shù)據(jù)變了?重新生成HTML替換一下?

怎么替換?先查找dom?什么?你還在查找dom?你還在背誦CSS選擇器?替換一下?不能增量更新嗎?或者diff一下吧?不要每次全部替換?。?/p> 首屏太慢?以前抽象的組件沒法復(fù)用?

什么?首屏太慢?改成直出(服務(wù)器渲染)?以前代碼沒法復(fù)用?要推翻重寫?什么?怎么搞?排期?產(chǎn)品不給排期?需求沒變?yōu)槭裁匆o排期?

下面來(lái)看下Nuclear怎么解決上面問題。

install Nuclear
npm install alloynuclear
Hello,Nuclear!
var HelloNuclear = Nuclear.create({
    render: function () {
        return "
Hello , {{name}} !
"; } }) new HelloNuclear({ name: "Nuclear" }, "body");

內(nèi)置了mustache.js無(wú)邏輯模板。

事件綁定
var EventDemo = Nuclear.create({
    clickHandler: function (evt, target, other1,other2) {
        //MouseEvent {isTrusted: true, screenX: 51, screenY: 87, clientX: 51, clientY: 21…}
        console.log(evt);
        //
Click Me!
console.log(target); //otherParameter1 console.log(other1); //otherParameter2 console.log(other2); alert("Hello Nuclear!"); }, render: function () { return "
Click Me!
" } }) new EventDemo({ seen: true }, "body");
條件判斷
var ConditionDemo = Nuclear.create({
    render: function () {
        return "{{#seen}}
                    
you can see me
{{/seen}} {{^seen}}
yan can not see me
{{/seen}}" } }) var cd = new ConditionDemo({ seen: true }, "body"); setTimeout(function () { cd.option.seen = false; }, 2000);

2秒后改變seen,dom會(huì)自動(dòng)變更。

循環(huán)
var LoopDemo = Nuclear.create({
    render: function () {
        return "
    {{#list}}
  • 姓名:{{name}} 年齡:{{age}}
  • {{/list}}
" } }) var ld = new LoopDemo({ list: [ { name: "dntzhang", age: 18 }, { name: "vorshen", age: 17 } ] }, "body"); setTimeout(function () { //增加 ld.option.list.push({ name: "lisi", age: 38 }); }, 1000); setTimeout(function () { //修改 ld.option.list[0].age = 19; }, 2000); setTimeout(function () { //移除 ld.option.list.splice(0, 1); }, 3000);

Array的變更也能監(jiān)聽到,能夠自動(dòng)觸發(fā)Dom的變更。

局部CSS


    
I"m other div!! my color is not red!!

組件外的div不會(huì)被組件內(nèi)的CSS污染。

討厭反斜杠?

討厭反斜杠可以使用 ES20XX template literals、或者split to js、css和html文件然后通過構(gòu)建組裝使用。也可以用template標(biāo)簽或者textare存放模板。



組件嵌套




通過在父對(duì)象的install里設(shè)置this.childrenOptions來(lái)把option傳給子節(jié)點(diǎn)。

服務(wù)器端渲染
function todo(Nuclear,server) {
    var Todo = Nuclear.create({
        add: function (evt) {
            evt.preventDefault();
            this.option.items.push(this.textBox.value);
        },
        render: function () {
            return `

TODO

    {{#items}}
  • {{.}}
  • {{/items}}
`; }, style: function () { return `h3 { color:red; } button{ color:green;}`; } },{ server:server }); return Todo; } if ( typeof module === "object" && typeof module.exports === "object" ) { module.exports = todo ; } else { this.todo = todo; }

通過第二個(gè)參數(shù)server來(lái)決定是服務(wù)器端渲染還是客戶端渲染。server使用的代碼也很簡(jiǎn)單:

var koa = require("koa");
var serve = require("koa-static");
var router = require("koa-route");
var app = koa();
var jsdom = require("jsdom");
var Nuclear = require("alloynuclear")(jsdom.jsdom().defaultView);

var Todo = require("./component/todo")(Nuclear,true);



app.use(serve(__dirname + "/component"));

app.use(router.get("/todos", function *(){
    var  str = require("fs").readFileSync(__dirname + "/view/index.html", "utf8");
    var todo = new Todo({ items: ["Nuclear2","koa","ejs"] });
    this.body = Nuclear.Tpl.render(str, {
        todo:  todo.HTML
    }); 
    Nuclear.destroy(todo);
}));


app.listen(3000);

瀏覽器端使用的代碼:






 {{{todo}}}

 
 
 

這樣,組件的代碼不需要任何變更就可以在server和client同時(shí)使用。

Nuclear如何做到同構(gòu)的?

內(nèi)置三條管線如下所示:

比如一般前后端分離的開發(fā)方式,僅僅會(huì)走中間那條管線。而同構(gòu)的管線如下所示:

這里前后后端會(huì)共用option,所以不僅僅需要直出HTML,option也會(huì)一并支持給前端用來(lái)二次渲染初始一些東西。

Nuclear優(yōu)勢(shì)

1.節(jié)約流量
2.提升用戶體驗(yàn)
3.加載更加靈活
4.Dom查找?guī)缀踅^跡
5.搭積木一樣寫頁(yè)面
6.提升代碼復(fù)用性
7.可插拔的模板引擎
8.Lazy CSS首屏更輕松
9.Nuclear文件大小6KB (gzip)
10.零行代碼修改無(wú)縫切到同構(gòu)直出
...
...

Nuclear Github

https://github.com/AlloyTeam/Nuclear

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/80786.html

相關(guān)文章

  • 基于NuclearWeb組件-Todo的十一種寫法

    摘要:直搗黃龍黃龍即黃龍府,轄地在今吉林一帶,應(yīng)該是指長(zhǎng)春市農(nóng)安縣,為金人腹地。一直打到黃龍府。指搗毀敵人的巢穴。有人會(huì)說組合優(yōu)于繼承的。的變更會(huì)自動(dòng)更新依賴的組件??梢圆僮鲗?duì)象實(shí)例,的變更會(huì)自動(dòng)更新組件,屬性設(shè)置方法調(diào)用。 刀耕火種 刀耕火種是新石器時(shí)代殘留的農(nóng)業(yè)經(jīng)營(yíng)方式。又稱遷移農(nóng)業(yè),為原始生荒耕作制。 var TodoApp = Nuclear.create({ add: f...

    jayce 評(píng)論0 收藏0
  • zepto/jQuery、AngularJS、React、Nuclear的演化

    摘要:每個(gè)框架類庫(kù)被大量用戶大規(guī)模使用都說明其戳中了開發(fā)者的剛需。但是未執(zhí)行完的情況下發(fā)生人機(jī)交互雖然不會(huì)報(bào)腳本錯(cuò)誤,但是嚴(yán)重影響用戶體驗(yàn)開發(fā)者們被各種爽到之后,這個(gè)問題已經(jīng)被拋到了九霄云外。 寫在前面 因?yàn)閦epto、jQuery2.x.x和Nuclear都是為現(xiàn)代瀏覽器而出現(xiàn),不兼容IE8,適合現(xiàn)代瀏覽器的web開發(fā)或者移動(dòng)web/hybrid開發(fā)。每個(gè)框架類庫(kù)被大量用戶大規(guī)模使用都說明...

    Rindia 評(píng)論0 收藏0
  • 編程模式漫談

    摘要:按信息熵的觀點(diǎn)這種模式對(duì)熵的降低最大。但是,這將增加處理程序的復(fù)雜性,程序并不能輕松的自動(dòng)處理,或者要將多對(duì)多關(guān)聯(lián)分解成純粹的和有其他數(shù)據(jù)的兩種模式。模式是普遍存在的,從到。 4月份遺漏了一篇,這篇算是補(bǔ)充。 此文并非對(duì)設(shè)計(jì)模式的總結(jié),而是要談?wù)勔话愕木幋a風(fēng)格,找設(shè)計(jì)模式的朋友可以移步了。 什么是模式?我搜到一個(gè)簡(jiǎn)短的解釋:模式是指從生產(chǎn)經(jīng)驗(yàn)和生活經(jīng)驗(yàn)中經(jīng)過抽象和升華提煉出來(lái)的核...

    ARGUS 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<