1.1 RequireJS 在全局范围内注册了自己的两个实例——require
而且requirejs
——实际上只是出于一个原因——如果一个(很可能)被另一个范围或实现不同的实例require
覆盖,你仍然拥有——通常总是一个全局的。当您计划使用与您现在所在的模块相关的资源时,这种分离很重要。require
requirejs
// contents of 'a/b/c.js' module file
define(['require'], function(require){
// "local scope" require call
// resolves to 'a/b/d.js' file
require(['./d'], function(d){})
// "global scope" require call
// resolves to 'd.js' file
requirejs(['./d'], function(d){})
})
请注意,请求 local require 仅在定义调用中才有意义。因为define
调用是建立“模块”和它的 ID。以上等价于这个命名定义:
// contents of whatever file
define('a/b/c', ['require'], function(require){
// "local scope" require call
// resolves to 'a/b/d.js' file
require(['./d'], function(d){})
// "global scope" require call
// resolves to 'd.js' file
requirejs(['./d'], function(d){})
})
James 放在那里的另一个秘密原因requirejs
是强迫您继续require
在本地范围内使用,因为他的构建工具会查找该特定字符串require
以查找 require 调用。你这样做,r.js
突然不能跟随你的依赖树,因为myLocalRequire
不是r.js
预期的:
// contents of 'a/b/c.js' module file
define(['require'], function(myLocalRequire){
// "local scope" require call
// resolves to 'a/b/d.js' file
myLocalRequire(['./d'], function(d){})
// "global scope" require call
// resolves to 'd.js' file
require(['./d'], function(d){})
})
1.2 RequireJS 根本不做同步加载。唯一你认为“必须同步!”的地方 - CommonJS 风格var a = require('a')
的调用就像它仍然不是一样。它将资源从缓存中拉出。换句话说,它从不同步加载任何东西。
1.3 不要使用捆绑的RequireJS+jQuery。它使已经很大的 jQuery 变得更大,并干扰浏览器缓存。(而不是使用来自 CDN 的缓存 jQuery,您强制用户再次下载相同的 jQuery - 100k 垃圾)。
请参阅:Use jQuery as a dependency without loading jQuery with RequireJS?
2.0 不要。单独的配置是一个陷阱。一旦你开始“构建”你的应用程序,你就会心甘情愿地进入地狱。我敢于给我一个单独的健全配置的示例,我无法将其表示为命名定义组或主模块加载相关资源的“包”。
唯一必须在 RequireJS 配置中的是“baseUrl”和 2-5 个全局使用的“路径”定义。而已。