【问题标题】:Trying to use a non-AMD module in require尝试在 require 中使用非 AMD 模块
【发布时间】:2015-11-03 09:31:27
【问题描述】:

我正在尝试在 requirejs 中使用我拥有的非 AMD JS 模块(称为 mymodule)。这是第一次尝试这样做。根据我从 bootstrap-amd 和 underscore-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 模块模式 :)。我想保留使用独立于 require JS 的模块的选项,所以如果我不想在另一个项目中使用 requirejs,我不必这样做。所以我有点不想将整个模块包装在一个 define(...) 函数中......除非有一个 mymodule.js 和 mymodule-amd.js 文件是常见的做法。

无论如何我的模块加载,

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

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

..但是由于 doSomethingJQuery() 依赖于 jQuery,我得到一个错误。我怎样才能在这里引入 jQuery,或者应该以不同的方式完成?我试图找到一些例子,但对 requirejs 来说很新。想以正确的方式做事。如前所述,我还想保留独立使用模块的选项。在此不胜感激,谢谢。

【问题讨论】:

    标签: javascript requirejs amd


    【解决方案1】:

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

    if(typeof define === "function" && define.amd) {
        define(['jquery'], factory);
    }
    else
        mymodule = factory(jQuery);
    

    else 部分对于不是 AMD 的情况是必需的,因为您现在使用的是工厂函数。 (你也可以有一个分支来处理像 Node 这样的 CommonJS 环境,但我不打算在这里添加它。)

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

    function factory($) {
        // define the module
        return mymodule;
    }
    

    整个东西可以被包裹在IIFE中,以避免factory污染全局空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-05
      • 2015-11-27
      • 2015-05-19
      • 2012-03-09
      • 2015-01-25
      • 1970-01-01
      • 2013-07-31
      • 2018-03-05
      相关资源
      最近更新 更多