webpack模块化原理简析

1.webpack的核心原理

  • 一切皆模块:在webpack中,css,html.js,静态资源文件等都可以视作模块;便于管理,利于重复利用;

  • 按需加载:进行代码分割,实现按需加载。

2. webpack模块化原理:以js为例,分析webpack构建common.js的模块化方式。

  • ①构建示例代码

    //b.js
    let b =3
    export {b};//a.js
    let b = require('./b.js')
    let  a = b+123;//webpack.config.js
    let path = require("path")
    module.exports = {entry: './a.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'build')},module: {loaders: [{test: /\.js$/,loader: 'babel-loader',query: {presets: ['es2015']}}}}
    
  • ②分析bundle.js

    • a.整体结构:整个bundle.js整个是一个执行函数,传进去的参数是一个个的模块,也是一个的函数,通过函数的作用于达到模块化的效果。

      (function (modules) {………………})([  //模块初始化function (module, exports, __webpack_require__) {/* 模块a.js的代码 */},  function (module, exports, __webpack_require__) {/* 模块b.js的代码 */}]);
    • b.模块初始化

       //1.定义一个模块缓存的容器
      var installedModules = {};//2.webpack的require实现
      function __webpack_require__(moduleId) {//传参是模块ID//3.判断模块是否缓存,若是缓存了就不用加载,直接返还这个已缓存的模块if(installedModules[moduleId]) {return installedModules[moduleId].exports;}// 4.若是没有被缓存,则缓存这个模块var module = installedModules[moduleId] = {i: moduleId, //模块IDl: false,    //标识模块是否加载exports: {}};//5.执行模块函数,modules代表一系列的模块函数,要动态绑定module.exports,绑定this;可以交叉连续引用。     modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);// 6.标记模块已经被加载module.l = true;// 7.返回该模块的exportsreturn module.exports;}//8.require第一个 模块return __webpack_require__(0);
      }
    • c.模块函数

       //a.js模块function(module, exports, __webpack_require__) {"use strict";var b = __webpack_require__(1);//重复调用var a = b + 123;}//b.js模块function(module, exports, __webpack_require__) {"use strict";var b = 3;exports.b = b;}     
    • d.下面是执行的流程图,指定一个初始模块,所有被引用的模块会响应的循环加载。

  • ps几个小问题

    • 1.在模块加载的时候,最后传递的一个参数是__webpack_require__,是全局定义的函数,为什么是全局的呢,因为自执行函数的this指向全局。

    • 2.commond.js需要注意模块导出的问题

      • exports不能直接赋值,无用,因为源码中返回的是module.exports

      • ②可以在exports上增加属性,比如exports.fn=;这样module.exports会变化,最终导出的是module.exports也会变化;

        //node.js部分源码,node也是通过闭包实现模块的隔离
        (function(exports,module,require,__dirname,__filename){this = module.exports  //this是指向module.exports的module.exports = exports = {}
        return module.exports})()

Webpack模块化原理简析相关推荐

  1. Android Handler与Looper原理简析

    一直感觉自己简直就是一个弱智,最近越来越感觉是这样了,真的希望自己有一天能够认同自己,认同自己. 本文转载于:https://juejin.im/post/59083d7fda2f60005d14ef ...

  2. grpc通信原理_gRPC原理简析

    gRPC原理简析 gRPC是由谷歌提出并开发的RPC协议,gRPC提供了一套机制,使得应用程序之间可以进行通信. 降级开发者的使用门槛,屏蔽网络协议,调用对端的接口就像是调用本地的函数一样.而gRPC ...

  3. webpack模块化原理-ES module

    上一篇文章介绍了webpack对commonjs模块的支持(如果你还没读过,建议你先阅读),这篇文章来探究一下,webpack是如何支持es模块的. 准备 我们依然写两个文件,m.js文件用es模块的 ...

  4. Android V1及V2签名原理简析

    Android为了保证系统及应用的安全性,在安装APK的时候需要校验包的完整性,同时,对于覆盖安装的场景还要校验新旧是否匹配,这两者都是通过Android签名机制来进行保证的,本文就简单看下Andro ...

  5. CRC原理简析——史上最清新脱俗简单易懂的CRC解析

    CRC原理简析 1. CRC校验原理 CRC校验原理根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端.当然,这个 ...

  6. Java的定时器Timer和定时任务TimerTask应用以及原理简析

    记录:272 场景:Java JDK自带的定时器Timer和定时任务TimerTask应用以及原理简析.在JDK工具包:java.util中可以找到源码,即java.util.Timer和java.u ...

  7. 转子接地保护原理_发变组转子接地保护原理简析

    发变组转子接地保护原理简析 发电机转子接地故障是常见的故障之一, 发生一点接地, 对发电机本身并不直接构成危 害,此时可通过转移负荷,平稳停机后,再查故障点:若在此基础上又发生另外一点接地, 将会严重 ...

  8. Mysql锁机制及原理简析

    Mysql锁机制及原理简析 一.前言 1.什么是锁? 锁是计算机协调多个进程或线程并发访问某一资源的机制. 锁保证数据并发访问的一致性.有效性: 锁冲突也是影响数据库并发访问性能的一个重要因素. 锁是 ...

  9. JTAG、SWD调试原理简析

    JTAG.SWD调试原理简析 STM32F10xxx使用CortexM-M3内核,该内核内含硬件调试模块,支持复杂的调试操作.硬件调试模块允许内核在取指(指令断点)或访问数据(数据断点)时停止.内核停 ...

最新文章

  1. 在SQL2000怎樣用動態實現SQL2005的nvarchar(max)功能
  2. Vivado开发过程中生成的主要文件
  3. LogMiner学习笔记
  4. ds排序--希尔排序_图解直接插入排序和希尔排序
  5. java socket 判断断网_java socket 判断对方在线或离线、断线
  6. 跟左神学算法2 排序相关
  7. 川土微 | CA-IS3105W 全集成 DC-DC 转换器
  8. eclipse svn下载并转为maven项目
  9. mysql 纯真ip 导出dat_用纯真ip数据库.dat文件查询ip归属
  10. 马斯克称已将大脑上传到云端【系统或已开源】
  11. Charles 4.2.7 for Mac 中文破解版
  12. 搜狗微信临时链接转换成永久链接
  13. 一次人大金仓剔除锁经历
  14. Java 线程池配置的常见误区
  15. @Controller注解的一些理解吧
  16. 计算机清理方法,电脑清理方法 电脑要如何清理
  17. 关于本科期间参加人工智能方向竞赛的建议
  18. cron表达式详解!!!!
  19. 牛顿迭代法——求根好手
  20. MySQL数据库全量、增量备份与恢复

热门文章

  1. Android之如何获取手机程序列表以及程序相关信息并启动指定程序
  2. 人工智能实践:TensorFlow笔记学习(二)—— Python语法串讲
  3. 如何在Storyboard中使用Scroll view
  4. swift_036(Swift之第三方库SwiftyJSON篇)
  5. (0032) iOS 开发之Block 的基础用法及注意事项1
  6. InetAddress类和InetSocketAddress的使用
  7. [CSU1911]Card Game
  8. 基于通用权限管理系统实现的单点登录
  9. swing LayoutManager 和多态
  10. 《软件开发性能优化系列》之主键、索引设计