浅谈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 相关文章推荐
firefox浏览器不支持innerText的解决方法
Aug 07 Javascript
jQuery下的动画处理总结
Oct 10 Javascript
javascript获取xml节点的最大值(实现代码)
Dec 11 Javascript
用原生JS获取CLASS对象(很简单实用)
Oct 15 Javascript
Javascript实现div的toggle效果实例分析
Jun 09 Javascript
详解AngularJS中自定义过滤器
Dec 28 Javascript
AngularJS ng-change 指令的详解及简单实例
Jul 30 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
Sep 18 Javascript
JavaScript函数柯里化原理与用法分析
Mar 31 Javascript
jQuery实现获取动态添加的标签对象示例
Jun 28 jQuery
element ui table 增加筛选的方法示例
Nov 02 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
Jul 11 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应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
js 字符串转换成数字的三种方法
2013/03/23 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
jQuery实用技巧必备(上)
2015/11/02 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
Django与Vue语法的冲突问题完美解决方法
2017/12/14 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
Python模块学习 filecmp 文件比较
2012/08/27 Python
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
python 将dicom图片转换成jpg图片的实例
2020/01/13 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
2020/02/26 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
Java多线程实现四种方式原理详解
2020/06/02 Python
python访问hdfs的操作
2020/06/06 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
Win10下用Anaconda安装TensorFlow(图文教程)
2020/06/18 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
毕业生自荐信
2013/12/14 职场文书
季度思想汇报
2014/01/01 职场文书
2014年五四青年节活动方案
2014/03/29 职场文书
捐款倡议书
2014/04/14 职场文书
实践单位评语
2014/04/26 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
小学二年级数学教学计划
2015/01/20 职场文书