编写Requirejs模块,无需requirejs即可运行

时间:2014-06-08 13:27:15

标签: javascript module requirejs

我想以某种方式创建我的模块,它们可以与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;
}
});

2 个答案:

答案 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。