实现 JavaScript 模块化

23 阅读1分钟
const Modules = (function () {
    const modules = {};

    function define(id, deps, impl) {
        for (let i = 0, len = deps.length; i < len; i++) {
            deps[i] = modules[deps[i]];
        }
        modules[id] = impl.apply(null, deps);

        return Modules;
    }

    function require(name) {
        return modules[name];
    }

    return {
        define,
        require,
    };
}());

Modules.define('foo', [], function () {
    console.log('foo');

    function introduce(who) {
        console.log(`Let me introduce: ${who}`);
    }

    return {
        introduce,
    };
});

Modules.define('bar', ['foo'], function (foo) {
    console.log('bar');

    foo.introduce('Ember');

    function greet(who) {
        console.log(`Let me greet: ${who}`);
    }

    return {
        greet,
    };
});

Modules.define('baz', ['foo', 'bar'], function (foo, bar) {
    console.log('baz');

    foo.introduce('Invoker');
    bar.greet('Storm');
});

Modules.require('foo').introduce('james');