浅谈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 节点操作 以及DOMDocument属性和方法
Dec 06 Javascript
Jquery 基础学习笔记之文档处理
May 29 Javascript
jquery获取下拉列表的值为null的解决方法
Mar 18 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
Aug 29 Javascript
Javascript实现禁止输入中文或英文的例子
Dec 09 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
Sep 01 Javascript
Bootstrap每天必学之前端开发框架
Nov 19 Javascript
JavaScript驾驭网页-DOM
Mar 24 Javascript
Vue微信项目按需授权登录策略实践思路详解
May 07 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
Aug 10 Javascript
vue-router启用history模式下的开发及非根目录部署方法
Dec 23 Javascript
微信小程序tab左右滑动切换功能的实现代码
Feb 08 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通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
最新制作ThinkPHP3.2.3完全开发手册
2015/11/23 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
PHP rmdir()函数的用法总结
2019/07/02 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
js AspxButton的客户端操作
2009/06/26 Javascript
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
JavaScript之编码规范 推荐
2012/05/23 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
JavaScript模拟push
2016/03/06 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
python去掉行尾的换行符方法
2017/01/04 Python
Python探索之Metaclass初步了解
2017/10/28 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
2019/12/09 Python
简单说下OSPF的操作过程
2014/08/13 面试题
经济管理专业毕业生推荐信
2013/11/11 职场文书
工作决心书
2014/03/11 职场文书
民族团结先进集体事迹材料
2014/05/22 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
自主招生自荐信格式
2015/03/04 职场文书
保密法制宣传月活动总结
2015/05/07 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL