常见问题:RequireJS 高级用法
- 如何重命名require?§ 1
- 如何加载CSS?§ 2
如何重命名require/define/requirejs?§ 1
RequireJS及其优化工具必须为0.26.0或更高版本才能起作用。
你为什么想做这个?您可能有非常严格的全局名称空间要求,或者您正在使用已经定义了require/define的代码,并且希望避免干扰。
关于此函数的一些注意事项:
- 确保使用require.js的源版本,而不是最小版本。
- 确保优化中包括了require.js版本,因为require.js文件的内容已更改,以便命名空间起作用。
- 正常使用require/define对模块进行编码,然后进行构建以对值进行命名空间。不要使用命名空间的require/define对模块进行编码。这将使您的代码可移植性降低,并不能被他人使用。
- 这种转换/优化只能运行一次。不要将此优化的输出用作另一个优化/构建阶段的输入。
以下示例优化配置基于优化页面上示例中使用的目录结构。此配置结合require.js与main.js到一个新的foo.js。文件。define()重命名为foo.define(),require()重命名为foo.require():
{
appDir: "../",
baseUrl: "scripts",
dir: "../../appdirectory-build",
//放入一个映射,以便下面模块部分中的“requireLib"将引用require.js内容。
paths: {
requireLib: 'require'
},
//指示要用于require/requirejs/define的命名空间。
namespace: "foo",
modules: [
{
name: "foo",
include: ["requireLib", "main"],
//True告诉优化器可以创建新文件foo.js。
//通常优化器希望foo.js存在于源目录中。
create: true
}
]
}
完成此优化后,将需要修改用于引用require.js的HTML以引用foo.js。
感谢Ryan Florence在名称空间设计方面的帮助。
如果您希望对内容进行更直接的控制,并希望通过修改来提交源代码,则可以使用另一种重命名方法。此方法不应 与上面演示的“命名空间"优化一起使用。
1)修改require.js的来源
在require.js代码周围需要包装,因此您可以将require函数设置为您选择的名称:
var myGlobalRequire = (function () {
//在这里定义一个require对象,该对象具有任何您想要的RequireJS默认配置
//如果没有任何要设置的配置选项,请使用简单的对象文本{}。
//您可能至少需要设置baseUrl。
var require = {
baseUrl: '..'
};
//在此处插入require.js内容
return require;
}());
2)修改加载的文件
对于使用此新函数加载的任何文件,如果以任何方式引用了这些文件,您都希望将它们包装在一个匿名函数中,以将require的值设置为在步骤1中设置的新函数名:
(function (require) {
//常规要求引用现在在这里正常工作。
}(myGlobalRequire));
按照上述步骤操作,应该可以使您使用优化工具将脚本有效地组合在一起。如果要在优化脚本中重命名的需求定义,请直接在包含优化选项中引用已修改的require.js ,如果要直接优化该文件,则将其作为名称选项。
如何加载CSS?§ 2
理想情况下,RequireJS可以将CSS文件作为依赖项加载。但是,有一些问题需要知道何时加载CSS文件,尤其是在从另一个域加载该文件的Gecko/Firefox中。在此Dojo票证中可以找到一些历史记录。
知道何时加载文件很重要,因为一旦样式表加载,您可能只想获取DOM元素的尺寸。
有些人已经实现了一种方法,他们寻找一种众所周知的样式以应用于特定的HTML元素,以了解是否加载了样式表。由于该解决方案的特殊性,它与RequireJS不太匹配。知道链接元素何时已加载参考文件将是最可靠的解决方案。
由于不知道何时加载文件是不可靠的,因此在RequireJS加载中显式支持CSS文件没有意义,因为由于浏览器行为而导致错误报告。如果您不关心何时加载文件,则可以执行以下操作轻松编写自己的函数以按需加载CSS:
function loadCss(url) {
var link = document.createElement("link");
link.type = "text/css";
link.rel = "stylesheet";
link.href = url;
document.getElementsByTagName("head")[0].appendChild(link);
}