-
Notifications
You must be signed in to change notification settings - Fork 29.8k
Add WrapApp prop to AppTree to work in HOC and with apollo #17598
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Stats from current PRDefault Server Mode (Decrease detected ✓)General Overall increase
|
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| buildDuration | 12.5s | 12.8s | |
| nodeModulesSize | 63.1 MB | 63.1 MB |
Page Load Tests Overall decrease ⚠️
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| / failed reqs | 0 | 0 | ✓ |
| / total time (seconds) | 2.27 | 2.281 | |
| / avg req/sec | 1101.33 | 1095.82 | |
| /error-in-render failed reqs | 0 | 0 | ✓ |
| /error-in-render total time (seconds) | 1.256 | 1.277 | |
| /error-in-render avg req/sec | 1991 | 1957.62 |
Client Bundles (main, webpack, commons)
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| 677f882d2ed8..9339.js gzip | 10.9 kB | 10.9 kB | ✓ |
| framework.HASH.js gzip | 39 kB | 39 kB | ✓ |
| main-d493e7d..42f5.js gzip | 7.17 kB | 7.17 kB | ✓ |
| webpack-e067..f178.js gzip | 751 B | 751 B | ✓ |
| Overall change | 57.8 kB | 57.8 kB | ✓ |
Client Bundles (main, webpack, commons) Modern
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| 677f882d2ed8..dule.js gzip | 6.77 kB | 6.77 kB | ✓ |
| framework.HA..dule.js gzip | 39 kB | 39 kB | ✓ |
| main-f8905d4..dule.js gzip | 6.24 kB | 6.24 kB | ✓ |
| webpack-07c5..dule.js gzip | 751 B | 751 B | ✓ |
| Overall change | 52.7 kB | 52.7 kB | ✓ |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| polyfills-4b..e242.js gzip | 31 kB | 31 kB | ✓ |
| Overall change | 31 kB | 31 kB | ✓ |
Client Pages
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| _app-9a0b9e1..b37e.js gzip | 1.28 kB | 1.28 kB | ✓ |
| _error-ed1b0..8fbd.js gzip | 3.44 kB | 3.44 kB | ✓ |
| hooks-89731c..c609.js gzip | 887 B | 887 B | ✓ |
| index-17468f..5d83.js gzip | 227 B | 227 B | ✓ |
| link-d2344ce..8b36.js gzip | 1.3 kB | 1.3 kB | ✓ |
| routerDirect..924c.js gzip | 284 B | 284 B | ✓ |
| withRouter-7..c13d.js gzip | 284 B | 284 B | ✓ |
| Overall change | 7.71 kB | 7.71 kB | ✓ |
Client Pages Modern
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| _app-75d3a82..dule.js gzip | 625 B | 625 B | ✓ |
| _error-4469a..dule.js gzip | 2.29 kB | 2.29 kB | ✓ |
| hooks-cbf13f..dule.js gzip | 387 B | 387 B | ✓ |
| index-b9a643..dule.js gzip | 226 B | 226 B | ✓ |
| link-f8c0daf..dule.js gzip | 1.26 kB | 1.26 kB | ✓ |
| routerDirect..dule.js gzip | 284 B | 284 B | ✓ |
| withRouter-f..dule.js gzip | 282 B | 282 B | ✓ |
| Overall change | 5.36 kB | 5.36 kB | ✓ |
Client Build Manifests
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 322 B | 322 B | ✓ |
| _buildManife..dule.js gzip | 329 B | 329 B | ✓ |
| Overall change | 651 B | 651 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| index.html gzip | 1 kB | 1 kB | ✓ |
| link.html gzip | 1.01 kB | 1.01 kB | ✓ |
| withRouter.html gzip | 996 B | 996 B | ✓ |
| Overall change | 3.01 kB | 3.01 kB | ✓ |
Serverless Mode (Increase detected ⚠️ )
General Overall increase ⚠️
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| buildDuration | 14.8s | 14.5s | -300ms |
| nodeModulesSize | 63.1 MB | 63.1 MB |
Client Bundles (main, webpack, commons)
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| 677f882d2ed8..9339.js gzip | 10.9 kB | 10.9 kB | ✓ |
| framework.HASH.js gzip | 39 kB | 39 kB | ✓ |
| main-d493e7d..42f5.js gzip | 7.17 kB | 7.17 kB | ✓ |
| webpack-e067..f178.js gzip | 751 B | 751 B | ✓ |
| Overall change | 57.8 kB | 57.8 kB | ✓ |
Client Bundles (main, webpack, commons) Modern
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| 677f882d2ed8..dule.js gzip | 6.77 kB | 6.77 kB | ✓ |
| framework.HA..dule.js gzip | 39 kB | 39 kB | ✓ |
| main-f8905d4..dule.js gzip | 6.24 kB | 6.24 kB | ✓ |
| webpack-07c5..dule.js gzip | 751 B | 751 B | ✓ |
| Overall change | 52.7 kB | 52.7 kB | ✓ |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| polyfills-4b..e242.js gzip | 31 kB | 31 kB | ✓ |
| Overall change | 31 kB | 31 kB | ✓ |
Client Pages
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| _app-9a0b9e1..b37e.js gzip | 1.28 kB | 1.28 kB | ✓ |
| _error-ed1b0..8fbd.js gzip | 3.44 kB | 3.44 kB | ✓ |
| hooks-89731c..c609.js gzip | 887 B | 887 B | ✓ |
| index-17468f..5d83.js gzip | 227 B | 227 B | ✓ |
| link-d2344ce..8b36.js gzip | 1.3 kB | 1.3 kB | ✓ |
| routerDirect..924c.js gzip | 284 B | 284 B | ✓ |
| withRouter-7..c13d.js gzip | 284 B | 284 B | ✓ |
| Overall change | 7.71 kB | 7.71 kB | ✓ |
Client Pages Modern
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| _app-75d3a82..dule.js gzip | 625 B | 625 B | ✓ |
| _error-4469a..dule.js gzip | 2.29 kB | 2.29 kB | ✓ |
| hooks-cbf13f..dule.js gzip | 387 B | 387 B | ✓ |
| index-b9a643..dule.js gzip | 226 B | 226 B | ✓ |
| link-f8c0daf..dule.js gzip | 1.26 kB | 1.26 kB | ✓ |
| routerDirect..dule.js gzip | 284 B | 284 B | ✓ |
| withRouter-f..dule.js gzip | 282 B | 282 B | ✓ |
| Overall change | 5.36 kB | 5.36 kB | ✓ |
Client Build Manifests
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 322 B | 322 B | ✓ |
| _buildManife..dule.js gzip | 329 B | 329 B | ✓ |
| Overall change | 651 B | 651 B | ✓ |
Serverless bundles Overall increase ⚠️
| vercel/next.js canary | mhhegazy/next.js app-tree | Change | |
|---|---|---|---|
| _error.js | 1.05 MB | 1.05 MB | |
| 404.html | 4.34 kB | 4.34 kB | ✓ |
| hooks.html | 3.92 kB | 3.92 kB | ✓ |
| index.js | 1.05 MB | 1.05 MB | |
| link.js | 1.1 MB | 1.1 MB | |
| routerDirect.js | 1.09 MB | 1.09 MB | |
| withRouter.js | 1.09 MB | 1.09 MB | |
| Overall change | 5.4 MB | 5.4 MB |
|
@mhhegazy On the |
let appProps = {};
if (WrappedApp.getInitialProps) {
appProps = await WrappedApp.getInitialProps(appContext);
}the full code of working example that use this pull request is next-apollo-client-ssr-example |
|
@lcswillems did you test it? |
|
@mhhegazy I have just tested your example but it is not obvious it solves the issues: example is too complicated for what it should be and doesn't show why there is not this issue anymore. Moreover, I think you should create a CodeSandBox as I did in my issue because it is much easier to test and verify it is correct. |
timneutkens
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This does not fix #9336 given that it affects client-side navigation only. Besides that AppTree is meant to not be changed based on properties as is introduced here so I'll close this PR.
You'll want to look into client/index.tsx's wrapApp function which is where the actual issue will likely be.
Proplem
All withApollo HOC examples and code dosn't work if we use
AppTreeand if we useComponentwe don't get the right contextApollo client context is singleton (single Apollo context is created and tracked in global state).
and when we use more then one
ApolloProviderwe overide client instance with most innerApolloProviderclientSo when we create HOC APP to get
apolloClientinitial cache state by usinggetDataFromTreeby using server sideapolloClientand then extract cache like thison first render in
getDataFromTreeon servergetInitialPropstheapolloClientis not used.. the second client inWithApolloComponent will overide it so when extract cacheapolloClient.cache.extract()we get empty result because we extract overwritten clientSolution
AppTreeprovided in appContext meant to provide right context (router, head manager, amp, ...)And for HOC we have app that we want to wrap in this contexts, so we should be able to provide app to wrap.
So we can have one ApolloContext in first Render
To fix example in problem we do this in
getInitialProps:then we have only one
ApolloProvideron first render and there is no inner one that overwrite itworking example:
next-apollo-client-ssr-example
to try it:
fixes #9336
Related issue #10126
Related pull request #7732