首页 > 代码库 > webpack到底是怎么打包的,多入口,草稿

webpack到底是怎么打包的,多入口,草稿

webpack.config

module.exports={
    entry:[‘entry1.js‘,‘entry2.js‘],
    output:{
        path:‘./dist‘,
        filename:‘output.js‘
    }
}

 

豪不意外,对于普通的多入口webpack.config文件,打包出来的文件和单入口文件一样,把两个文件作为自执行函数的参数放在数组传了进去,不过这两个文件的位置是1和2(最开始以为是0和1对吧),位置0的是webpack自己生成的一个函数。是长这个样子的。

* 0 */
 function(module, exports, __webpack_require__) {

	__webpack_require__(1);
	module.exports = __webpack_require__(2);


},

 这下就知道上一篇文章的疑惑了,为啥要在call方法里面传入__webpack_require__方法,这是为了多文件入口的时候调用。

这个编号为0的模块功能就是把所有入口的模块都运行一下,当然每次运行都__webpack_require__都会生成一个module保存在webpack内部。

所以这个运行完以后会有3个模块,同时0号模块也保存了2号模块的内容,为什么这么做我还不清楚。

其实最开始的时候我还在想,如果像上一篇那样编译文件,多入口文件是没办法都运行的,只能运行第一个模块,就是编号0的模块,这样一来,就解决了我的疑惑。

那么如果把两个入口编译到两个不同的文件,还会有这个自动生成的0号模块么?比如这样的config文件:

module.exports={
    entry:{
        a:‘./entry1.js‘,
        b:‘./entry2.js‘},
    output:{
        path:‘./dist‘,
        filename:‘[name].js‘
    }
}

 答案是不会,尽管生成了a.js和b.js。但是各自都是单模块文件,就是上一篇随笔写的那种格式。

那如果这样的config文件会生成什么样的文件?

module.exports={
    entry:{
        a:[‘./entry1.js‘,‘./entry3.js‘,],
        b:[‘./entry2.js‘,‘./entry3.js‘,]},
    output:{
        path:‘./dist‘,
        filename:‘[name].js‘
    }
}

 a模块依赖entry1和entry3;b模块依赖entry2和entry3

打包出来的a.js and b.js都有0号加载模块,就是自动生成那个模块,同时,也都有entry3.js里面的源代码,这就有点操蛋了,这意味着entry3.js里面的代码被编译了两次被加载了两次,如果这个代码是一个大的库,那就麻烦了。可是我觉得webpack不会这么水的,所以先不搭理,先按照自己的思路去探索。

我很想知道的是,如果在js文件中加载依赖会发生什么。这就试试。

entry2.js我export了一个字符串,然后我在entry1.js中require这个字符串:

var doing = ‘fuck‘
var how = ‘bitch‘;
var what = require(‘./entry2‘);
module.exports={
    doing:doing,
    how:how,
    what:what
};
this.haha=‘aha‘

 编译一下试试。

结果是这样的,

/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {

	var doing = ‘fuck‘
	var how = ‘bitch‘;
	var what = __webpack_require__(2);
	module.exports={
	    doing:doing,
	    how:how,
	    what:what
	};
	this.haha=‘aha‘

/***/ },
/* 2 */
/***/ function(module, exports) {

	var name = ‘entry2‘;
	module.exports=name;

/***/ }

我发现自己写的require(‘./entry2‘)变成了__webpack_require__(2)。同时,entry2这个模块也变成了2号模块被编译了进来。这么一来就很清楚了。

还有就是,能看出来webpack是以output的文件为单位的,每一个文件都是一个新模块,和其他文件互相不干扰。

 

webpack到底是怎么打包的,多入口,草稿