require.js 使用方法

0x01 require.js 要解决的问题

在前端开发中我们需要引入大量的js脚本,在引入过程中需要保证引入的顺序的先后性以确定不同脚本之间的依赖关系得到满足。但是网页在加载js脚本时会暂停对网页元素的渲染,为了避免这种情况的出现,一般我们可以让js脚本异步加载或者将js脚本放在HTML网页的底部引入

<script src="require.js" defer async = "true"></script>

async属性指定js脚本异步加载,IE浏览器不支持该属性但支持defer属性,所以也需要将defer属性写上。

require.js 的出现是为了解决两个问题:

  1. 实现js文件的异步加载,避免网页失去响应;
  2. 管理模块之间的依赖性,便于代码的编写和维护。

0x02 require.js使用方法

  1. 引入require.js
<script src = "require.js" data-main = "js/main"></script>

data-main属性指向的是js的入口文件(主模块),由于require.js默认加载文件和模块的后缀是js文件,因此js后缀可以省略。

  1. 主模块的写法

如果主模块中没有依赖的js模块,可以直接写入js代码,但是这种写法并不规范。当主模块存在依赖模块时,我们可以使用require函数引入依赖模块。

require( [‘jquery’], function($){
      //code
      $('#id').on('click',function(e){});
});

这里在主模块中就引入了jQuery,需要注意的是引入的模块需要写入到数组中。require函数的以一个参数为引入依赖模块的名称,为数组形式。第二个参数为回调函数,其传入参数为各个模块。

  1. require的配置

默认情况下,加载的模块和主模块在同一级目录下,但是如果加载的模块和主目录不再同一级目录下需要对其路径进行配置,这时可以使用require.config()函数,具体使用方法如下:

require.config({
      paths:{
              "jquery":"lib/jquery.min"
        }
});

前面我们也提到require.js加载模块时会默认将对应文件的后缀js省略掉,所以当我们传入加载的模块名称(jquery)时,它默认要加载的文件是当前目录下的“jquery.js” 文件,如果没有该文件则程序会报错。如果模块名称对应的不是同名称的文件则需要在paths中配置模块名称和文件名称及路径的对应关系。require.config()函数要写在主模块的头部。

如果加载的模块的路径统一发生了变化还可以这样写

require.config({

    baseUrl:"/js/lib",

    paths:{
          "jquery" : "jquery.min"
     }
});

如果加载远程主机上的文件可以这样写

require.config({

    paths: {

      "jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"

    }

  });

  1. require.js 被加载模块的写法

被加载的模块要严格按照AMD的规范来写。如果一个模块不依赖于其他模块,那么这个模块可以这样来写:

//moduleA.js
define(function(){
      var foo = function(){
        //do something
      }
      return {
                foo:foo
      };
});

加载方法如下

require(['moduleA'], function(moduleA){
          modeulA.foo();
});

如果moduleA依赖于其他模块那么在加载模块时还需要同时加载依赖的模块

//moduleA.js
define(['mylib'], function(mylib){
          var foo = function(){
                  mylib.do();
          }
        return {
              foo:foo
        };
});

加载模块时需要先加载依赖的模块

require(['mylib','moduleA'],function(mylib,moduleA){
          moduleA.foo();
});
deps: ['underscore', 'jquery'],
        exports: 'Backbone'
  1. 加载非规范的模块

有些模块并不是按照AMD的规范写的,对于这类非规范的模块,我们需要首先在require.config()函数中配置好这些模块。

require.config(
        paths:{
              "moduleA":"/lib/moduleA"
        },
        shim:{
                "moduleA":{
                  deps: ['moduleB', 'moduleC'],
     exports: 'moduleA'
                  }
        }
);

shim属性用来配置不兼容的模块,其中需要对每个模块指定deps属性即依赖的其他模块,exports属性即这个模块在外部调用时的名称。

  1. 插件

require.js中有各种插件,插件使用及制作过程详见requirejs的插件介绍与制作

参考
对require.js 的使用进行总结
Javascript模块化编程(三):require.js的用法

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

推荐阅读更多精彩内容

  • jacascript模块化几乎被看做是前端工程师必备技能,本人最近事务缠身,学习require.js的事件被拖了好...
    春木橙云阅读 1,762评论 0 0
  • 33、JS中的本地存储 把一些信息存储在当前浏览器指定域下的某一个地方(存储到物理硬盘中)1、不能跨浏览器传输:在...
    萌妹撒阅读 2,080评论 0 2
  • 模块通常是指编程语言所提供的代码组织机制,利用此机制可将程序拆解为独立且通用的代码单元。所谓模块化主要是解决代码分...
    MapleLeafFall阅读 1,167评论 0 0
  • https://www.cnblogs.com/HCJJ/p/6611669.html requireJS 可以很...
    小杺阅读 841评论 0 3
  • JavaScript模块化 当前的网页已经开始逐渐变成"互联网应用程序", 在网页中插入的JavaScript代码...
    HelloJames阅读 1,237评论 0 4