将javascript库转换为AMD

将javascript库转换为AMD,javascript,requirejs,js-amd,libphonenumber,Javascript,Requirejs,Js Amd,Libphonenumber,我试图在我的require应用程序中使用一个不是AMD的库。什么是最好的消费方式?我知道我可以创建如下模块: define(['module'], function (module) { // insert and return library code here. }); 但这似乎不太好。似乎我必须重构他们的一些代码才能使其正常工作(例如,将其全部转换为一个对象并返回该对象)。我看到很多库使用不同的模式,它们使用一个立即调用的函数来定义窗口对象上的模块并返回它 (function()

我试图在我的require应用程序中使用一个不是AMD的库。什么是最好的消费方式?我知道我可以创建如下模块:

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) {

});
我可以访问我的所有方法,但现在它们似乎都是全局的,因为我没有将库包装在define…

使用RequireJS。看起来像这样

requirejs.config({
  shim: {
    'libphonenumber': {
      exports: 'libphonenumber' // Might not apply for this library
    }
  }
});
这将加载
libphonenumber
,并将其变量放入全局范围使用RequireJS。看起来像这样

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

这将加载
libphonenumber
,并将其变量放入全局范围

这最终对我有效:

define(['module'], function (module) {
    // insert and return library code here.
});
我不完全清楚为什么“模块”是必要的。但是没有它就不行。另外,我刚刚返回了一个对象并将函数附加到它,如下所示:

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

关于使用“模块”的文档并没有太多,但我可以确定:模块是一个特殊的依赖项,由requireJS核心处理。它提供有关当前模块的模块ID和位置的信息。因此,完全有可能是我弄乱了配置中的路径。

这最终对我有效:

define(['module'], function (module) {
    // insert and return library code here.
});
我不完全清楚为什么“模块”是必要的。但是没有它就不行。另外,我刚刚返回了一个对象并将函数附加到它,如下所示:

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

关于使用“模块”的文档并没有太多,但我可以确定:模块是一个特殊的依赖项,由requireJS核心处理。它提供有关当前模块的模块ID和位置的信息。因此,完全有可能是我弄乱了配置中的路径。

我不知道是否需要全局范围内的所有内容。这可能是我对AMD的误解,但我认为其中一个好处是隐私。这取决于你是否愿意稍微重写库。对于某些库,由于许可证问题,您不能这样做。如果您不能重写库,那么您将不得不在全局范围内使用变量。如果你愿意重写,请看我的这篇文章——我不知道我是否想要全局范围内的所有内容。这可能是我对AMD的误解,但我认为其中一个好处是隐私。这取决于你是否愿意稍微重写库。对于某些库,由于许可证问题,您不能这样做。如果您不能重写库,那么您将不得不在全局范围内使用变量。如果你愿意重写,请看我的这篇文章--