首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >es6模块的生命周期

es6模块的生命周期
EN

Stack Overflow用户
提问于 2019-02-08 23:05:43
回答 2查看 1.8K关注 0票数 3

我有一个库,基本上就是一个设置全局变量的IIFE,客户端应该对该变量进行操作。所以,在module.js中,我有类似这样的东西

代码语言:javascript
复制
window.myModule = (function(){
    ...

    return {
        foo: foo,
        bar: bar
    }
})();

我想让它与ES6模块兼容,这样我就可以

代码语言:javascript
复制
import * as theModule from 'module.js';

以及

代码语言:javascript
复制
<script src="module.js"></script>

如何才能做到这一点?我记得有一些库就是这样的(甚至兼容AMD),但我甚至不知道要搜索什么。

EN

回答 2

Stack Overflow用户

发布于 2019-02-09 02:22:27

ES6模块的灵感来自于IIFE的价值,封装是一个重要的好处。因此,重构IIFE可能很简单。

首先,您可以删除(您不必这样做,但是保留它没有任何好处,而且您可能必须小心,因为您传递的参数的范围可能会有所不同)。

如果您知道该库仅适用于浏览器,并且希望保持向后兼容性,则可以使用window替换root变量。

下一个挑战是识别公共API并将其导出。因此,假设一些原始API如下所示:

代码语言:javascript
复制
root.MyLib.prototype.somePublicFn = function () {...}

您可以像这样导出此函数

代码语言:javascript
复制
export let somePublicFn = function () {...}

而且,当你这样做的时候

代码语言:javascript
复制
import * as libFns from 'myLib'

libFns将充当一种名称空间,它允许您执行以下操作,

代码语言:javascript
复制
libFns.somePublicFn(...)

在导入模块中。

而且,正如我在上面提到的,如果您还想使这些导出在全球范围内可用,那么您必须自己手动连接这些导出,并执行以下操作

代码语言:javascript
复制
const api = {
  somePublicFn
  ...
}
root.MyLib.prototype = Object.assign(root.MyLib.prototype, api)
票数 1
EN

Stack Overflow用户

发布于 2019-02-09 02:47:33

您不需要将您编写的代码与您提供给他人的代码混为一谈:后者是一个工具问题。

编写ES模块,然后使用像this这样的东西来提供一些东西给你的用户,他们可以通过他们选择的方法轻松地消费: commonJS,AMD,global,他们的选择不需要你做更多的工作,只需要一个构建管道步骤。

移除IIFE包装器并导出您正在分配的内容。

关于webpack的备注:

Webpack使用一个..。不能实际使用的模块的语法,例如<script type="module">。因为在这一点上,webpack几乎是一个行业标准,所以我不提它是不负责任的。不幸的是,在上面的设置下,它并没有发挥出那么好的效果。据我所知,这仍然是一个悬而未决的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54595199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档