基于require 写了个js模块,该模块命名为:d
,文件名为d.js
。例如:
javascript
define(['a', 'b', 'c'], function(a, b, c) { var API = { init: function() {} }; return API; });
通常调用方式:
javascript
require(['d'], function(d) { d.init(); });
但是,我想让其他项目也调用我的模块,他们并没有使用AMD。我想把d
暴露注册到window
上。使用的方式为:
1.引入d.js
。
2.调用全局公开接口:d.init()
然而这样是不行的,因为依赖是异步载入的。
那就先加载一个amd模块吧
$.getScript('http://ooxx/require.js', function(){
require.config({
path: {
d: '...'
}
});
require(['d'], function(d){
d.init()
})
})
根据楼主的描述,我猜测有如下情况
1. 项目中部分代码使用requirejs,d.js是各个模块中的其中一个,那么他的加载时机必然会在script加载方式完成之后,这个时候可以**
define(['a', 'b', 'c'], function(a, b, c) {
var API = {
init: function() {}
};
window.d = API;
});
如果需要在d.js加载之前调用,那么可以使用简单的依赖注入。
如:
html中的script中
$(function(){
var d;
window.moduleDInited = function(moduleD){
//当d.js加载完成后调用
d = moduleD;
d.init();
};
})
d.js中
define(['a', 'b', 'c'], function(a, b, c) {
var API = {
init: function() {}
};
//初始化完成,注入到依赖模块
window.moduleDInited(API);
});
2. 使用r.js,或grunt/gulp,把你的工程打包,然后在合并后的文件头部加入requirejs的适配代码,即可使用script的方式引入合并后的d.js。
一般提供给第三方使用的库/模块/框架,都是如此写法。
如:
最简单的
/**
* 适配amd
*/
if(typeof(define)!='function' || (typeof(define)=='function' && !define.amd) ){
window.define = function(module){
window.d = module();
}
}
复杂一点的
https://github.com/EggFiredRice/AppProxy.js/blob/master/AppProxy.js
还可以参照
https://github.com/jashkenas/backbone/blob/master/backbone.js
https://github.com/RubyLouvre/avalon/blob/master/dist/avalon.js
等等。。。
楼主自己也说了依赖是异步载入的,这个时候只能去管理这种依赖关系,可以考虑使用类似于lazyLoad.js这种库,或者自己监测依赖的库是否加载完成再执行d.js