1
- # 什么是webpack
1
+ ## 什么是webpack
2
2
可以引用官网的一幅图解释,我们可以看到webpack,可以分析各个模块的依赖关系,最终打包成我们常见的静态文件,.js 、 .css 、 .jpg 、.png。今天我们先不弄那么复杂,我们就介绍webpack是怎么分析ES6的模块依赖,怎么把ES6的代码转成ES5的。
3
3
4
4
![ ] ( https://user-gold-cdn.xitu.io/2019/3/2/1693ed9df7905766?w=2124&h=928&f=png&s=153846 )
5
5
6
- # 实现
6
+ ## 实现
7
7
由于ES6转ES5中需要用到babel,所以要用到一下插件
8
8
9
9
` npm install @babel/cord @babel/traverse @babel/core @babel/preset-env --save-dev `
10
- ## 需要的文件
10
+ ### 需要的文件
11
11
使用webpack肯定少不了原文件,我们会涉及三个需要打包的js文件(` entry.js ` 、` message.js ` 、` name.js ` )
12
12
13
13
```
@@ -50,10 +50,10 @@ function bundle(graph) {//代码略}
50
50
- bundler.js
51
51
```
52
52
53
- ## 如何分析依赖
53
+ ### 如何分析依赖
54
54
webpack分析依赖是从一个入口文件开始分析的,当我们把一个入口的文件路径传入,webpack就会通过这个文件的路径读取文件的信息(读取到的本质其实是字符串),然后把读取到的信息转成AST(抽象语法树),简单点来说呢,就是把一个js文件里面的内容存到某种数据结构里,里面包括了各种信息,** 其中就有当前模块依赖了哪些模块** 。我们暂时把通过传** 文件路径** 能返回文件信息的这个函数叫 ` createAsset ` 。
55
55
56
- ## ` createAsset ` 返回什么
56
+ ### ` createAsset ` 返回什么
57
57
第一步我们肯定需要先从 ` entry.js ` 开始分析,于是就有了如下的代码,我们先不关心` createAsset ` 具体代码是怎么实现的,具体代码我会放在最后。
58
58
```
59
59
createAsset("./example/entry.js");
@@ -62,22 +62,22 @@ createAsset("./example/entry.js");
62
62
![ ] ( https://user-gold-cdn.xitu.io/2019/3/2/1693eee846b82ac0?w=1482&h=560&f=png&s=101080 )
63
63
通过 ` createAsset ` 我们成功拿到了` entry.js ` 的依赖,就是 ` dependencies ` 数组。
64
64
65
- ## ` createGraph ` 返回什么,如何找下一个依赖
65
+ ### ` createGraph ` 返回什么,如何找下一个依赖
66
66
我们通过上面可以拿到entry.js依赖的模块,于是我们就可以接着去遍历` dependencies ` 数组,循环调用` createAsset ` 这样就可以得到全部模块相互依赖的信息。想得到全部依赖信息需要调用 ` createGraph ` 这个一个函数,它会进行广度遍历,最终返回下面的数据
67
67
68
68
![ ] ( https://user-images.githubusercontent.com/15076030/53696618-e8055b80-3e03-11e9-82b6-83b81f5cd82a.png )
69
69
70
70
我们可以看到返回的数据,字段之前都和大家解释了,除了 ` mapping ` ,` mapping ` 这个字段是把当前模块依赖的** 文件名称** 和 模块的id 做一个映射,目的是为了更方便查找模块。
71
71
72
- ## ` bundle ` 返回什么 && 最后步骤
72
+ ### ` bundle ` 返回什么 && 最后步骤
73
73
我们现在已经能拿到每个模块之前的依赖关系,我们再通过调用` bundle ` 函数,我们就能构造出最后的` bundle.js ` ,输出如下图
74
74
75
75
![ ] ( https://user-images.githubusercontent.com/15076030/53690721-1efb5300-3dab-11e9-9f9b-b4ef4c0691da.png )
76
76
77
77
78
- ## 源码
78
+ ### 源码
79
79
[ 点击查看源码] ( https://github.com/dykily/simple_webpack/blob/master/bundler.js )
80
- # 最后
80
+ ## 最后
81
81
文章可能有不足的地方,请大家见谅,如果有什么疑问可以下方留言讨论。
82
82
83
83
如果大家对文字描述还是不太清楚,建议看我下方提供的视频,我就是从视频中学的,这个是在youtube上的视频,大家懂的,有条件的还是建议看一下。😝
0 commit comments