首先导入导出分为几类

  • CommonJS导入CommonJS
  • EsModule导入CommonJS
  • EsModule导入EsModule

依据实现规定,简略代码样例

// index.js// import log,{age} from "./log.js"// // let log = require('./log.js')// console.log('index.js内容')// console.log("log", log,age)// log.js// CommonJS导出module.exports ="logger"// export default "jack"// export const age = 18;

手写模仿实现代码

(function (modules) {    // 缓存被加载过的模块    let installedModules = {};    // 定义一个__webpak_require__办法来替换 import require的加载操作    function __webpack_require__(moduleId) {        // 缓存优先,判断以后缓存中是否存在要被加载的模块,如果存在就间接返回        if (installedModules[moduleId]) {            return installedModules[moduleId].exports        }        // 如果以后缓存中不存在,就须要本人定义,执行被导入的模块内容加载        let module = installedModules[moduleId] = {            i: moduleId,            l: false,            exports: {}        }        // 调用以后moduleId对应的函数,实现内容的加载,__webpack_require__c参数存在是为了解决递归调用的问题        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)        // 当上述办法调用完结之后,批改 l 的值,标识以后模块内容曾经加载实现了        module.l = true        // 加载工作实现之后,将拿回来的内容返回至调用地位        return module.exports    }    // 定义m属性来保留modules    __webpack_require__.m = modules    // 定义c属性用于保留cache    __webpack_require__.c = installedModules    // 定义o办法用于判断对象身上是否存在制订属性    __webpack_require__.o = function (object, property) {        return Object.prototype.hasOwnProperty(object, property)    }    // 定义d办法用于在对象身上增加制订属性,并且给该属性提供一个getter    __webpack_require__.d = function (exports, name, getter) {        if (!__webpack_require__.o(exports, name)) {            Object.defineProperty(exports, name, {                enumerable: true,                get: getter            });        }    }    // 定义r办法用于标识以后模块EsModule    __webpack_require__.r = function (exports) {        if (typeof Symbol !== undefined && Symbol.toStringTag) {            Object.defineProperty(exports, Symbol.toStringTag, {                value: "module"            })        }        Object.defineProperty(exports, "__esModule", {            value: true        })    }    // 定义n办法用于设置具体的getter    __webpack_require__.n = function (module) {        let getter = module && module.__esModule ? function getDefault() {            return module['default']        } : function getModuleExports() {            return module        }        __webpack_require__.d(getter, 'a', getter)        return getter    }    // 定义p属性,用于保留资源拜访门路    __webpack_require__.p = ""    // 调用__webpack_require__办法,执行模块导入和加载操作    return __webpack_require__(__webpack_require__.s = "./src/index.js")})(    // CommonJS导入CommonJS    //     {    //     "./src/index.js": (function (module, exports, __webpack_require__) {    //         let log = __webpack_require__( /*! ./log.js */ "./src/log.js")    //         console.log('index.js内容')    //         console.log("log", log)    //     }),    //     "./src/log.js": (function (module, exports) {    //         // CommonJS导出    //         module.exports = "logger"    //     })    // }    // EsModule导入CommonJS    {        "./src/index.js": (function (module, __webpack_exports__, __webpack_require__) {            "use strict";            __webpack_require__.r(__webpack_exports__);            var _log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__( /*! ./log.js */ "./src/log.js");            var _log_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/ __webpack_require__.n(_log_js__WEBPACK_IMPORTED_MODULE_0__);            console.log('index.js内容')            console.log("log", _log_js__WEBPACK_IMPORTED_MODULE_0___default.a)        }),        "./src/log.js": (function (module, exports) {            module.exports = "logger"        })    }    // EsModule导入EsModule    // {    //     "./src/index.js": (function (module, __webpack_exports__, __webpack_require__) {    //         "use strict";    //         __webpack_require__.r(__webpack_exports__);    //         var _log_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__( /*! ./log.js */ "./src/log.js");    //         console.log('index.js内容')    //         console.log("log", _log_js__WEBPACK_IMPORTED_MODULE_0__["default"], _log_js__WEBPACK_IMPORTED_MODULE_0__["age"])    //     }),    //     "./src/log.js": (function (module, __webpack_exports__, __webpack_require__) {    //         "use strict";    //         __webpack_require__.r(__webpack_exports__);    //         __webpack_require__.d(__webpack_exports__, "age", function () {    //             return age;    //         });    //         __webpack_exports__["default"] = ("jack");    //         const age = 18;    //     })    // })

通过编译生成的index.html,引入手写built.js文件,控制台能够失常打印