2017-05-10 19:15:14 +08:00
This example demonstrates Scope Hoisting in combination with Code Splitting.
This is the dependency graph for the example: (solid lines express sync imports, dashed lines async imports)

All modules except `cjs` are EcmaScript modules. `cjs` is a CommonJs module.
The interesting thing here is that putting all modules in single scope won't work, because of multiple reasons:
2019-04-05 05:04:47 +08:00
- Modules `lazy` , `c` , `d` and `cjs` need to be in a separate chunk
- Module `shared` is accessed by two chunks (different scopes)
- Module `cjs` is a CommonJs module
2017-05-10 19:15:14 +08:00

webpack therefore uses a approach called ** "Partial Scope Hoisting"** or "Module concatenation", which chooses the largest possible subsets of ES modules which can be scope hoisted and combines them with the default webpack primitives.

2018-02-26 10:26:51 +08:00
While module concatenation identifiers in modules are renamed to avoid conflicts and internal imports are simplified. External imports and exports from the root module use the existing ESM constructs.
2017-05-10 19:15:14 +08:00
# example.js
2019-04-05 05:04:47 +08:00
```javascript
_{{example.js}}_
2017-05-10 19:15:14 +08:00
```
# lazy.js
2019-04-05 05:04:47 +08:00
```javascript
_{{lazy.js}}_
2017-05-10 19:15:14 +08:00
```
# a.js
2019-04-05 05:04:47 +08:00
```javascript
_{{node_modules/a.js}}_
2017-05-10 19:15:14 +08:00
```
# b.js
2019-04-05 05:04:47 +08:00
```javascript
_{{node_modules/b.js}}_
2017-05-10 19:15:14 +08:00
```
# c.js
2019-04-05 05:04:47 +08:00
```javascript
_{{node_modules/c.js}}_
2017-05-10 19:15:14 +08:00
```
# d.js
2019-04-05 05:04:47 +08:00
```javascript
_{{node_modules/d.js}}_
2017-05-10 19:15:14 +08:00
```
# cjs.js
2019-04-05 05:04:47 +08:00
```javascript
_{{node_modules/cjs.js}}_
2017-05-10 19:15:14 +08:00
```
# shared.js
2019-04-05 05:04:47 +08:00
```javascript
_{{node_modules/shared.js}}_
2017-05-10 19:15:14 +08:00
```
# shared2.js
2019-04-05 05:04:47 +08:00
```javascript
_{{node_modules/shared2.js}}_
2017-05-10 19:15:14 +08:00
```
# webpack.config.js
2019-04-05 05:04:47 +08:00
```javascript
_{{webpack.config.js}}_
2017-05-10 19:15:14 +08:00
```
2018-01-05 04:39:29 +08:00
# dist/output.js
2017-05-10 19:15:14 +08:00
2019-04-05 05:04:47 +08:00
```javascript
_{{dist/output.js}}_
2017-05-10 19:15:14 +08:00
```
2019-05-10 03:34:28 +08:00
# dist/262.output.js
2017-05-10 19:15:14 +08:00
2019-04-05 05:04:47 +08:00
```javascript
2019-05-10 03:34:28 +08:00
_{{dist/262.output.js}}_
2017-05-10 19:15:14 +08:00
```
Minimized
2019-04-05 05:04:47 +08:00
```javascript
2019-05-10 03:34:28 +08:00
_{{production:dist/262.output.js}}_
2017-05-10 19:15:14 +08:00
```
# Info
2017-12-14 17:09:09 +08:00
## Unoptimized
2017-05-10 19:15:14 +08:00
```
2019-04-05 05:04:47 +08:00
_{{stdout}}_
2017-05-10 19:15:14 +08:00
```
2017-12-14 17:09:09 +08:00
## Production mode
2017-05-10 19:15:14 +08:00
```
2019-04-05 05:04:47 +08:00
_{{production:stdout}}_
2017-05-10 19:15:14 +08:00
```