webpack模块化的原理

webpack 中实现模块化的核心就是函数,无论是commonjs模块化还是es 模块都是通过该函数来导入的。并且利用立即执行函数的特点实现了作用域的封闭避免了全局变量的污染,非常的巧妙。
摘要由CSDN通过智能技术生成

commonjs

在webpack中既可以书写commonjs模块也可以书写es模块,而且不用考虑浏览器的兼容性问题,我们来分析一下原理。

首先搞清楚commonjs模块化的处理方式,简单配置一下webpack,写两个模块编译一下看一下:

webpack.config.js

module.exports = {
   
    mode: "development",
    devtool: "none"
}

index.js

const a = require('./a')
console.log(a)

a.js

const a = 'a';
module.exports = a;

编译结果

查看编译结果,可以发现webpack对于每个模块的做法类似于node,将每个模块放在一个函数环境中并向其中传入一些必要的参数。webpack将这些模块组成一个对象(属性名是模块路径(模块id),属性值为模块内容)传入一个立即执行函数,立即执行函数中定义了一个函数 __webpack_require__类似node中的require函数,实现了导入模块的作用。

打包结果中删去了一些注释和暂时用不要的代码,可以很明显的看出来实现commonjs模块化的关键就是这个 __webpack_require__ 函数,通过传入模块id来得到模块的导出。

require 函数

__webpack_require__ 函数的实现:

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

如果熟悉node就很容易理解这个函数了:

  1. 首先查看这个模块是否已经被加载过,所以就需要一个全局变量installedModules用来记录所有被加载过模块的导出
  2. 没有加载过的模块就先构造一个module对象,关键是要有一个 exports 属性
  3. 执行模块代码并返回模块导出值

最终的一步就是需要加载启动模块,也就是IIFE的最后一句:

return __webpack_require__("./src/index.js");

ES Module

es 模块化的处理方式是需要借助 __webpack_require__ 实现的,首先看一些刚才被删除的代码:

  1. __webpack_require__.r

    该函数用于标识es模块的导出

    // define __esModule on exports
    __webpack_require__.r = function (exports) {
         
       if (
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值