Skip to content

Commit be216d1

Browse files
author
yichi
committed
add new blog
1 parent 4a31136 commit be216d1

File tree

2 files changed

+717
-0
lines changed

2 files changed

+717
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
---
2+
layout: post
3+
title: "webpack-打包原理"
4+
description: "webpack打包原理"
5+
category: tech
6+
tags: ['webpack']
7+
---
8+
{% include JB/setup %}
9+
10+
开始填坑系列,将前2个月原理&源码维度学习的webpack\vue\react所得收获整理出来。
11+
12+
webpack的打包原理是怎样,其实刨除loader\plugin的核心功能实现起来并不难,这份仓库代码很好的展现了核心逻辑:[https://github.com/ronami/minipack](https://github.com/ronami/minipack)
13+
14+
简要代码:
15+
16+
```javascript
17+
(function(modules) {
18+
function require(id) {
19+
const [fn, mapping] = modules[id];
20+
21+
function localRequire(name) {
22+
return require(mapping[name]);
23+
}
24+
25+
const module = { exports: {} };
26+
27+
fn(localRequire, module, module.exports);
28+
29+
return module.exports;
30+
}
31+
32+
require(0);
33+
})({
34+
0: [
35+
function(require, module, exports) {
36+
"use strict";
37+
38+
var _message = require("./message.js");
39+
40+
var _message2 = _interopRequireDefault(_message);
41+
42+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
43+
44+
console.log(_message2.default);
45+
}
46+
, { "./message.js": 1 }
47+
, ]
48+
, 1: [
49+
function(require, module, exports) {
50+
"use strict";
51+
52+
Object.defineProperty(exports, "__esModule", {
53+
value: true
54+
});
55+
56+
var _name = require("./name.js");
57+
58+
exports.default = "hello " + _name.name + "!";
59+
}
60+
, { "./name.js": 2 }
61+
, ]
62+
, 2: [
63+
function(require, module, exports) {
64+
"use strict";
65+
66+
Object.defineProperty(exports, "__esModule", {
67+
value: true
68+
});
69+
var name = exports.name = 'world';
70+
}
71+
, {}
72+
, ]
73+
, })
74+
75+
```
76+
77+
打包过程:
78+
79+
- 提供一个入口文件
80+
- babylon分析这个入口文件
81+
- 提取依赖
82+
- 获得babel转成es5后的兼容代码
83+
- 确定个全局标识符id
84+
- 再对入口文件的依赖进行递归处理,进行上述分析,得到依赖图graph
85+
- 生成bundle
86+
- 将graph的每个片段都插入一些代码,成为 { id: [func(require, module, exports){ origin code}, dependenceMap]}的结构
87+
- 定义自己的依赖加载函数require
88+
- 将两部分字符串代码片段合成
89+
90+
核心是打包工具自己实现的依赖加载器require,require里创造的module变量来记录fn调用后返回的结果,babel转完后,如果有返回值会挂到exports的变量上,着这里被module.exports接收,并作为require函数的返回,所以require函数的返回是执行对应的文件后所获得的该文件export出来的内容,localRequire里将这个值返回出来也就是原文件import 需要得到的值,供原文件引用。

0 commit comments

Comments
 (0)