【发布时间】:2020-03-21 07:56:49
【问题描述】:
对于我一年级的学生,我提供了一个使用显示模块模式编写的简单的基于 ES5 的库。这是“主”模块/命名空间的 sn-p,它将容纳其他扩展:
window.Library = (function ($) {
if (!$) {
alert("The Library is dependent on jQuery, which is not loaded!");
}
return {};
})(window.jQuery);
这适用于几乎 99.9% 的 Web 开发新手,并且没有将 ES6 等花哨的东西与 Webpack 或 Babel 结合使用。
现在0.1%的人要求我提供一个基于ES6的版本,可以正常导入。我很乐意提供这个,但我有点不知道如何最好地解决这个问题。
我显然想保持 ES5 的方式,所以我的学生可以只使用脚本标签包含文件,然后在他们喜欢的任何地方键入 Library.SomeExtension.aFunction();。最重要的是,一些扩展依赖于 jQuery,它的注入方式与上面的 sn-p 类似。
我现在正在寻找一些可维护的方法来获得两全其美,使用一个代码库,将 jQuery 作为依赖项。我想给 99.9% 一个window.Library,而我想给 0.1% 一个使用import Library from 'library' 的方法。
我可以通过一个 JS 文件来完成这两个任务吗?或者我需要一个特殊的 ES6 版本(不是问题)?最重要的是:我将如何重新调整我的代码(都类似于上面的 sn-p)以支持这两种情况?
任何和所有的指针将不胜感激!
编辑:顺便说一句,我已经有一个gulpfile.js,它通过Babel、minifiers 和其他东西运行这个库。所以必须扩展它来解决上述问题不是问题!
【问题讨论】:
-
最好自己使用 ES6 和生成全局显示模块的编译器/捆绑器来解决。然后将您的源模块提供给 0.1%。所以是的,一个源文件,但是两个分布式文件。
-
我希望得到一个答案我可以用一个 JS 文件来完成这两者吗? - 如果这是可能的,它可能不是,什么会脚本是什么样子的?
-
@Snow 目前正在使用答案中提供的资源。必须花更多的时间来获得令我满意的东西,但如果您在构建脚本时有点创意,这似乎是可能的!在我的特殊情况下,我真的想保留
Library.SubLibrary.functionName设置以及单独的文件,即使有人将其导入为 ES6 或其他任何内容。 (这主要是因为扩展也可以相互使用,并且使用标准 ES6 设置会导致循环引用)。 -
是的,使用单独的文件来完成这项工作很简单:一个使用
export,另一个分配给window。我在想如果两者都可以在一个文件中完成会很棒,因为那样会感觉更加优雅,但是export关键字看起来只能在type=module中工作。我不知道是否有解决方法,或者这只是不可能的。 -
@LennardFonteijn 循环依赖在 ES6 模块中工作得很好,只要确保你只声明导出的功能并且不要在顶层运行初始化代码(这取决于模块评估顺序)。我建议不要使用嵌套的命名空间对象,这在 ES6 中是非常不习惯的。
标签: javascript ecmascript-6 es6-modules