分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

webpack: 简单分析 webpack 打包后的代码

发布时间:2023-09-06 02:34责任编辑:胡小海关键词:webpack

编译后代码

/******/ (function(modules) { // webpackBootstrap/******/ ???// The module cache/******/ ???var installedModules = {};/******//******/ ???// The require function/******/ ???function __webpack_require__(moduleId) {/******//******/ ???????// Check if module is in cache/******/ ???????if(installedModules[moduleId]) {/******/ ???????????return installedModules[moduleId].exports;/******/ ???????}/******/ ???????// Create a new module (and put it into the cache)/******/ ???????var module = installedModules[moduleId] = {/******/ ???????????i: moduleId,/******/ ???????????l: false,/******/ ???????????exports: {}/******/ ???????};/******//******/ ???????// Execute the module function/******/ ???????modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);/******//******/ ???????// Flag the module as loaded/******/ ???????module.l = true;/******//******/ ???????// Return the exports of the module/******/ ???????return module.exports;/******/ ???}/******//******//******/ ???// expose the modules object (__webpack_modules__)/******/ ???__webpack_require__.m = modules;/******//******/ ???// expose the module cache/******/ ???__webpack_require__.c = installedModules;/******//******/ ???// define getter function for harmony exports/******/ ???__webpack_require__.d = function(exports, name, getter) {/******/ ???????if(!__webpack_require__.o(exports, name)) {/******/ ???????????Object.defineProperty(exports, name, { enumerable: true, get: getter });/******/ ???????}/******/ ???};/******//******/ ???// define __esModule on exports/******/ ???__webpack_require__.r = function(exports) {/******/ ???????if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {/******/ ???????????Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });/******/ ???????}/******/ ???????Object.defineProperty(exports, '__esModule', { value: true });/******/ ???};/******//******/ ???// create a fake namespace object/******/ ???// mode & 1: value is a module id, require it/******/ ???// mode & 2: merge all properties of value into the ns/******/ ???// mode & 4: return value when already ns object/******/ ???// mode & 8|1: behave like require/******/ ???__webpack_require__.t = function(value, mode) {/******/ ???????if(mode & 1) value = __webpack_require__(value);/******/ ???????if(mode & 8) return value;/******/ ???????if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;/******/ ???????var ns = Object.create(null);/******/ ???????__webpack_require__.r(ns);/******/ ???????Object.defineProperty(ns, 'default', { enumerable: true, value: value });/******/ ???????if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));/******/ ???????return ns;/******/ ???};/******//******/ ???// getDefaultExport function for compatibility with non-harmony modules/******/ ???__webpack_require__.n = function(module) {/******/ ???????var getter = module && module.__esModule ?/******/ ???????????function getDefault() { return module['default']; } :/******/ ???????????function getModuleExports() { return module; };/******/ ???????__webpack_require__.d(getter, 'a', getter);/******/ ???????return getter;/******/ ???};/******//******/ ???// Object.prototype.hasOwnProperty.call/******/ ???__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };/******//******/ ???// __webpack_public_path__/******/ ???__webpack_require__.p = "";/******//******//******/ ???// Load entry module and return exports/******/ ???return __webpack_require__(__webpack_require__.s = "./src/index.js");/******/ })/************************************************************************//******/ ({/***/ "./src/index.js":/*!**********************!* ?!*** ./src/index.js ***! ?\**********************//*! no static exports found *//***/ (function(module, exports, __webpack_require__) {eval("const str = __webpack_require__(/*! ./test.txt */ \"./src/test.txt\");\nconst test = __webpack_require__(/*! ./test */ \"./src/test.js\");\nconsole.log(str);\nconsole.log(test);\n\n//# sourceURL=webpack:///./src/index.js?");/***/ }),/***/ "./src/test.js":/*!*********************!* ?!*** ./src/test.js ***! ?\*********************//*! no static exports found *//***/ (function(module, exports) {eval("module.exports = {\n ?name: 'gaollard'\n}\n\n//# sourceURL=webpack:///./src/test.js?");/***/ }),/***/ "./src/test.txt":/*!**********************!* ?!*** ./src/test.txt ***! ?\**********************//*! no static exports found *//***/ (function(module, exports) {eval("module.exports = \"`hello world`\"\n\n//# sourceURL=webpack:///./src/test.txt?");/***/ })/******/ });

modules

由上面可以看出打包后的代码就是一个自执行函数里面,所以才会出现在全局作用域中找不到你在某一个具体模块定义的变量。这个函数接受一个对象类型参数 modules。我们去掉部分注释:

const modules = { ?"./src/index.js": (function(module, exports, __webpack_require__) { ???eval("const str = __webpack_require__(/*! ./test.txt */ \"./src/test.txt\");\nconst test = __webpack_require__(/*! ./test */ \"./src/test.js\");\nconsole.log(str);\nconsole.log(test);\n\n//# sourceURL=webpack:///./src/index.js?"); ?}), ?"./src/test.js": (function(module, exports) { ???eval("module.exports = {\n ?name: 'gaollard'\n}\n\n//# sourceURL=webpack:///./src/test.js?"); ?}), ?"./src/test.txt": (function(module, exports) { ???eval("module.exports = \"`hello world`\"\n\n//# sourceURL=webpack:///./src/test.txt?"); ?})}

这样看就是清晰了。对象的 key 为模块的路径,value 为 一个函数,这个函数接受两个参数。

(1) module: 被缓存在 installedModules 中

var module = installedModules[moduleId] = { ?i: moduleId, // 模块所在路径 ?l: false, // 是否已经加载(自执行) ?exports: {} // 模块导出的结果};

当使用 webpack_require 函数加载某个模块时,这个模块先执行,并且将执行结果赋值给 installedModules 对应 exports。并且标记该模块已经被加载了,第二次使用__webpack_require__
加载时就会直接返回 module.exports。这意味这一个模块只会被 eval执行一次。

相关概念

一些结果

webpack: 简单分析 webpack 打包后的代码

原文地址:https://www.cnblogs.com/gaollard/p/10453561.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved