浅谈Webpack 是如何加载模块的


Posted in Javascript onMay 24, 2018

Webpack 在前端开发中作为模块打包工具非常受开发者的青睐,丰富的 loader 使它可以实现各种各样的功能。本文将通过 webpack 来打包一个 js 文件,看看 webpack 是如何加载各个模块的。

两个简单的源文件

为了方便分析 webpack 加载模块的原理,我们准备了两个文件:

hello.js

const hello = {
 say: arg => {
  console.info('hello ' + arg || 'world');
 }
};

export default hello;

index.js

import Hello from './hello';

Hello.say('man');

index.js 作为入口文件,引用了 hello.js 模块。

Webpack 打包

在命令行执行 webpack index.js bundle.js 对入口文件进行打包,生成 bundle.js ,大体结构为(为了方便阅读,我删除了部分多余的代码):

浅谈Webpack 是如何加载模块的

可以看到,最终生成的文件以 (function (modules) {})([模块1, 模块2]) 的方式启动,我们定义的模块被包装成一个个匿名函数,然后以数组的形式传递个一个匿名函数 function (modules) {},在这个匿名函数中定义了一个 __webpack_require__() 函数,用来加载模块,最后,通过 return __webpack_require__(__webpack_require__.s = 0); 来加载第一个模块 index.js

__webpack_require__() 函数

该函数接收一个 moduleId 作为参数,这个参数就是各个模块在数组中的索引,

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;
  /******/
 }

其中 installedModules 是用来缓存执行过的模块。通过 modules[moduleId].call() 来执行模块,最后返回模块的 exports。

模块接受的参数

以 hello.js 模块为例

(function (module, __webpack_exports__, __webpack_require__) {

  "use strict";
  const hello = {
   say: arg => {
    console.info('hello ' + arg || 'world');
   }
  };

  /* harmony default export */
  __webpack_exports__["a"] = (hello);

  /***/
 })

webpack 会向模块传递 module, __webpack_exports__, __webpack_require__ 三个参数,前两个是用来导出模块内的变量,第三个参数为前面介绍的 __webpack_require__() 的引用,用来导入其它模块。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript中获取选中对象的类型
Apr 02 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
May 28 Javascript
微信小程序 textarea 组件详解及简单实例
Jan 10 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
Sep 18 Javascript
详解cordova打包成webapp的方法
Oct 18 Javascript
利用Javascript实现一套自定义事件机制
Dec 14 Javascript
Javascript网页抢红包外挂实现分享
Jan 11 Javascript
浅谈webpack4.x 入门(一篇足矣)
Sep 05 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
Mar 06 jQuery
node.JS路径解析之PATH模块使用方法详解
Feb 06 Javascript
js实现简易ATM功能
Oct 27 Javascript
JavaScript语法约定和程序调试原理解析
Nov 03 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
May 24 #jQuery
详解javascript中的变量提升和函数提升
May 24 #Javascript
JavaScript轮播停留效果的实现思路
May 24 #Javascript
vue2单元测试环境搭建
May 24 #Javascript
Vue+mui实现图片的本地缓存示例代码
May 24 #Javascript
vue组件name的作用小结
May 23 #Javascript
linux 后台运行node服务指令方法
May 23 #Javascript
You might like
php+mysql实现无限分类实例详解
2015/01/15 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
javascript 事件绑定问题
2011/01/01 Javascript
JS自动适应的图片弹窗实例
2013/06/29 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
详解Vue.js搭建路由报错 router.map is not a function
2017/06/27 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
浅谈JavaScript_DOM学习篇_图片切换小案例
2019/03/19 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
Python3安装Pymongo详细步骤
2017/05/26 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
python实现图像全景拼接
2020/03/27 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
Shoes For Crews法国官网:美国领先的防滑鞋设计和制造商
2018/01/01 全球购物
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
在职人员函授期间自我评价分享
2013/11/08 职场文书
厨师岗位职责
2013/11/12 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
2021/04/24 Python
react合成事件与原生事件的相关理解
2021/05/13 Javascript