首页 > AMD模块如何向外暴露接口

AMD模块如何向外暴露接口

基于require 写了个js模块,该模块命名为:d,文件名为d.js。例如:

javascriptdefine(['a', 'b', 'c'], function(a, b, c) {
    var API = {
        init: function() {}
    };
    return API;
});

通常调用方式:

javascriptrequire(['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

【热门文章】
【热门文章】