JavaScriptにおいて、モジュールはカプセル化のための機構でもある。

公開モジュールパターンによる名前空間の実現

const myModule = (() => {
    const privateFoo = () => {}
    const privateBar = []
    
    const exported = {
        publicFoo: () => {},
        publicBar: () => {}
    }
    
    return exported
})()

/* -------------------------------------------------------------------------- */

console.log(myModule)
// 結果:
// { publicFoo: [Function: publicFoo], publicBar: [Function: publicBar] }

Named Exportによるオブジェクトのエスクポート

exports.info = (message) => {
    console.log('概要:' + message)
}

exports.verbose = (message) => {
    console.log('詳細:' + message)
}
const logger = require('./logger')

logger.info('一般情報提供用のメッセージ')
// 結果:
// 概要:一般情報提供用のメッセージ

logger.verbose('詳細情報提供用のメッセージ')
// 結果:
// 詳細:詳細情報提供用のメッセージ

substackパターンによる関数のエクスポート

module.exports = (message) => {
    console.log(`概要:${message}`)
}

module.exports.verbose = (message) => {
    console.log(`詳細:${message}`)
}
const logger = require('./logger')

logger('一般情報提供用のメッセージ')
logger.verbose('詳細情報提供用のメッセージ')

// 結果:
/**
 * 概要:一般情報提供用のメッセージ
 * 詳細:詳細情報提供用のメッセージ
 */