有几件事要尝试:
您的定义函数需要有一个数组作为第一个参数,因为这是您指定此模块的任何模块依赖项的地方。如果您的模块不需要任何其他脚本或模块即可工作,则此数组为空,如下所示:
define([], function(){
//Your code here
});
现在这是稍微令人困惑的部分,因为 RequireJS 的工作方式是它使用模块路径作为模块名称。这真的很强大,因为它使您的模块具有高度的可移植性,而且还使指定您需要的模块及其所在位置的行为变得相同。
因此,如果上面定义的模块位于“mymodule/js/component.js”,您将能够加载它并在另一个脚本中异步使用它,如下所示:
//some existing script that then needs a JS module that has not been loaded yet
require(['mymodule/js/component'], function(component){
//All loaded modules are provided as arguments in the
//order they are specified in the require array
var a = component();
});
因此,您的示例变为以下内容:
//This script located at mymodule/js/loadImage.js
if (typeof define === 'function' && define.amd) {
define([], function () {
return loadImage;
});
} else {
$.loadImage = loadImage;
}
//Script located in another file that needs the loadImage module
require(['mymodule/js/loadImage'], function(loadImage){
loadImage();
});
最后一点,如果您愿意,可以通过将名称指定为 define 调用的第一个参数来为您的模块提供简短的、简洁的名称。这不是推荐的,因为您需要在第一次需要它时指定文件的路径,因为 RequireJS 不会仅从一个短名称中知道它的位置。适合的地方是当您预先加载所有脚本而不是在需要它们时(建议这样做,因为所有内容都是按需加载的)。但是,这里是您如何为模块指定“短”名称的方式:
//This script located at mymodule/js/loadImage.js
if (typeof define === 'function' && define.amd) {
define("loadImage", [], function () {
return loadImage;
});
} else {
$.loadImage = loadImage;
}
如果您知道 loadImage 模块已加载,则上述技术允许您执行以下操作:
//Even if loadImage has been already fetched, this is good practice since you can
//add more modules to be the dependency array if you need
require(['loadImage'], function(loadImage){
loadImage();
});
//or sometimes this can be convenient:
var loadImage = require("loadImage")
loadImage();
更新
忘了提一下,如果您想创建一个需要 loadImage 模块才能运行的模块,您可以这样做:
//By providing the module dependencies in the first argument, RequireJS will
//fetch it and load it if needed
define(['mymodule/js/loadImage'], function(loadImage){
loadImage();
})