转载自http://blog.csdn.net/kevinwon1985/article/details/8155267

RequireJS 把每一个依赖项当做一个script标签,使用 head.appendChild()来加载。

RequireJS 会计算好依赖关系,按照正确的顺序依次加载所有依赖项。然后才调用模块的构造函数。

在能同步加载模块的服务端JS中使用 RequireJS 也很容易,只需要重定义require.load()。可以用构建系统来做这个,服务端的 require.load 方法在build/jslib/requirePatch.js 中。

未来,这个代码可能会被当作一个可选的模块放到 require/ 目录中。这样你就可以在基于主机环境来使用正确的加载模式。

配置项§ 3

当我们在顶层页面(或者没有定义一个模块的顶层脚本文件)中使用 require() ,可以使用配置对象来进行配置:

  1. <script src="scripts/require.js"></script>
  2. <script>
  3. require.config({
  4. baseUrl: "/another/path",
  5. paths: {
  6. "some": "some/v1.0"
  7. },
  8. waitSeconds: 15
  9. });
  10. require( ["some/module", "my/module", "a.js", "b.js"],
  11. function(someModule,    myModule) {
  12. //This function will be called when all the dependencies
  13. //listed above are loaded. Note that this function could
  14. //be called before the page is loaded.
  15. //This callback is optional.
  16. }
  17. );
  18. </script>

并且,你可以在require.js加载前定义一个全局的require对象,它会在require.js加载后自动应用于配置。下面的例子定义了一些依赖项,一旦require()方法调用,他们就会加载:

  1. <script>
  2. var require = {
  3. deps: ["some/module1", "my/module2", "a.js", "b.js"],
  4. callback: function(module1, module2) {
  5. //This function will be called when all the dependencies
  6. //listed above in deps are loaded. Note that this
  7. //function could be called before the page is loaded.
  8. //This callback is optional.
  9. }
  10. };
  11. </script>
  12. <script src="scripts/require.js"></script>

注意: 最好这样写 var require = {} 而不要这样写 window.require = {}, 因为后者在IE下运行不正确。

支持的配置项:

baseUrl: 查找所有模块的根路径。所以,在上面第一个例子中,"my/module"的 script 标签 src="/another/path/my/module.js"。加载普通.js文件的时候, baseUrl 将不会起作用,script的src会直接使用 那些字符串,所以 a.js 和 b.js 会从HTML页面的同级目录中加载。

如果没有明确的配置 baseUrl ,它的默认值是会是加载require.js的HTML页面所在目录。如果使用 了data-main ,那么baseUrl会被设置成data-main指定的脚本所在目录。

baseUrl 可以与加载 RequireJS 的页面是不同域。  RequireJS 是可以加载跨域脚本的。 唯一的例外是,使用text! 插件加载的文本模块:这些路径必须与页面是在同一个域下,至少在开发的时候是这样的。当使用了 优化工具 后,跨域的文本模块会被打包进来,这时就加载跨域的文本模块了。

paths: 映射到不能直接在baseUrl下找到的模块名。 通常, path 设置的路径是相对于 baseUrl 的,除非 以 "/" 开头或包含URL协议 (例如" http:")。例如上例中,"some/module" 模块的最终生成的script标签的src="/another/path/some/v1.0/module.js"。 path的设置不要加.js后缀,因为path也可能是映射到一个目录。 如果path映射的是一个模块,RequireJS会自动加上.js后缀。

shim: 为那些没有使用 define() 声明依赖项、没有设置模块值、老的、传统的"浏览器全局"脚本配置依赖项和exports。例如 (RequireJS 2.1.0+):

requirejs.config({
shim: {
'backbone': {
//These script dependencies should be loaded before loading
//backbone.js
deps: ['underscore', 'jquery'],
//Once loaded, use the global 'Backbone' as the
//module value.
exports: 'Backbone'
},
'foo': {
deps: ['bar'],
exports: 'Foo',
init: function (bar) {
//Using a function allows you to call noConflict for
//libraries that support it, and do other cleanup.
//However, plugins for those libraries may still want
//a global. "this" for the function will be the global
//object. The dependencies will be passed in as
//function arguments. If this function returns a value,
//then that value is used as the module export value
//instead of the object found via the 'exports' string.
return this.Foo.noConflict();
}
}
}
}); //Then, later in a separate file, call it 'MyModel.js', a module is
//defined, specifying 'backbone' as a dependency. RequireJS will use
//the shim config to properly load 'backbone' and give a local
//reference to this module. The global Backbone will still exist on
//the page too.
define(['backbone'], function (Backbone) {
return Backbone.Model.extend({});
});

  

在RequireJS 2.0.* 中, shim 中的"exports" 属性也可以配置成一个函数。这种情况, 它的功能和上面的 "init" 属性一样。  "init" 属性用于RequireJS 2.1.0+ 中,如此, exports配置的字符串值可用于 enforceDefine,也可用于类库加载后的一些功能性工作。

像 jQuery 或者 Backbone 插件这种不需要导出一个模块值的模块,可以用 shim 只配置一个表示依赖项的数组:

requirejs.config({
shim: {
'jquery.colorize': ['jquery'],
'jquery.scroll': ['jquery'],
'backbone.layoutmanager': ['backbone']
}
});

然而如果你想要在IE中检测404并执行fallbacks 或者errbacks,那么就必须配置 exports ,这样加载器才能检测脚本是否加载成功:

requirejs.config({
shim: {
'jquery.colorize': {
deps: ['jquery'],
exports: 'jQuery.fn.colorize'
},
'jquery.scroll': {
deps: ['jquery'],
exports: 'jQuery.fn.scroll'
},
'backbone.layoutmanager': {
deps: ['backbone']
exports: 'Backbone.LayoutManager'
}
}
});

  

关于"shim"配置项的重要注意事项:

  • shim只是配置模块的依赖关系。需要加载 模块的话,还是需要用 调用require/define 。 设置shim不会触发加载代码。
  • 确保"shim"配置的模块只当另外一个"shim"配置的模块或者没有依赖关系的AMD模块的依赖模块,并且在在他们创建一个全局变量后调用define()(比如 jQuery ,lodash)。 另外,如果你使用一个 AMD 模块当shim配置的模块的依赖项,打包后, 那个AMD模块在shim配置的模块代码运行前可能不会被赋值 ,并且会抛出一个错误。 最终的解决方案是升级shim配置的模块的代码,加一个可选的 AMD define() 调用。

优化工具配置中的 "shim" 的重要注意事项:

  • 你需要在 mainConfigFile打包配置 中指定shim配置项所在的配置文件。 否则,优化工具找不到 shim 配置。 另一种做法是在打包的配置文件中保留shim配置的副本。
  • 不要在shim配置中混合使用 CDN 加载。 案例:你从CDN加载jQuery,但从本地加载依赖jQuery的Backbone 。当你打包的时候,确保内置jQuery到打包的文件中并且不要从CDN加载。否则,Backbone也会被内置到打包的文件并且在 从CDN加载的jQuery加载前执行。 这是因为shim配置的模块只是延时到依赖模块加载完后再加载, 但是不会自动的使用define包装。 打包后,Backbone 内置了,而来自CDN的jQuery不会被内置,Backbone 会在jQuery加载前、文件加载后执行,而不能在依赖模块jQuery加载后再执行define包装的代码。 define()包装的模块可以与 CDN加载的代码一起使用,因为这些模块正确的使用了define工厂函数进行了包装,这使得他们在依赖项加载前是不会执行的。总结: shim配置是一个为了解决非模块代码,历史代码的方法。 用define()包装的模块更好。
  • 如果你使用uglifyjs来压缩你的代码,不要设置uglifyjs的配置项toplevel 为 true,或者在用命令行的时候不要使用参数-mt。 这些方法会破坏shim需要使用的全局变量名。
  • map: 对于给定的相同的模块名,加载不同的模块,而不是加载相同的模块。

    这种特性在某些大型项目是非常有用的。例如那种有两套不同的模块依赖两个不同版本的'foo'模块,并且这两套模块需要相互协作。

    这时 使用context配置来支持多版本模块加载 是不行的。这种情况下,  paths config 只能设置模块的根路径,而不是映射一个模块到另一个。

    map 的例子:

    requirejs.config({
    map: {
    'some/newmodule': {
    'foo': 'foo1.2'
    },
    'some/oldmodule': {
    'foo': 'foo1.0'
    }
    }
    });

    如果模块在硬盘上的结构是这样:

    • foo1.0.js
    • foo1.2.js
    • some/
      • newmodule.js
      • oldmodule.js

    在'some/newmodule' 模块中 `require('foo')` 时,加载的是 foo1.2.js ,当 'some/oldmodule' 模块中 `require('foo')` 时,加载的是 foo1.0.js。

    这个特性只在使用 define()包装的AMD模块时才有效,并且必须是匿名模块。

    map的值也可以是"*",表示全匹配,即所有模块遵循这一设置。如果还有其他匹配项,将会比"*"的配置优先级高。例如:


    requirejs.config({
    map: {
    '*': {
    'foo': 'foo1.2'
    },
    'some/oldmodule': {
    'foo': 'foo1.0'
    }
    }
    });

    `require('foo')` 时,除了"some/oldmodule" 中会加载 "foo1.0", 其他模块都加载"foo1.2" 。

    config: 传递一个配置信息到模块中是一个常见的需求。这个配置信息通常是应用的一部分,我们需要把它传递到模块中。 在 RequireJS 中,requirejs.config()中的config 配置项 就是为了解决这个需求。 模块中可以通过内置依赖模块"module" ,通过调用module.config()方法来获取传递进来的配置信息。例如:

    requirejs.config({
    config: {
    'bar': {
    size: 'large'
    },
    'baz': {
    color: 'blue'
    }
    }
    }); //bar.js, which uses simplified CJS wrapping:
    //http://requirejs.org/docs/whyamd.html#sugar
    define(function (require, exports, module) {
    //Will be the value 'large'
    var size = module.config().size;
    }); //baz.js which uses a dependency array,
    //it asks for the special module ID, 'module':
    //https://github.com/jrburke/requirejs/wiki/Differences-between-the-simplified-CommonJS-wrapper-and-standard-AMD-define#wiki-magic
    define(['module'], function (module) {
    //Will be the value 'blue'
    var color = module.config().color;
    });

    packages: 配置从CommonJS 包来加载模块。详见 packages topic

    waitSeconds: 放弃加载脚本前的等待的秒数。 设置为 0 则禁用此功能。默认是 7 秒。

    context: 加载上下文配置(require.config的对象)的名字。 只要顶级 require调用指定一个唯一context字符串,require.js就可以在一个页面中加载多个版本的模块。要正确的使用它,参考 Multiversion Support 。

    deps: 需要加载的依赖项的数组。当在require.js加载前使用全局 require对象来定义配置的时候很有用,也可以在require()一定义后就马上加载指定依赖项的时候用。

    callback: 所有依赖项加载后执行的回调函数。 当在require.js加载前使用全局 require对象来定义配置的时候很有用,也可以用在require.config中

    enforceDefine: 如果设置为true, 当加载的脚本是没用define()包装过,且在shim配置中没有配置exports值时会抛错。 详见 Catching load failures in IE 。

    xhtml: 如果设置为 true,requireJS 将使用document.createElementNS() 来创建script标签。

    urlArgs:RequireJS 用来匹配资源的额外的 URL的查询参数 。通常的用法是在浏览器或者服务器配置不对的时候禁用缓存。例如:

    urlArgs: "bust=" +  (new Date()).getTime()

    这在开发的时候很有用,但是在部署的时候最好删除它。

    scriptType:  设置 RequireJS生成的 script 标签的 type属性值。默认是"text/javascript"。 可设置为"text/javascript;version=1.8" 来使用Firefox's JavaScript 1.8特性。

RequireJS 2.0 API之配置项的更多相关文章

  1. JAXB 2.0 API is being loaded from the bootstrap classloader

    在使用webservice,mule esb等需要jaxb的项目里经常会出现 JAXB 2.0 API is being loaded from the bootstrap classloader这个 ...

  2. Android 5.0 API

    Android 5.0 (LOLLIPOP) 为用户和应用开发者提供了新功能.本文旨在介绍其中最值得关注的新 API. 如果您有已发布的应用,请务必看一看 Android 5.0 行为变更,了解您的应 ...

  3. Android 5.0 API新增和改进

    开始开发 要构建 Android 5.0 版应用,您必须先下载 Android SDK,然后使用 SDK 管理器下载 Android 5.0 SDK 平台和系统映像. 更新您的目标 API 级别 要进 ...

  4. 天地图,js 4.0 api,简单调用,高手请绕行

    本文介绍使用天地图 js4.0 api,实现地图显示后台gps分布情况: 主要借用H5 GPS获取,利用天地图的背景展示: 效果图如下: 第一步,通过采集网页,手机gps数据,录入后台数据库:界面如下 ...

  5. 从零开始搭建.NET Core 2.0 API(学习笔记一)

    从零开始搭建.NET Core 2.0 API(学习笔记一) 一. VS 2017 新建一个项目 选择ASP.NET Core Web应用程序,再选择Web API,选择ASP.NET Core 2. ...

  6. 构建使用SQL服务器的ASP.net Core2.0 API

    web api的教程非常少,使用 core2.0的更少,微软提供了一个aspnet core2的教程,也提供了EF core中访问SQL服务器的教程,参考这些教程可以做出使用sql server的as ...

  7. Android SDK Manager 无法下载Android8.1.0(API 27) SDK Platform

    在Android SDK Manager 中安装Android 8.1.0 SDK Platform时报错导致无法安装. 错误信息:Downloading SDK Platform Android 8 ...

  8. android 6.0(api 23) SDK,不再提供org.apache.http.*(只保留几个类)

    在使用android-async-http的时候我的apl 更新到了23,我的build version也是23的时候出现了,org.apache.http.Header这个类找不到的情况,原因是在a ...

  9. RequireJS 2.0 正式发布(转)

    RequireJS发布了一个大版本,直接从version1.0.8升级到了2.0.随后的几小时James Burke又迅速的将版本调整为2.0.1,当然其配套的打包压缩工具r.js也同时升级到了2.0 ...

随机推荐

  1. JS常用工具类代码

    http://www.cnblogs.com/liszt/archive/2011/08/16/2140007.html js/javascript删除字符串中的html标签 function rem ...

  2. php判断是否是微信浏览器

    php判断是否是微信浏览器 直接上代码: <?PHP function is_wechat_browser(){ $user_agent = $_SERVER['HTTP_USER_AGENT' ...

  3. OpenCV——黑白调整

    参考算法: 闲人阿发伯的博客 // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUD ...

  4. php实现多文件上传和下载。

    http://1229363.blog.163.com/blog/static/19743427200751291055264/

  5. Kill掉MySQL中所有sleep的client线程 (转)

    vim killsleep.sh #It is used to kill processlist of mysql sleep #!/bin/sh while : do   n=`mysqladmin ...

  6. HDOJ1677(铺砖问题)

    Nested Dolls Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  7. RSA-CRT leaks__因使用中国余数定理计算RSA所引起的私钥泄露

    在heartbleed[1]漏洞后,很多用户打开了PFS[2]功能.但很不幸,之后RedHat又报告出在多个平台上存在RSA-CRT导致的密钥泄露[3]. 中国余数定理(CRT)常被用在RSA的计算中 ...

  8. u-boot向linux内核传递启动参数

    U-BOOT 在启动内核时,会向内核传递一些参数.BootLoader 可以通过两种方法传递参数给内核,一种是旧的参数结构方式(parameter_struct),主要是 2.6 之前的内核使用的方式 ...

  9. ES6学习之数组扩展

    扩展运算符(...将数组分割为用逗号分割的参数序列) console.log(...[1,2,3]) //1 2 3 可替换数组的apply写法: function test(x,y,z){ cons ...

  10. C#设计模式(12)——享元模式

    一.概念 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直 ...