将requireJS模块公开给全局命名空间的正确方法是什么?

时间:2012-03-19 21:04:20

标签: javascript requirejs

我希望将Javascript API公开为独立库,而不会污染其全局命名空间。我创建了包装器,所以我不会根据http://requirejs.org/docs/faq-advanced.html污染他们自己的requireJS。我已经简化了下面的内容,但我不确定这是否是正确的方法,或者我是否应该采取其他方式。

var MyApi = MyApi || {};
var MyApiRequireJS = (function() {
  // require.js pasted here
  return {requirejs: requirejs, require: require, define: define};
})();

(function(require, define, requirejs) {
  require.config({
    baseUrl: 'js/scripts',
    waitSeconds: 30,
  });  

  define( 'myapi', ['jquery', 'underscore'],
    function($, _) {
      $.noConflict(true);
      _.noConflict();
      function api(method, args, callback) {
        // do stuff here
      }
      return {api: api};
    }
  );

  require( ['myapi'], function( myapi ) {
    MyApi = myapi;
  });
}(MyApiRequireJS.require, MyApiRequireJS.define, MyApiRequireJS.requirejs));

使用此库的网站将包含引用上述代码的脚本标记,然后使用

调用api
MyApi.api('some_remote_method', {foo: 'bar'}, function(result) {
  // handle the result
});

1 个答案:

答案 0 :(得分:0)

我认为你试图通过将问题作为问题来预测别人的问题,但我认为你不能真正合理地做到这一点。您链接到的页面旨在让已经拥有名为“require”或“define”的Javascript全局变量的人将RequireJS全局变为重命名。它不打算创建两个独立解析依赖关系的独立RequireJS实例。

那就是说,如果你真的想尽量减少命名空间污染,那么你应该只暴露一个名字 - MyApi。编写一个包含您的RequireJS私有副本以及API代码的怪物封闭,并让它只返回您要在API上公开的方法。

以两个版本交付API可能更友好/更简单,一个定义requireJS模块,另一个没有requireJS依赖。