在运行时将 AMD 模块转换为 ES6?

Posted

技术标签:

【中文标题】在运行时将 AMD 模块转换为 ES6?【英文标题】:Converting AMD module to ES6 at runtime? 【发布时间】:2020-01-10 08:04:46 【问题描述】:

我想使用select2 javascript 库。不幸的是,他们force the use of AMD on their users。

我想在我的代码中专门使用 ES6 模块。有没有办法让 ES6 模块导出由 AMD 异步初始化的变量?例如,我想做这样的事情:

const result = $.fn.select2.amd.require([
    "select2/data/array",
    "select2/utils"
], function (ArrayData, Utils)

  return "something";
);

export result as default;

这样,我可以将 AMD 丑陋的地方包裹起来,并将其作为 ES6 导入到其他任何地方。

【问题讨论】:

不确定这是否能解决您的问题,但您看过esm吗? @jfriend00 是的,我想 ES6 导出 select2 库的一个组件。这就是我所要求的,但我无法弄清楚实现。 您不能直接导出异步加载的内容,因为模块的导出分配和返回发生在异步操作完成之前。 @jfriend00 我们可以导出承诺。问题是我们能否从 AMD 的require 中得到承诺。 您不需要得到 AMD 的承诺。您可以将自己的承诺包装在 AMD 负载周围并返回承诺。但是,这将通过 Promise 为您提供一个异步加载的接口,而不是典型的 ES6 接口。 【参考方案1】:

每Bergi:

你根本不会写任何 AMD。只需写 import ArrayData from 'select2/array/data';(或任何你需要的东西),然后让 webpack 处理剩下的事情。

事实证明,select2 比大多数库更成问题。它只增加了 jQuery 对象,而不是导出任何有意义的东西。幸运的是,我不必跳太多圈。

一旦 jQuery 对象被扩充,调用 const ArrayAdapter = $.fn.select2.amd.require("select2/data/array") 就会返回我想要的结果。

我的理解是一旦import "select2"返回,我们保证模块加载完成。因此,我们不需要使用amd.require() 的异步形式,因为所有组件都应该完全加载。至少,到目前为止我还没有遇到任何错误......

【讨论】:

以上是关于在运行时将 AMD 模块转换为 ES6?的主要内容,如果未能解决你的问题,请参考以下文章

ES6模块和CommonJSAMD本质区别思考

记录 script module

ES6语法总结-Module的语法

es6:module模块(export,import)

在运行时将对象转换为动态类型

在运行时将android颜色字符串转换为int [重复]