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 模块中应用揭示模块模式没有意义。
我有一个模块“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 模块中应用揭示模块模式没有意义。