如何在不使用requirejs的情况下使用requirejs友好的JavaScript文件? I.o.w.如何解调?

时间:2013-08-13 14:48:15

标签: requirejs amd commonjs

假设我有一个JS库,整齐地包裹在define('myModule', function(myModule) { return myModule.someObject; });

我如何将myModule.someObject绑定到全局范围(请不要问为什么,我知道模块化编程比将内容放在全局范围上有很多好处),而不使用requirejs或任何其他模块处理框架?

事情是:在开发时,我想使用requirejs。我们构建的库应该能够被使用requirejs(AMD,CommonJS,无论如何)的人包含在内,但也应该以{{1​​}}的形式提供给那些不想使用的人只需要为了能够使用我们的window.SomeObject。在开发阶段之后,所有代码都将被缩小并混淆为单个JS文件。

我认为我只是在使用错误的搜索字词进行Google搜索,因为我能找到的只是对如何包含未包含在requirejs友好SomeObject函数中的代码的问题的答案。

对此的任何想法都将非常感激。谢谢!

---编辑---

我的文件(在它开始之前)看起来像:

define

我在考虑这样的事情:

(function(define, global) {
  define([a,b,c],function(theA, theB, theC) {
    return theA + theB + theC; // or something, it doesn't matter
  });
})(define, this);

但我不确定如何正确实施......

3 个答案:

答案 0 :(得分:2)

我想你需要包装你的模块,以便可以在没有requirejs的情况下访问它们:

if ( typeof define === "function" && define.amd ) {
    define( "mymodule", [], function () { 
      // do your logic
      return mystuff; 
    } );
} else {
   // do your logic
   window.mystuff = mystuff;
}

jQuery为例。

答案 1 :(得分:2)

如果你可以提供帮助,我会避免给你的模块一个id,这会让你的便携性降低。 jQuery令人难以置信的烦恼,它迫使你设置一个jquery路径选项,但他们出于兼容性原因这样做。如果可以的话,总是更喜欢匿名模块。

来自jQuery源代码

// Register as a named AMD module, since jQuery can be concatenated with other
// files that may use define, but not via a proper concatenation script that
// understands anonymous AMD modules. A named AMD is safest and most robust
// way to register. Lowercase jquery is used because AMD module names are
// derived from file names, and jQuery is normally delivered in a lowercase
// file name. Do this after creating the global so that if an AMD module wants
// to call noConflict to hide this version of jQuery, it will work.

James Burke也进入了little more detail here

我会使用umdjs repository中的一个更常见的例子:

(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['b'], factory);
    } else {
        // Browser globals
        root.amdWeb = factory(root.b);
    }
}(this, function (b) {
    //use b in some fashion.

    // Just return a value to define the module export.
    // This example returns an object, but the module
    // can return a function as the exported value.
    return {};
}));

对于另一个也支持CommonJS的示例,请查看the reqwest library

!function (name, context, definition) {
  if (typeof module != 'undefined' && module.exports) module.exports = definition()
  else if (typeof define == 'function' && define.amd) define(definition)
  else context[name] = definition()
}('reqwest', this, function () {

    return {};

});

答案 2 :(得分:1)

How can I provide a library to others that does not depend on RequireJS?

  

这允许您发送未附带所有RequireJS的代码,并允许您导出在没有AMD加载程序的普通网页上工作的任何类型的API。

您需要制作一个使用wrapalmond的构建配置文件。

这一切都让人觉得很脏,但是我已经让它工作了(通过跟随 almond ReadMe)正是你所描述的。