AMD規(guī)范的——RequireJS

就是為了解決命名沖突和文件依賴的問題的曲掰。

之前用jquery寫的豆瓣電影疾捍,是對(duì)象封裝寫的,demo栏妖。
可以先看下源碼乱豆,然后對(duì)比下的。
然后用RequireJS寫一下吊趾,先說宛裕,模塊在這里就是封裝的那幾個(gè)對(duì)象了,思路是什么呢论泛?
把這幾個(gè)對(duì)象當(dāng)成模塊揩尸,那就是一個(gè)個(gè)的獨(dú)立的js文件,這些模塊屁奏,必須要定義岩榆,一定義,就要用RequireJS里的函數(shù):

define([所有依賴的模塊文件路徑字符串格式的數(shù)組],function(x,y,z,,,){
   ,,,
,,,
return ,,,
})  //x,y,z,,,是定義的模塊加載執(zhí)行后返回的內(nèi)容的變量

先看下文件目錄

us,top250,search,jquery,heap,app都是模塊,其中app的作用是啟動(dòng)管理他們的勇边,app就是依賴他們的犹撒。而main是RequireJS的一個(gè)橋梁,連接作用到app這個(gè)啟動(dòng)器的粒褒。這樣识颊,引入RequireJS文件,被執(zhí)行就找到main文件怀浆,main里require那個(gè)啟動(dòng)管理的模塊app ,然后app運(yùn)行又依賴其他的幾個(gè)模塊谊囚,其他幾個(gè)模塊又被加載執(zhí)行了,其他的模塊又有依賴的执赡,就又加載執(zhí)行镰踏,,沙合,這樣代碼就跑起來了奠伪。



這就是加載RequireJS,里面的data-main是相對(duì)于這個(gè)html去定位要作用的文件首懈,就是那個(gè)要require模塊的文件.

require.config是配置的绊率,設(shè)置了之后,對(duì)于文件路徑究履,默認(rèn)是js文件夾的根目錄下滤否,書寫方便。

下面那個(gè)就是RequireJS的第二個(gè)函數(shù)了最仑,一個(gè)是定義模塊藐俺,一個(gè)是引入模塊執(zhí)行。
這里就是引入了模塊們中的那個(gè)啟動(dòng)所有模塊的控制臺(tái)app了泥彤。這里回調(diào)函數(shù)的參數(shù)可以隨便寫欲芹,都是指向被引用的模塊執(zhí)行后返回的對(duì)象。下面可以印證一下的:
剩下的就是簡(jiǎn)單了吟吝,定義各個(gè)模塊菱父,然后設(shè)置模塊被引用時(shí)要返回的對(duì)象。

app:

看定義的寫法剑逃,先是它依賴的模塊浙宜,這些依賴的意思換從前就是這個(gè)對(duì)象里沒有的變量或者方法的說法,看app.init()就直接跑通了所有模塊了吧蛹磺。
還有return app梆奈,回應(yīng)上面說的require吧。
再称开,分別看看其他模塊亩钟,除了jquery那個(gè)特殊乓梨,不需要定義的,直接把源碼放進(jìn)去就行了清酥,在回調(diào)函數(shù)里扶镀,返回值我用$指代了。
define(['jquery', 'heap'], function($, heap) {
    var top250 = {
        init: function() {
            this.$box = $('main')
            this.bind()
            this.start()
            this.index = 0
            this.$container = $('section').eq(0)
            this.isloading = false
        },
        bind: function() {
            var self = this
            this.$box.scroll(function() {
                if (!self.isloading && self.isbottom()) {
                    self.start()
                }
            })
        },
        start: function() {

            var self = this
            if (self.isloading) return;
            self.isloading = true
            heap.loading()
            $.ajax({
                url: 'http://api.douban.com/v2/movie/top250',
                method: 'GET',
                data: {
                    start: self.index,
                    count: 20
                },
                dataType: 'jsonp'
            }).done(function(ret) {
                self.judge(ret.subjects)
                console.log(ret.subjects)
                if (ret.subjects.length === 0) return;
                self.index += 20
                self.setdata(ret.subjects)
            }).fail(function() {
                console.log('error...')
            }).always(function() {
                self.isloading = false
                heap.unloading()
            })
        },
        setdata: function(data) {
            var self = this
            data.forEach(function(movie) {
                self.$container.append(heap.build(movie))
            })
        },
        isbottom: function() {
            console.log(this.$box.height() + this.$box.scrollTop() + 10 >= this.$container.height(), 'daodile')
            return this.$box.height() + this.$box.scrollTop() + 10 > this.$container.height()
        },
        judge: function(data) {

            if (data.length === 0) {
                $('.remind').css('display', 'block')
                setTimeout(function() {
                    $('.remind').css('display', 'none')
                }, 1000)
            }
        }
    }
    return top250
})
define(['jquery', 'heap'], function($, heap) {
    var search = {
        init: function() {
            this.$box = $('main')
            this.bind()
            this.index = 0
            this.$container = $('section').eq(2)
            this.isloading = false
            this.$input = $('section input')
        },
        bind: function() {
            var self = this
            $('section button').on('click', function() {
                self.index = 0
                self.$container.find('div').eq(0).siblings().remove()
                self.start()
            })
            this.$box.scroll(function() {
                if (self.isbottom()) {
                    self.start()
                }
            })
        },
        start: function() {

            var self = this
            if (self.isloading) return;
            self.isloading = true
            heap.loading()
            $.ajax({
                url: 'http://api.douban.com/v2/movie/search',
                method: 'GET',
                data: {
                    start: self.index,
                    count: 20,
                    tag: self.$input.val()
                },
                dataType: 'jsonp'
            }).done(function(ret) {
                //judge(ret.subjects)
                if (ret.subjects.length === 0) return;
                self.index += 20
                self.setdata(ret.subjects)
            }).fail(function() {
                console.log('error...')
            }).always(function() {
                self.isloading = false
                heap.unloading()
            })
        },
        setdata: function(data) {
            var self = this
            data.forEach(function(movie) {
                self.$container.append(heap.build(movie))
            })
        },
        isbottom: function() {
            return this.$box.height() + this.$box.scrollTop() + 10 >= this.$container.height()
        }
    }
    return search
})

define(['jquery'], function(j) {
    var heap = {
        loading: function loading() {
            $('.icon-loading').fadeIn()
        },

        unloading: function unloading() {
            $('.icon-loading').fadeOut()
        },

        build: function build(movie) {
            var tpl = `<div class="item">
                    <a href="" class="clearfix">
                    <img src="http://img7.doubanio.com/view/movie_poster_cover/spst/public/p480747492.jpg" alt="">
                    <h2>霸王別姬</h2>
                    <div class="mes">
                        <span class="score">9.0分</span>
                        <span>&nbsp/&nbsp</span>
                        <span class="collect">1113234收藏</span>
                    </div>
                    <div class="mes">
                        <span class="year">1994</span>
                        <sapn>&nbsp/&nbsp</span>
                        <span class="type">  劇情 / 動(dòng)作/ 犯罪 </span>
                    </div>
                    <div class="mes">
                        導(dǎo)演:<span class="director">就死按建設(shè)</span>
                    </div>
                    <div class="mes">
                        主演:<span class="actor">張國榮 焰轻、 張豐毅 臭觉、鞏俐 、葛優(yōu) </span>
                    </div>
                </a>
                </div>`
            var $node = $(tpl)
            $node.find('a >img').attr('src', movie.images.medium)
            $node.find('a').attr('href', movie.alt)
            $node.find('a>h2').text(movie.title)
            $node.find('a .score').text(movie.rating.average + '分')
            $node.find('a .collect').text(movie.collect_count + '收藏')
            $node.find('a .year').text(movie.year)
            $node.find('a .type').text(movie.genres.join(' / '))
            $node.find('a .director').text(function() {
                var arr = []
                movie.directors.forEach(function(obj) {
                    arr.push(obj.name)
                    return arr
                })
                return arr.join('辱志、 ')
            })
            $node.find('a .actor').text(function() {
                var arr = []
                movie.casts.forEach(function(obj) {
                    arr.push(obj.name)
                    return arr
                })
                return arr.join('蝠筑、 ')
            })
            return $node
        }
    }
    return heap
})

自己做了一遍,覺得跟想象的不一樣揩懒,不抽象了什乙,有個(gè)錯(cuò)誤,就是jquery的版本如果是高版本的已球,就會(huì)報(bào)錯(cuò)臣镣,我也不知道為什么,挺別扭的智亮。

實(shí)際感受

因?yàn)槟K很少忆某,也沒有體現(xiàn)出太多優(yōu)點(diǎn)來,不過很明顯阔蛉,很條理弃舒,反正代碼維護(hù)起來真的很方便的。而且看看加載的方式吧状原,自己覺得很高大上的棒坏。

里面有個(gè)滾動(dòng)事件的bug,太晚了遭笋,我下次更改掉,這里關(guān)鍵是RequireJS徒探。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瓦呼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子测暗,更是在濱河造成了極大的恐慌央串,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碗啄,死亡現(xiàn)場(chǎng)離奇詭異质和,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)稚字,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門饲宿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厦酬,“玉大人,你說我怎么就攤上這事瘫想≌淘模” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵国夜,是天一觀的道長(zhǎng)减噪。 經(jīng)常有香客問我,道長(zhǎng)车吹,這世上最難降的妖魔是什么筹裕? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮窄驹,結(jié)果婚禮上朝卒,老公的妹妹穿的比我還像新娘。我一直安慰自己馒吴,他們只是感情好扎运,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饮戳,像睡著了一般豪治。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扯罐,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天负拟,我揣著相機(jī)與錄音,去河邊找鬼歹河。 笑死掩浙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秸歧。 我是一名探鬼主播厨姚,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼键菱!你這毒婦竟也來了谬墙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤经备,失蹤者是張志新(化名)和其女友劉穎拭抬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侵蒙,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡造虎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纷闺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片算凿。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡份蝴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澎媒,到底是詐尸還是另有隱情搞乏,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布戒努,位于F島的核電站请敦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一士八、第九天 我趴在偏房一處隱蔽的房頂上張望恭应。 院中可真熱鬧县恕,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛤奥,卻和暖如春佳镜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凡桥。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工蟀伸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缅刽。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓啊掏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親衰猛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迟蜜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)啡省,斷路器娜睛,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,518評(píng)論 25 707
  • requirejs、require方法沖突 如果加載了多個(gè)requirejs腳本冕杠,每個(gè)requirejs會(huì)判斷是否...
    Howie223閱讀 1,631評(píng)論 1 2
  • 雖然從沒有認(rèn)為自己是一個(gè)前端開發(fā)者,但不知不覺中也積累下了一些前端開發(fā)的經(jīng)驗(yàn)酸茴。正巧之前碰到一道面試題分预,于是就順便梳...
    AlloVince閱讀 6,855評(píng)論 1 49
  • 01 剛準(zhǔn)備好好寫一份文案稿笼痹,可沒過十分鐘配喳,就有電話打進(jìn)來,打斷了思路凳干;正專心做產(chǎn)品設(shè)計(jì)晴裹,才有點(diǎn)新思路,沒來得及文...
    山千黛閱讀 840評(píng)論 8 10