AMD规范的——RequireJS

就是为了解决命名冲突和文件依赖的问题的。

之前用jquery写的豆瓣电影,是对象封装写的,demo
可以先看下源码,然后对比下的。
然后用RequireJS写一下,先说,模块在这里就是封装的那几个对象了,思路是什么呢?
把这几个对象当成模块,那就是一个个的独立的js文件,这些模块,必须要定义,一定义,就要用RequireJS里的函数:

define([所有依赖的模块文件路径字符串格式的数组],function(x,y,z,,,){
   ,,,
,,,
return ,,,
})  //x,y,z,,,是定义的模块加载执行后返回的内容的变量

先看下文件目录

us,top250,search,jquery,heap,app都是模块,其中app的作用是启动管理他们的,app就是依赖他们的。而main是RequireJS的一个桥梁,连接作用到app这个启动器的。这样,引入RequireJS文件,被执行就找到main文件,main里require那个启动管理的模块app ,然后app运行又依赖其他的几个模块,其他几个模块又被加载执行了,其他的模块又有依赖的,就又加载执行,,,这样代码就跑起来了。



这就是加载RequireJS,里面的data-main是相对于这个html去定位要作用的文件,就是那个要require模块的文件.

require.config是配置的,设置了之后,对于文件路径,默认是js文件夹的根目录下,书写方便。

下面那个就是RequireJS的第二个函数了,一个是定义模块,一个是引入模块执行。
这里就是引入了模块们中的那个启动所有模块的控制台app了。这里回调函数的参数可以随便写,都是指向被引用的模块执行后返回的对象。下面可以印证一下的:
剩下的就是简单了,定义各个模块,然后设置模块被引用时要返回的对象。

app:

看定义的写法,先是它依赖的模块,这些依赖的意思换从前就是这个对象里没有的变量或者方法的说法,看app.init()就直接跑通了所有模块了吧。
还有return app,回应上面说的require吧。
再,分别看看其他模块,除了jquery那个特殊,不需要定义的,直接把源码放进去就行了,在回调函数里,返回值我用$指代了。
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">  剧情 / 动作/ 犯罪 </span>
                    </div>
                    <div class="mes">
                        导演:<span class="director">就死按建设</span>
                    </div>
                    <div class="mes">
                        主演:<span class="actor">张国荣 、 张丰毅 、巩俐 、葛优 </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
})

自己做了一遍,觉得跟想象的不一样,不抽象了,有个错误,就是jquery的版本如果是高版本的,就会报错,我也不知道为什么,挺别扭的。

实际感受

因为模块很少,也没有体现出太多优点来,不过很明显,很条理,反正代码维护起来真的很方便的。而且看看加载的方式吧,自己觉得很高大上的。

里面有个滚动事件的bug,太晚了,我下次更改掉,这里关键是RequireJS。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,424评论 25 707
  • requirejs、require方法冲突 如果加载了多个requirejs脚本,每个requirejs会判断是否...
    Howie223阅读 1,629评论 1 2
  • 虽然从没有认为自己是一个前端开发者,但不知不觉中也积累下了一些前端开发的经验。正巧之前碰到一道面试题,于是就顺便梳...
    AlloVince阅读 6,840评论 1 49
  • 01 刚准备好好写一份文案稿,可没过十分钟,就有电话打进来,打断了思路;正专心做产品设计,才有点新思路,没来得及文...
    山千黛阅读 839评论 8 10