我想以某种方式创建我的模块,它们可以与requirejs一起使用(不需要js,它们应该正常工作,所以我必须确保它们正确加载,就像把脚本标签放在右边顺序)。
所以jQuery就是这样的:
// export module
if ( typeof define === "function" && define.amd ) {
define(["dep"], function(dep){
dep.fn.test = test;
return dep;
});
}
else{
dep.fn.test = test;
}
实际模块定义如下
var dep = function(...){...}
此定义和导出部分属于IIFE,以使一切都不在全球范围内。
通常它只有一个例外,依赖性不可用。 这个问题可以通过在define部分中定义函数来解决,但这意味着在定义部分中定义它两次,在else部分中定义它。
如何让它工作但只定义一次模块?
我对核心dep有“插件式”扩展,这些扩展应该都在单独的文件中,因此主dep必须作为依赖性传递
这很好用。但这意味着我要编写两次测试代码。
(function(){
// export module
if ( typeof define === "function" && define.amd ) {
define(["dep"], function(dep){
dep.fn.test = function(){...ssomething using dep...};
return dep;
});
}
else{
dep.fn.test = unction(){...ssomething using dep...};
}
})
好的,我尝试了另一个例子
animate / animate.js (这是我的主文件)
define(function(){
...
return animate;
});
animate / modules / easing.js (这是一个模块文件) (功能(){ var ease = function(){ //使用animate.js中的animate main函数 //这里没有动画 ... };
if ( typeof define === "function" && define.amd ) {
define(["animate/animate"], function(animate){
// animate is available here
...
animate.fn.ease = ease;
return animate;
});
}
else
{
// if no requirejs, animate is global
animate.fn.ease = ease;
}
});
答案 0 :(得分:1)
我认为你只是错误地写了define
,所以它没有被注册。这就是我使用的。
if (typeof define === "function" && define.amd) {
define("telegraph", [], function () { return telegraph; });
}
放入上下文
(function(window) {
var telegraph = function() { };
telegraph.prototype.test = function() {
// do something
};
if (typeof define === "function" && define.amd) {
define("telegraph", [], function () { return telegraph; });
}
window.telegraph = telegraph;
})(window);
修改强>
问题实际上是如何定义test
并在内部使用dep
以便您不必将其作为依赖项提供,并且可以定义名为dep
的{{1}}模块。一种解决方案是在构造函数中注册第二级函数,并将this
捕获为self
(或另一个变量)以在函数中使用。这里的关键是您使用define来定义命名模块,并且通过在构造函数中使用捕获的上下文,您不需要将父对象作为依赖项提供。示例(在http://jsfiddle.net/YS8v6/处有工作小提琴):
(function(){
var dep = function() {
var self = this;
self.fn.test = function() {
self.foo();
};
};
dep.prototype.foo = function() {
alert('foo');
};
dep.prototype.fn = function() {
};
if ( typeof define === "function" && define.amd ) {
define('dep', [], function() { return dep; });
}
})();
答案 1 :(得分:1)
实际问题似乎是define
在IIFE中不可用,但是window.define
。因此,将定义作为IIFE的参数传递可以解决问题。
(function(define){
// export module
if ( typeof define === "function" && define.amd ) {
define(["dep"], function(dep){
dep.fn.test = function(){...ssomething using dep...};
return dep;
});
}
else{
dep.fn.test = unction(){...ssomething using dep...};
}
}(window.define))
在检查define
之前,找不到它并立即尝试将其附加到dep.fn.test而不使用requirejs define part。