浅谈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温习的一些笔记 基础常用知识小结
Jun 22 Javascript
node.js中的path.normalize方法使用说明
Dec 08 Javascript
jquery带动画效果幻灯片特效代码
Aug 27 Javascript
jQuery实现简单下拉导航效果
Sep 07 Javascript
如何用angularjs制作一个完整的表格
Jan 21 Javascript
JavaScript操作表单实例讲解(上)
Jun 20 Javascript
JS实现六位字符密码输入器功能
Aug 19 Javascript
微信小程序 Page()函数详解
Oct 17 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
Mar 09 Javascript
vue实现多个元素或多个组件之间动画效果
Sep 25 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
Aug 16 Javascript
基于JavaScript实现轮播图效果
Jan 02 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生成随机数或者字符串的代码
2008/09/05 PHP
PHP过滤★等特殊符号的正则
2014/01/27 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
犀利的js 函数集合
2009/06/11 Javascript
javascript事件问题
2009/09/05 Javascript
js的逻辑运算符 ||
2010/05/31 Javascript
JS获取URL中参数值(QueryString)的4种方法分享
2014/04/12 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
JavaScript实现点击单元格改变背景色的方法
2016/02/12 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
python中的subprocess.Popen()使用详解
2019/12/25 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
python基于opencv实现人脸识别
2021/01/04 Python
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
建筑总经理岗位职责
2014/02/02 职场文书
大三学生做职业规划:给未来找个方向
2014/02/24 职场文书
电力培训心得体会
2014/09/02 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
校长四风对照检查材料
2014/09/27 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
后勤工作个人总结
2015/02/28 职场文书
土建施工员岗位职责
2015/04/11 职场文书
生死抉择观后感
2015/06/09 职场文书
班主任培训研修日志
2015/11/13 职场文书
小程序实现筛子抽奖
2021/05/26 Javascript