const show = require('./show')
show('webpack hello 77')
show.js:
function show(content) {
window.document.getElementById('app').innerHTML = content
}
module.exports = show
最后打包到 bundle.js,现在我们就看看他是长什么样子?
(function(modules){
// xxx
})([
// main.js
(function(module,exports,__webpack_require__){
const show = __webpack_require__(1)
show('webpack hello 77')
}),
// show.js
(function(module,exports){
function show(content) {
window.document.getElementById('app').innerHTML = content
}
module.exports = show
})
])
我们可以看到,它是一个立即执行函数,该函数的参数是一个数组,并把 entry 所对应的文件作为该数组的第一个元素,那么是不是这是一个约定呢?(我们后面再谈),然后将 main 依赖的 show 作为后续元素,而且我们注意到,它不像 main 一样有 __webpack_require__ 这个参数,这个又是不是是一个约定呢?
这里只是简单的窥探
webpack
的打包过程,能力有限,欢迎交流webpack 构建流程
webpack.config.js
文件里配置的参数,生产最后的配置结果webpack
构建生命周期的事件节点,以做出对应的反应entry
入口文件开始解析文件构建AST语法树,找出每个文件所依赖的文件,递归下去loader配置
找出合适的loader用来对文件进行转换
entry
配置生成代码块chunk
chunk
到文件系统webpack.config.js:
main.js:
show.js:
最后打包到
bundle.js
,现在我们就看看他是长什么样子?我们可以看到,它是一个立即执行函数,该函数的参数是一个数组,并把
entry
所对应的文件作为该数组的第一个元素,那么是不是这是一个约定呢?(我们后面再谈),然后将main
依赖的show
作为后续元素,而且我们注意到,它不像main
一样有__webpack_require__
这个参数,这个又是不是是一个约定呢?好,现在我们来看看立即执行函数里面发生了什么
如上,我们看见,先是定义一个
__webpack_require__
,然后在上面添加一些方法,最后开始模块的加载,我们来讲解加载的流程, 先是执行 数组的第一个元素,main,然后里面遇到__webpack_require__(1)
,自动将 要加载的数值加一,然后去加载show.js
,并将exports
返回,供main
使用,这里我们看见模块加载和SeaJs
一样,是延迟加载的,show 里面的函数,就是SeaJs
中define
函数的factory
参数,详见我写的 seajs 阅读感悟至此,我们简单的分析了其中的加载原理,但这仅仅是两个模块的情况,那么更复杂的呢?还有里面的
__webpack_require__
的一些方法在这里面都没有体现作用,它们又是干嘛的呢?我们继续
^_^