假设我有一个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);
但我不确定如何正确实施......
答案 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。
您需要制作一个使用wrap
和almond的构建配置文件。
这一切都让人觉得很脏,但是我已经让它工作了(通过跟随 almond ReadMe)正是你所描述的。