将 IIFE 转换为 ES6 模块:导出单个父对象或单个函数?

问题描述 投票:0回答:1

我有一个包含 IIFE 的 Javascript 文件。此 IIFE 返回一个具有许多实用方法的对象。如果我想将其转换为 ES6 模块,我应该导出包含的对象还是应该将所有函数放在模块的顶层并单独导出每个函数?

似乎用 ES6 模块命名一组函数的唯一方法是在 import 语句中执行,而不是在 export 语句中执行。这对我来说似乎是倒退的。如果在多个地方导入模块,那么每个导入模块是否都必须重复命名空间的定义?如果导入是在没有命名空间的情况下完成的,则导入的所有函数都可能与其他模块中的函数发生冲突。准确吗?

那么将这样的 IIFE 转换为 ES6 模块的最佳方法是什么?

const utility = (function() {

  function shuffle(array) {
    ..
  }

  function areArraysEqual(array1, array2) {
    ..
  }

  // more functions here

  return {
    shuffle,
    areArraysEqual,
  }
})();
javascript ecmascript-6 module export iife
1个回答
0
投票

我应该导出包含的对象还是应该将所有函数放在模块的顶层并单独导出它们?

这确实取决于你,但我想说的是,对于这些实用模块单独使用导出辅助函数更为常见,这似乎是这样。例如,从 lodash 导入单个函数比导入所有 lodash 更常见。在捆绑商时代,您希望为调用者/进口商提供对他们所需内容的细粒度控制。

似乎用 ES6 模块命名一组函数的唯一方法是在 import 语句中执行,而不是在 export 语句中。

如果您忽略将整个对象导出为“命名空间”,那么是的。

这对我来说似乎是倒退的。如果在多个地方导入模块,不是每个导入模块都必须重复命名空间的定义吗?

不。他们只能进口他们需要的出口产品,没有必要进口所有东西。但即使他们这样做了,也会做类似的事情

import * as Foo from 'utils'

多次也不错。

如果导入是在没有命名空间的情况下完成的,则导入的所有函数都可能与其他模块中的函数发生冲突。准确吗?

是的,但您可以为导入添加别名:

import {helper} from 'utils'
import {helper as urlHelper} from 'url-utils'

那么将这样的 IIFE 转换为 ES6 模块的最佳方法是什么?

进行单独导出并让消费者决定如何使用该模块。

© www.soinside.com 2019 - 2024. All rights reserved.