jeudi 28 décembre 2017

What is the need of passing additional arguments to browserify's prelude.js?

I am just checking how browserify creates a bundle code. This is the IIFE that is executed with arguments of the format:

({
    id_one: [function(require, module, exports) {
        // Module Code
    }, {
        dependency_one: id_two,
        dependency_two: id_three
    }],

}, {}, [entryid])

However, I just couldn't understand why do we need to pass these four extra arguments outer, modules, cache, entry to the function that is equivalent to the module code? The signature of the function that it executes is of the format require, module, exports. I tried without this and it works as well.

An example is:

// modules are defined as an array
// [ module function, map of requireuires ]
//
// map of requireuires is short require name -> numeric require
//
// anything defined in a previous bundle is accessed via the
// orig method which is the requireuire for previous bundles

(function outer(modules, cache, entry) {
    // Save the require from previous bundle to this closure if any
    var previousRequire = typeof require === "function" && require;

    function newRequire(name, jumped) {
        if (!cache[name]) {
            if (!modules[name]) {
                // If we cannot find the module within our internal map or
                // cache, jump to the current global require ie. the last bundle
                // that was added to the page.
                var currentRequire = typeof require == "function" && require;
                if (!jumped && currentRequire) {
                    return currentRequire(name, true);
                }

                // If there are other bundles on this page the require from the
                // previous one is saved to 'previousRequire'. Repeat this as
                // many times as there are bundles until the module is found or
                // we exhaust the require chain.
                if (previousRequire) {
                    return previousRequire(name, true);
                }
                var err = new Error('Cannot find module \'' + name + '\'');
                err.code = 'MODULE_NOT_FOUND';
                throw err;
            }
            var m = cache[name] = {exports:{}};
            modules[name][0].call(m.exports, function(x){
                var id = modules[name][1][x];
                return newRequire(id ? id : x);
            },m,m.exports,outer,modules,cache,entry);
        }
        return cache[name].exports;
    }
    for(var i=0;i<entry.length;i++) newRequire(entry[i]);

    // Override the current require with this new one
    return newRequire;
})({
    1: [function(require, module, exports) {
        modulea = require("./modulea.js");
        moduleb = require("./moduleb.js");

        logger = function() {
            console.log(modulea + modulea);
        };

        console.log("Main executed.")
    }, {
        "./modulea.js": 2,
        "./moduleb.js": 3
    }],
    2: [function(require, module, exports) {
        module.exports.name = "Module A";

    }, {}],
    3: [function(require, module, exports) {
        module.exports.name = "Module B";


    }, {}]
}, {}, [1]);

Aucun commentaire:

Enregistrer un commentaire