1

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

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

问题是:在开发过程中,我想使用 requirejs。我们构建的库应该能够被使用 requirejs(AMD、CommonJS 等)的人包含,但也应该可供window.SomeObject那些不想使用 require 的人使用,只是为了能够使用我们的SomeObject. 在开发阶段之后,所有代码都将被缩小并混淆为单个 JS 文件。

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

对此的任何想法将不胜感激。谢谢!

- - 编辑 - -

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

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

我在想这样的事情:

(function(define, global) {
  // same as above
})(typeof define === 'function' 
      ? define 
      : function(factory /* need more args? */) { /* solution here */ }, this);

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

4

3 回答 3

2

我想您需要包装您的模块,以便无需 requirejs 即可访问它们:

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

jQuery为例。

于 2013-08-13T14:59:40.277 回答
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 在这里也进行了更详细的介绍。

我会改用umdjs 存储库中的一个更常见的示例:

(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 的示例,请查看reqwest 库

!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 {};

});
于 2013-08-13T16:20:43.720 回答
1

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

This allows you to ship code that does not ship with all of RequireJS, and allows you to export any kind of API that works on a plain web page without an AMD loader.

You need to make a build config file which uses wrap and almond.

It all feels pretty dirty, but I've had it working (by following the almond ReadMe) with exactly what you're describing.

于 2013-08-13T16:11:21.660 回答