Skip to content

Commit c6cb55f

Browse files
committed
Updates to react-tree-walker@2.0.0-alpha.1
1 parent e459304 commit c6cb55f

File tree

7 files changed

+54
-69
lines changed

7 files changed

+54
-69
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
"react-dom": "^0.14.0 || ^15.0.0-0"
4343
},
4444
"dependencies": {
45-
"react-tree-walker": "^1.0.0"
45+
"react-tree-walker": "2.0.0-alpha.1"
4646
},
4747
"devDependencies": {
4848
"app-root-dir": "1.0.2",

src/__tests__/integration.test.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { createAsyncComponent, withAsyncComponents } from '../'
88
import { STATE_IDENTIFIER } from '../constants'
99

1010
function Bob({ children }) {
11-
console.log(this)
1211
return (<div>{children}</div>)
1312
}
1413
Bob.propTypes = { children: React.PropTypes.node }

src/createAsyncComponent.js

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ function createAsyncComponent(args) {
4242
constructor(props, context) {
4343
super(props)
4444

45-
const { asyncComponents, asyncComponentsAncestor } = context
45+
const { asyncComponents } = context
4646

4747
this.state = { Component: null }
4848

@@ -57,23 +57,20 @@ function createAsyncComponent(args) {
5757
const Component = es6Resolve(getComponent(id))
5858
if (Component) {
5959
this.state = { Component }
60-
} else {
61-
this.getAsyncComponentData = () => ({
62-
id,
63-
defer: ssrMode === 'defer'
64-
|| (asyncComponentsAncestor && asyncComponentsAncestor.isBoundary),
65-
getResolver: () => this.resolveComponent(),
66-
})
6760
}
61+
62+
// Bind the function to be used by our tree walking (re)hydrator
63+
this.getAsyncComponentData = () => ({
64+
id,
65+
ssrMode,
66+
getResolver: () => this.resolveComponent(),
67+
})
6868
}
6969

7070
getChildContext() {
71-
if (ssrMode !== 'boundary') {
72-
return undefined
73-
}
7471
return {
7572
asyncComponentsAncestor: {
76-
isBoundary: true,
73+
isBoundary: ssrMode === 'boundary',
7774
},
7875
}
7976
}
@@ -117,10 +114,13 @@ function createAsyncComponent(args) {
117114
AsyncComponent.childContextTypes = {
118115
asyncComponentsAncestor: React.PropTypes.shape({
119116
isBoundary: React.PropTypes.bool,
120-
}),
117+
}).isRequired,
121118
}
122119

123120
AsyncComponent.contextTypes = {
121+
asyncComponentsAncestor: React.PropTypes.shape({
122+
isBoundary: React.PropTypes.bool,
123+
}),
124124
asyncComponents: React.PropTypes.shape({
125125
getNextId: React.PropTypes.func.isRequired,
126126
getComponent: React.PropTypes.func.isRequired,

src/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import createAsyncComponent from './createAsyncComponent'
44
import withAsyncComponents from './withAsyncComponents'
55

6+
// create context
7+
// pass context into createAsyncComponentFactory
8+
69
export {
710
createAsyncComponent,
811
withAsyncComponents,

src/withAsyncComponents.js

Lines changed: 13 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -56,50 +56,28 @@ export default function withAsyncComponents(app : React$Element) : Promise<Resul
5656
})
5757
}
5858

59-
const doWalk = (el, ctx = {}, fetchRoot = false) => {
60-
const resolvers = []
59+
const visitor = (element, instance, context) => {
60+
if (instance && typeof instance.getAsyncComponentData === 'function') {
61+
const { id, ssrMode, getResolver } = instance.getAsyncComponentData()
6162

62-
const visitor = (element, instance, context) => {
63-
const skipRoot = !fetchRoot && (element === el)
64-
if (instance
65-
&& typeof instance.getAsyncComponentData === 'function'
66-
&& !skipRoot
67-
) {
68-
const { id, defer, getResolver } = instance.getAsyncComponentData()
63+
const isBoundary = context.asyncComponentsAncestor &&
64+
context.asyncComponentsAncestor.isBoundary
6965

70-
if (rehydrateState) {
71-
if (!rehydrateState.resolved[id]) {
72-
return false
73-
}
74-
rehydrateState[id] = false
75-
} else if (defer) {
76-
// Deferred, so return false to stop walking down this branch.
66+
if (rehydrateState != null) {
67+
if (!rehydrateState.resolved[id]) {
7768
return false
7869
}
79-
80-
const resolver = getResolver()
81-
resolvers.push({
82-
resolver,
83-
element,
84-
context: Object.assign(context, { ASYNC_WALKER_BOUNDARY: true }),
85-
})
70+
rehydrateState[id] = false
71+
} else if (ssrMode === 'defer' || isBoundary) {
72+
// Deferred, so return false to stop walking down this branch.
8673
return false
8774
}
88-
return undefined
75+
return getResolver()
8976
}
90-
91-
reactTreeWalker(el, visitor, ctx)
92-
93-
const nestedPromises = resolvers.map(({ resolver, element, context }) =>
94-
resolver.then(() => doWalk(element, context)),
95-
)
96-
97-
return nestedPromises.length > 0
98-
? Promise.all(nestedPromises)
99-
: Promise.resolve([])
77+
return true
10078
}
10179

102-
return doWalk(appWithAsyncComponents, {}, true)
80+
return reactTreeWalker(appWithAsyncComponents, visitor, {})
10381
// Swallow errors.
10482
.catch(() => undefined)
10583
// Ensure that state rehydration is killed

tools/webpack/configFactory.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function webpackConfigFactory({ target } : Args) {
2222
filename: target === 'umd'
2323
? `${libraryName}.js`
2424
: `${libraryName}.min.js`,
25-
library: libraryName,
25+
library: 'ReactAsyncComponent',
2626
libraryTarget: 'umd',
2727
},
2828
externals: {
@@ -69,7 +69,13 @@ function webpackConfigFactory({ target } : Args) {
6969
{
7070
test: /\.js$/,
7171
loader: 'babel-loader',
72-
include: [resolvePath(appRootDir.get(), './src')],
72+
include: [
73+
resolvePath(appRootDir.get(), './src'),
74+
resolvePath(appRootDir.get(), './node_modules/p-limit'),
75+
resolvePath(appRootDir.get(), './node_modules/p-locate'),
76+
resolvePath(appRootDir.get(), './node_modules/p-map-series'),
77+
resolvePath(appRootDir.get(), './node_modules/p-reduce'),
78+
],
7379
},
7480
],
7581
},

yarn.lock

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -296,20 +296,7 @@ babel-eslint@7.1.1:
296296
babylon "^6.13.0"
297297
lodash.pickby "^4.6.0"
298298

299-
babel-generator@^6.18.0:
300-
version "6.23.0"
301-
resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.23.0.tgz#6b8edab956ef3116f79d8c84c5a3c05f32a74bc5"
302-
dependencies:
303-
babel-messages "^6.23.0"
304-
babel-runtime "^6.22.0"
305-
babel-types "^6.23.0"
306-
detect-indent "^4.0.0"
307-
jsesc "^1.3.0"
308-
lodash "^4.2.0"
309-
source-map "^0.5.0"
310-
trim-right "^1.0.1"
311-
312-
babel-generator@^6.24.0:
299+
babel-generator@^6.18.0, babel-generator@^6.24.0:
313300
version "6.24.0"
314301
resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.0.tgz#eba270a8cc4ce6e09a61be43465d7c62c1f87c56"
315302
dependencies:
@@ -3795,6 +3782,16 @@ p-locate@^2.0.0:
37953782
dependencies:
37963783
p-limit "^1.1.0"
37973784

3785+
p-map-series@^1.0.0:
3786+
version "1.0.0"
3787+
resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca"
3788+
dependencies:
3789+
p-reduce "^1.0.0"
3790+
3791+
p-reduce@^1.0.0:
3792+
version "1.0.0"
3793+
resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
3794+
37983795
pako@~0.2.0:
37993796
version "0.2.9"
38003797
resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
@@ -4027,9 +4024,11 @@ react-dom@15.4.2:
40274024
loose-envify "^1.1.0"
40284025
object-assign "^4.1.0"
40294026

4030-
react-tree-walker@^1.0.0:
4031-
version "1.0.0"
4032-
resolved "https://registry.yarnpkg.com/react-tree-walker/-/react-tree-walker-1.0.0.tgz#061f719232a5b77b01fbab21b8ee6a3ab7be7085"
4027+
react-tree-walker@2.0.0-alpha.1:
4028+
version "2.0.0-alpha.1"
4029+
resolved "https://registry.yarnpkg.com/react-tree-walker/-/react-tree-walker-2.0.0-alpha.1.tgz#30621dad9732ada495ef82154b937f7971deb2b9"
4030+
dependencies:
4031+
p-map-series "^1.0.0"
40334032

40344033
react@15.3.1:
40354034
version "15.3.1"

0 commit comments

Comments
 (0)