Javascript 试图在需要时使用非AMD模块

Javascript 试图在需要时使用非AMD模块,javascript,requirejs,amd,Javascript,Requirejs,Amd,我正在尝试使用我在requirejs中拥有的非AMD JS模块(称为mymodule)。这是第一次尝试这样做。根据我从引导式amd和下划线amd中看到的内容,我尝试了以下方法: // start of mymodule if(typeof mymodule === "undefined") loaded = {}; mymodule.cache = (function() { ... return { ... }; })(); mymodule.

我正在尝试使用我在requirejs中拥有的非AMD JS模块(称为mymodule)。这是第一次尝试这样做。根据我从引导式amd和下划线amd中看到的内容,我尝试了以下方法:

// start of mymodule

if(typeof mymodule === "undefined") loaded = {};

mymodule.cache = (function() {

    ...

    return {
        ...
    };
})();

mymodule.main = (function() {

    ...

    return {
        doSomethingJQuery: function() { ... }
    }
})();

.
.
.

// end of mymodule


// This part I added for the sake of requirejs
if(typeof define === "function" && define.amd) {
    define(function() {
        return mymodule;
    });
}
您可以看到第一部分是我的模块(我希望使用良好的JS模块模式:)。我想保留独立于requirejs使用模块的选项,因此如果我不想在另一个项目中使用requirejs,我就不必这样做。所以我不想把整个模块包装在define(…)函数中。。。除非通常使用mymodule.js和mymodule-amd.js文件

不管怎样,我的模块加载

define(["mymodule"], function (mymodule) {

        // do it - ReferenceError: jQuery is not defined :(
        mymodule.doSomethingJQuery();
        .
        .
        .

…但是由于doSomethingJQuery()依赖于jQuery,因此我得到一个错误。我怎样才能在这里引入jQuery,或者应该采用不同的方式?我试着找一些例子,但对requirejs来说还是很陌生的。希望以正确的方式做事。如前所述,我还想保留独立使用该模块的选项。非常感谢这里的任何提示。

您需要使模块依赖于jQuery,并将引用传递给将定义模块的函数。将定义模块的代码更改为:

if(typeof define === "function" && define.amd) {
    define(['jquery'], factory);
}
else
    mymodule = factory(jQuery);
对于非AMD的情况,else部分是必需的,因为您现在使用的是工厂函数。(您也可以有一个分支来处理像Node这样的CommonJS环境,但我不打算在这里添加它。)

然后创建一个定义模块的函数:

function factory($) {
    // define the module
    return mymodule;
}
整个东西可以包装在一个容器中,以避免
工厂污染全球空间