最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • webpack打包源码-打包后文件分析

    正文概述 掘金(LC十三)   2021-02-17   436

    打包后文件:

    (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":
    	(function(module, exports) {
            let aa = "导入的js文件";
            module.exports = "导入的js文件";
    	})
    
    });
    

    分析:

    • 打包后的文件就是一个自调用函数,这个函数接收一个对象作为参数
    • 这个对象称为键值对
    • 这个键名是当前被加载模块的文件名与某个目录的拼接
    • 键值是一个函数, 和node.js里的模块加载有些类似, 会将被加载的模块包裹于一个函数中
    • 这个函数在将来某个时间点会被调用, 同时会接收一定的参数, 利用这些参数就可以实现模块的加载操作
    • 针对于上述代码,就是将这个对象传递给自调用函数的形参modules

    自调用函数中:

    • 定义installedModules对象用作缓存模块
    • __webpack_require__方法: webpack中定义的,核心作用就是返回模块的exports
    • 接收一个模块id作为参数,在调用的时候就传入模块id将对应的模块的内容的导出,返回
    • 挂载一些方法和属性
    • 首次调用了return __webpack_require__(__webpack_require__.s = "./src/index.js");
    • __webpack_require__.s = 用于缓存路径

    对于单文件打包结果:

    • 首先生成一个自调用函数, 称为模块定义
    • 模块定义会传给modules参数, 自动向下执行,
    • 在缓存installedModules[moduleId]中查询, 如果有直接返回
    • 在某个时间点执行了webpack自定义的__webpack_require__方法
    • __webpack_require__方法中通过模块moduleId, 此时的模块id即模块定义的键:"./src/index.js",找到对应模块的执行方法modules[moduleId]
    • __webpack_require__方法中内部定义module对象, 用于存放和返回模块的导出成员, 此对象中有三个参数, 分别为i:moduleId---模块定义的键, l:false---是否被加载, exports:{}---模块导出的成员
    • 通过modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);, 找到moduleId所对应的函数值(这个函数值即模块定义的值)进行调用, 这里call方法的作用, 改变this的指向, 这里将module.exports对象作为参数传递给了modules[moduleId], 这里函数的this便指向module.exports对象, 此处的modules[moduleId]相当于
    function(module, exports) {
      let aa = "导入的js文件";
      module.exports = "导入的js文件";
    }
    

    在一个作用就是调用执行函数

    • 然后将模块的导出值存放在module.exports的对象中
    • 即拿到了模块的导出值

    打包后的功能函数解读:

    (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__)
      // 将模块定义保存一份,通过m属性挂载到自定义方法上
    	__webpack_require__.m = modules;
    	// expose the module cache
      // 保存缓存
    	__webpack_require__.c = installedModules;
      // Object.prototype.hasOwnProperty.call
      // 用于判断当前被传入的对象obj身上是否有指定的属性
    	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
    	// define getter function for harmony exports
      // 如果当前exports不具备name属性则条件成立,那么给exports设置属性name,同时提供方法这个属性的访问器getter
    	__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) {
        // typeof Symbol !== 'undefined'说明是ES6 即ESModule
    		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
    			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
    		}
        // 如果条件不成立,也直接在exports上添加__esModule属性
    		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) {
        /**
         * 1 调用t方法后,会拿到被加载模块中的内容 value
         * 2 对应value来说,可能会直接返回,也可能处理后返回
         */
    		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;
    	};
    	
    	// __webpack_public_path__
    	__webpack_require__.p = "";
    	// Load entry module and return exports
    	return __webpack_require__(__webpack_require__.s = "./src/index.js");
    })
    /************************************************************************/
    ({
    
    /***/ "./src/index.js":
    /***/ (function(module, exports) {
            let aa = "导入的js文件";
    
            module.exports = "导入的js文件";
    /***/ })
    
    });
    

    具体功能函数解读下回分解....


    起源地下载网 » webpack打包源码-打包后文件分析

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元