【问题标题】:convert a javascript library to AMD将 javascript 库转换为 AMD
【发布时间】:2014-06-30 15:21:35
【问题描述】:

我正在尝试在我的非 AMD 要求应用程序中使用库 -- Google's libphonenumber。吃这个的最好方法是什么?我知道我可以创建这样的模块:

define(['module'], function (module) {
    // insert and return library code here.
});

但这似乎不太好。似乎我必须重构他们的一些代码才能使其正常工作(例如,将其全部转换为对象并返回该对象)。我看到很多库使用不同的模式,它们使用立即调用的函数,该函数在窗口对象上定义模块并返回它。

(function() {

    var phoneformat = {};

    window.phoneformat = phoneformat;

    if (typeof window.define === "function" && window.define.amd) {
        window.define("phoneformat", [], function() {
            return window.phoneformat;
       });
    }

})();

** 更新 ** 有什么理由不这样做吗?

define(['lib/phoneformatter'], function(phoneformatter) {

});

我可以访问我的所有方法,但现在它们似乎是全局的,因为我没有将库包装在定义中......

【问题讨论】:

    标签: javascript requirejs js-amd libphonenumber


    【解决方案1】:

    使用 RequireJS 的 shim。它看起来像这样

    requirejs.config({
      shim: {
        'libphonenumber': {
          exports: 'libphonenumber' // Might not apply for this library
        }
      }
    });
    

    这将加载 libphonenumber 并将其变量放在全局范围内

    【讨论】:

    • 我不知道我是否想要全局范围内的所有内容。这可能是我对 AMD 的误解,但我认为其中一个好处是隐私。
    • 这取决于你是否愿意稍微重写库。对于某些库,由于许可证问题,您不能这样做。如果您无法重写库,那么您将不得不在全局范围内使用变量。如果你愿意重写,请看我的这篇文章——ilinkuo.wordpress.com/2013/02/07/…
    【解决方案2】:

    这最终对我有用:

    define(['module'], function (module) {
        // insert and return library code here.
    });
    

    我不完全确定为什么需要“模块”。但没有它就行不通。另外,我刚刚返回了一个对象并为其附加了函数,如下所示:

    return {
        countryForE164Number: countryForE164Number,
        nextFunction: nextFunction,
        // more functions as needed.
    }
    

    使用“模块”的文档方式并不多,但据我所知:模块是由 requireJS 核心处理的特殊依赖项。它为您提供有关当前模块的模块 ID 和位置的信息。所以完全有可能是我弄乱了config中的路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多