webpack打包原理

webpack打包原理
作者:Dinosaur 标签:webpack 发布于:2020/3/19 下午5:40 浏览:(9)
webpack打包原理

2020年3月19日

17:19

  上节《浅谈webpack》中,笔者简单介绍了一下webapck的工作原理,这节我们从源码的角度上,较为深刻的探究一下(就是不是特别深刻的意思):

  上节我们已经知道了,webpack因为要兼顾commonjs和es6的引入导出方式,而选择用函数调用的方式打包代码,那么我们今天看一下,打包后的dist目录下的main文件,到底是怎么运作的。

  首先,我们在src目录下,写入两个文件,一个是a.js,一个是index.js,大家都知道webpack打包时是从src目录下的index.js来分析依赖关系的,这里直接贴上两个文件的代码:

a.js:

console.log(“module a”);

var a = “hello my name is little a”

module.exports = a;

Index.js:

console.log(“module index”);

require("./a.js");

console.log(“调用完成”);

webpack的打包结果输出顺序为:module index , module a hello xxxx,调用完成。

下面来一步一步写一下webpack的main源码,首先大家要知道,webpack会将src中的文件变成一个对象,对象中的键是文件目录,值为一个函数,函数体是相应文件内容,代码如下:

var modules = {

    "../src/index.js": function (module, exports,require) {

        console.log("module index");



        require("../src/a.js");



        console.log("调用完成");//index文件的代码

    },

    "../src/a.js": function (module, exports) {

        console.log("module a");

        const a = "hello my name is little a"

        module.exports = a;//a文件的代码

    }

}

  从文件中可以看出,webpack中不能出现传统的引入文件或者抛出的写法,这里用参数将其传递进去。



  为了不产生命名冲突,我们将其写入立即执行函数,直接将modules作为其参数传入

(function(modules){

})({

"../src/index.js": function (module, exports,require) {

    console.log("module index");

    const result = require("../src/a.js");

    console.log("调用完成");

},

"../src/a.js": function (module, exports) {

    console.log("module a");

    const a = "hello my name is little a"

    module.exports = a;

}

})

  首先肯定要require(’../src.index.js‘),来分析依赖关系,但是没有require,只能自己写

(function(modules){

function require(src) {

    const func = modules[src];//根据传入的src,调用不同的函数。

    func(module,module.exports,require)

}

require("../src/index.js");

})({

"../src/index.js": function (module, exports,require) {

    console.log("module index");

    const result = require("../src/a.js");

    console.log("调用完成");

},

"../src/a.js": function (module, exports) {

    console.log("module a");

    const a = "hello my name is little a"

    module.exports = a;

}

})

require函数中再来调用modules(被传入的对象,)中的函数,这个函数需要将module,module.exports和require传入。但是没有前两个怎么办呢?自己写:

//防止命名冲突,使用立即执行函数。

(function (modules) {

function require(src) {

    const func = modules[src];//根据传入的src,调用不同的函数。

    const module = {

        exports: {}

    }//自己写的module

    func(module,module.exports,require)

    const result = module.exports;//拿到结果

    return result;

}

require("../src/index.js");

})({

"../src/index.js": function (module, exports,require) {

    console.log("module index");

    const result = require("../src/a.js");

    console.log("调用完成");

},

"../src/a.js": function (module, exports) {

    console.log("module a");

    const a = "hello my name is little a"

    module.exports = a;

}

});

读者可以自行分析一下上述代码运作过程,其实就是webpack打包原理的简化版。

结束语:

前端技术博大精深,笔者才学疏浅,上述所述均为自身观点,而非标准答案,若有疑惑、指正,欢迎在

www.dinosaurcoder.com 留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值