Hacker News new | ask | show | jobs
by eyelidlessness 1684 days ago
Here is why ESM is better for static analysis than CJS:

    module.exports = {
        get foo() {
            const otherModule = require('equally-dynamic-cjs')
            if (otherModule.enabled) {
                return any.dynamic.thing.at.all
            }
        },
        get bar() {
            this.quux = 'welp new export!'
            return 666
        },
        now: 'you see it',
    }

    setTimeout(() => {
        console.log(`now you don’t!`)
        delete module.exports.now
    }, Math.random() * 10000)

    if (Date.now() % 2 === 0) {
        module.exports = something.else.entirely
    }
You can, of course, achieve this sort of dynamism with default exports. But default exports are only as tree-shakeable as CJS. Named exports are fully static and cannot be added or removed at runtime.

Edit: typed on my phone, apologies for any typos or formatting mistakes.