JS - 何时应用模块模式

JS - When to apply the module pattern

我有一个模块“badges.js”,其中只有两个方法:“increaseBadge”和“resetBadge”。

//
// badges.js
//
function increaseBadge(badgeType, userId, value) {}

function resetBadge(badgeType, userId) {}

module.exports = { increaseBadge, resetBadge };

应用模块模式以提供干净的界面是否有意义?我应该使用 IIFE 还是只导出一个对象?

我是说,这个

const badges = Object.freeze(
  VALID_BADGES_TYPES.reduce(
    (acc, badgeType) => (
      (acc[badgeType] = {
        increase: (userId, value) =>
          increaseBadge(userId, badgeType, value),

        reset: (userId) =>
          resetBadge(userId, badgeType),
      }),
      acc
    ),
    {}
  )
);

function increaseBadge(badgeType, userId, value) {}

function resetBadge(badgeType, userId) {}

module.exports = badges;

VS 用 IIFE 封装所有逻辑(它有感觉吗?因为我已经在模块中声明了所有这些相关的东西)

const badges = (() => {
  function increaseBadge(userId, badgeType, value) {}

  function resetBadge(userId, badgeType) {}

  return Object.freeze(
    VALID_BADGES_TYPES.reduce(
      (acc, badgeType) => (
        (acc[badgeType] = {
          increase: (userId, value) =>
            increaseUserBadge(userId, badgeType, value),

          reset: (userId) => resetUserBadge(userId, badgeType),
        }),
        acc
      ),
      {}
    )
  );
})();

module.exports = badges;

揭示模块模式的要点是创建一组逻辑,而不用内部使用的变量污染全局范围。

CommonJS 模块已经有自己的作用域,因此在 CommonJS 模块中应用揭示模块模式没有意义。