我希望将一个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
});
require
和define
出现在全局命名空间中,但你愿意让MyApi
和MyApiRequireJS
出现在全局命名空间中?我可以问一下原因吗? - Paul Grimerequire
和define
,而不是MyApi
(MyApi
不是我要使用的变量,只是为了简单起见使用了它)。同样,Facebook Connect API只会在全局命名空间中污染FB
。 - Wing Lianrequire
还是define
?你能找出来吗?如果不能,那也没有问题。如果你不知道他们的全局命名空间使用了什么,那么你就不能确定你定义的任何全局变量是否已经被使用了。 - Paul Grime