neuronjs
Version:
Neuron is A Full Feature CommonJS Module Manager, Dependency Graph Handler and Loader for Browsers
110 lines (91 loc) • 1.73 kB
Markdown
# TL;DR Graph
> The developers' draft
## Dependency loading
We say vertex X is ready, if
- `X.ready === true`, or
- has no dependencies, or
- each dependency Y of X
- is ready, or
- there is a path directed from Y to X, which forms a [strongly connected graph](http://en.wikipedia.org/wiki/Strongly_connected_component), and each vertex on the path is loaded.
If X is a vertex of a strongly connected graph, and X is ready, then all vertices of the graph are ready.
Suppose there is a dependency graph
```
A ─────> B(ready)
|
v
C <──────┬──────> E(ready)
| |
└──────> D ─────> F ─────> G
^ |
| |
└─────────────────┘
```
We want to check if A is ready. So,
`A.ready <==> C.ready`
We are not sure if C is ready, and we found C has a dependency D, so
`C.read <==> D.ready`
D has 3 dependencies,
- E is ready
- C: there is a path C -> D
- F: there is a path F -> D
So, D is ready, which indicates A is ready.
## Shrinkwrap
using object `refs` as optimization:
### graph
```js
// modules
{
0: [
"2.1.0"
],
1: [
"1.9.0"
],
2: [
"1.1.0",
{
"X@~1.1.0": 3
}
],
3: [
"1.1.0",
{
"Y@~1.1.0": 2
}
],
4: [
"1.2.0",
{
"D@^4.0.0": 6
"F@^2.0.0": 0
}
],
5: [
"5.0.0",
{
"D@^4.0.0": 7
"F@^2.0.0": 0
}
],
6: [
"4.1.0",
{
"E@^1.0.0": 8
}
],
7: [
"4.1.0",
{
"E@^1.0.0": 1
}
],
8: [
"1.1.0"
],
_: {
"A@*": 4,
"B@5.0.0": 5,
"B^5.0.0": 5
}
}
```