Skip to content

Commit f6c2c3f

Browse files
committed
feat: code splitting step
1 parent 5f09093 commit f6c2c3f

15 files changed

+102
-18
lines changed

src/challenges/step-08-code-splitting.js

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const CodeSplittingChallenge = () => {
2+
return <></>
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
export const DetailedHelpBox = () => {
2+
return (
3+
<div style={{ height: '100px', overflowY: 'auto', padding: '10px' }}>
4+
<p>
5+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc porta
6+
ultricies tincidunt. Vivamus volutpat tincidunt metus, vel pellentesque
7+
orci fringilla ac. Sed tempor, augue at tristique posuere, ligula nibh
8+
elementum nisi, sed rhoncus nunc mauris vel erat. Curabitur facilisis
9+
ligula a orci mollis consequat. Curabitur vel lectus scelerisque,
10+
imperdiet augue fermentum, ultricies eros. Nam porta dui at tempor
11+
fringilla. Nunc maximus blandit arcu eu rutrum. Nunc in ligula
12+
vestibulum lacus facilisis finibus vel eget justo. Maecenas at augue at
13+
ligula sodales eleifend. Nunc non nibh sed tortor condimentum
14+
sollicitudin. Vivamus efficitur, felis in iaculis vehicula, purus elit
15+
rhoncus quam, in scelerisque leo nisl vitae massa. Nulla pellentesque
16+
fermentum lacinia. Ut pretium eros vitae erat commodo, sit amet semper
17+
sem porttitor. Maecenas a est bibendum, pulvinar purus eget, semper
18+
lorem. Donec ut erat rutrum, suscipit est et, elementum massa.
19+
</p>
20+
<p>
21+
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
22+
inceptos himenaeos. Nam tortor sapien, sodales vel diam at, vehicula
23+
varius lectus. Morbi ut nulla at odio dictum consequat eget id mauris.
24+
Proin sit amet lectus diam. Pellentesque habitant morbi tristique
25+
senectus et netus et malesuada fames ac turpis egestas. Nunc erat
26+
ligula, mattis eu dignissim sed, vulputate a metus. Orci varius natoque
27+
penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed
28+
dignissim fringilla augue, eget tincidunt leo tempor vel. Morbi et nunc
29+
hendrerit, tempus risus sed, consequat mi. Phasellus tellus enim,
30+
sagittis a diam id, pulvinar ullamcorper risus.
31+
</p>
32+
<p>
33+
Mauris feugiat arcu sed elit vestibulum, quis luctus augue tempus.
34+
Suspendisse quis maximus dui. Praesent nec lobortis libero. Sed
35+
fermentum ornare vestibulum. Quisque aliquam id urna eget viverra.
36+
Praesent eget gravida dui. Sed id eros et sem facilisis elementum at in
37+
mauris.
38+
</p>
39+
<p>
40+
Integer convallis rutrum dolor sit amet consectetur. Sed feugiat urna
41+
vel tristique ornare. Pellentesque at urna vel ex lobortis auctor. Duis
42+
consectetur enim eu orci suscipit ornare. Integer pellentesque est sed
43+
neque blandit, vel semper purus feugiat. Pellentesque lobortis augue
44+
elit, in imperdiet odio sagittis vitae. Cras ultricies faucibus urna eu
45+
mattis. Fusce tincidunt lorem ut pulvinar commodo. Mauris eget elementum
46+
sapien. Curabitur fringilla fringilla efficitur. Nunc tincidunt dui at
47+
varius accumsan. Cras ut convallis felis. Sed pharetra rutrum sem, eget
48+
mattis dui aliquam in. Integer ut turpis a eros eleifend imperdiet eu
49+
non mi. In vitae ligula et mauris mattis eleifend. Vestibulum sit amet
50+
lobortis eros, sed cursus est. Phasellus nisl arcu, facilisis eget nisi
51+
non, hendrerit volutpat lorem. Ut vel libero vitae lorem auctor sodales.
52+
</p>
53+
</div>
54+
)
55+
}
56+
57+
export default DetailedHelpBox

src/pages/solutions/step-01-server-state.jsx

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { useFilterStateChallenge } from '../../challenges/step-02-context/useFil
55
import { useMovieQuerySolution } from '../../solutions/step-01-server-state/useMovieQuerySolution.js'
66
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge.js'
77
import { FilterFormFinalChallenge } from '../../challenges/step-12-third-party-libs/FilterFormFinalChallenge'
8+
import { CodeSplittingSolution } from '../../solutions/step-08-code-splitting/CodeSplitttingSolution.js'
9+
import { CodeSplittingChallenge } from '../../challenges/step-08-code-splitting/CodeSplittingChallenge'
810

911
const MovieListContainer = () => {
1012
const filterState = useFilterStateChallenge()
@@ -23,6 +25,7 @@ const Step01ServerState = () => {
2325
<FilterStateProviderChallenge>
2426
<FilterModalChallenge>
2527
<FilterFormFinalChallenge />
28+
<CodeSplittingChallenge />
2629
</FilterModalChallenge>
2730
<MovieListContainer />
2831
</FilterStateProviderChallenge>

src/pages/solutions/step-02-context.jsx

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { MovieList } from '../../components/MovieList/MovieList.jsx'
77
import { ErrorBoundaryChallenge } from '../../challenges/step-04-error-boundaries/ErrorBoundaryChallenge'
88
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge.js'
99
import { FilterFormFinalChallenge } from '../../challenges/step-12-third-party-libs/FilterFormFinalChallenge.js'
10+
import { CodeSplittingSolution } from '../../solutions/step-08-code-splitting/CodeSplitttingSolution.js'
11+
import { CodeSplittingChallenge } from '../../challenges/step-08-code-splitting/CodeSplittingChallenge.js'
1012

1113
const MovieListContainer = () => {
1214
const filterState = useFilterStateSolution()
@@ -25,6 +27,7 @@ const Step02Context = () => {
2527
<FilterStateProviderSolution>
2628
<FilterModalChallenge>
2729
<FilterFormFinalChallenge />
30+
<CodeSplittingChallenge />
2831
</FilterModalChallenge>
2932
<MovieListContainer />
3033
</FilterStateProviderSolution>

src/pages/solutions/step-03-uncontrolled-components.jsx

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { FilterFormSolution } from '../../solutions/step-03-uncontrolled-compone
77
import { MovieList } from '../../components/MovieList/MovieList'
88
import { ErrorBoundaryChallenge } from '../../challenges/step-04-error-boundaries/ErrorBoundaryChallenge'
99
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge.js'
10+
import { CodeSplittingChallenge } from '../../challenges/step-08-code-splitting/CodeSplittingChallenge.js'
1011

1112
const MovieListContainer = () => {
1213
const filterState = useFilterStateSolution()
@@ -25,6 +26,7 @@ const Step03UncontrolledComponents = () => {
2526
<FilterStateProviderSolution>
2627
<FilterModalChallenge>
2728
<FilterFormSolution />
29+
<CodeSplittingChallenge />
2830
</FilterModalChallenge>
2931
<MovieListContainer />
3032
</FilterStateProviderSolution>

src/pages/solutions/step-04-error-boundaries.jsx

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { ErrorBoundarySolution } from '../../solutions/step-04-error-boundary/Er
88
import { useEffect } from 'react'
99
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge.js'
1010
import { FilterFormFinalChallenge } from '../../challenges/step-12-third-party-libs/FilterFormFinalChallenge'
11+
import { CodeSplittingChallenge } from '../../challenges/step-08-code-splitting/CodeSplittingChallenge.js'
1112

1213
const MovieListContainer = () => {
1314
const filterState = useFilterStateSolution()
@@ -30,6 +31,7 @@ const Step04ErrorBoundaries = () => {
3031
<FilterStateProviderSolution>
3132
<FilterModalChallenge>
3233
<FilterFormFinalChallenge />
34+
<CodeSplittingChallenge />
3335
</FilterModalChallenge>
3436
<MovieListContainer />
3537
</FilterStateProviderSolution>

src/pages/solutions/step-05-portals.jsx

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { ErrorBoundarySolution } from '../../solutions/step-04-error-boundary/Er
99
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge'
1010
import { FilterModalSolution } from '../../solutions/step-05-portals/FilterModalSolution'
1111
import { FilterFormFinalChallenge } from '../../challenges/step-12-third-party-libs/FilterFormFinalChallenge'
12+
import { CodeSplittingChallenge } from '../../challenges/step-08-code-splitting/CodeSplittingChallenge.js'
1213

1314
const MovieListContainer = () => {
1415
const filterState = useFilterStateSolution()
@@ -27,6 +28,7 @@ const Step05Portals = () => {
2728
<FilterStateProviderSolution>
2829
<FilterModalSolution>
2930
<FilterFormSolution />
31+
<CodeSplittingChallenge />
3032
</FilterModalSolution>
3133
<MovieListContainer />
3234
</FilterStateProviderSolution>

src/pages/solutions/step-06-forwarding-refs.jsx

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { MovieList } from '../../components/MovieList/MovieList'
77
import { ErrorBoundarySolution } from '../../solutions/step-04-error-boundary/ErrorBoundarySolution'
88
import { FilterModalSolution } from '../../solutions/step-05-portals/FilterModalSolution'
99
import { FilterFormWithStyledInputSolution } from '../../solutions/step-06-forwarding-refs/FilterFormWithStyledInputSolution'
10+
import { CodeSplittingChallenge } from '../../challenges/step-08-code-splitting/CodeSplittingChallenge.js'
1011

1112
const MovieListContainer = () => {
1213
const filterState = useFilterStateSolution()
@@ -25,6 +26,7 @@ const StepO6ForwardingRefs = () => {
2526
<FilterStateProviderSolution>
2627
<FilterModalSolution>
2728
<FilterFormWithStyledInputSolution />
29+
<CodeSplittingChallenge />
2830
</FilterModalSolution>
2931
<MovieListContainer />
3032
</FilterStateProviderSolution>

src/pages/solutions/step-07-refs-and-the-dom.jsx

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { MovieList } from '../../components/MovieList/MovieList'
77
import { ErrorBoundarySolution } from '../../solutions/step-04-error-boundary/ErrorBoundarySolution'
88
import { FilterFormWithAutofocusSolution } from '../../solutions/step-07-refs-and-the-dom/FilterFormWithAutofocusSolution.js'
99
import { FilterModalSolution } from '../../solutions/step-05-portals/FilterModalSolution'
10+
import { CodeSplittingChallenge } from '../../challenges/step-08-code-splitting/CodeSplittingChallenge.js'
1011

1112
const MovieListContainer = () => {
1213
const filterState = useFilterStateSolution()
@@ -25,6 +26,7 @@ const Step07RefsAndTheDom = () => {
2526
<FilterStateProviderSolution>
2627
<FilterModalSolution>
2728
<FilterFormWithAutofocusSolution />
29+
<CodeSplittingChallenge />
2830
</FilterModalSolution>
2931
<MovieListContainer />
3032
</FilterStateProviderSolution>

src/pages/solutions/step-08-code-splitting.jsx

+7-10
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,16 @@ import {
33
FilterStateProviderSolution,
44
useFilterStateSolution
55
} from '../../solutions/step-02-context/FilterStateContextSolution.jsx'
6-
import { FilterFormSolution } from '../../solutions/step-03-uncontrolled-components/FilterFormSolution'
76
import { MovieList } from '../../components/MovieList/MovieList'
87
import { ErrorBoundarySolution } from '../../solutions/step-04-error-boundary/ErrorBoundarySolution'
9-
import { useEffect } from 'react'
10-
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge.js'
8+
import { FilterFormWithAutofocusSolution } from '../../solutions/step-07-refs-and-the-dom/FilterFormWithAutofocusSolution'
9+
import { CodeSplittingSolution } from '../../solutions/step-08-code-splitting/CodeSplitttingSolution.js'
10+
import { FilterModalSolution } from '../../solutions/step-05-portals/FilterModalSolution'
1111

1212
const MovieListContainer = () => {
1313
const filterState = useFilterStateSolution()
1414
const movieQuery = useMovieQuerySolution(filterState)
1515

16-
useEffect(() => {
17-
throw new Error("I'm an error")
18-
}, [])
19-
2016
if (!movieQuery.data) {
2117
return null
2218
}
@@ -28,9 +24,10 @@ const Step08CodeSplitting = () => {
2824
return (
2925
<ErrorBoundarySolution>
3026
<FilterStateProviderSolution>
31-
<FilterModalChallenge>
32-
<FilterFormSolution />
33-
</FilterModalChallenge>
27+
<FilterModalSolution>
28+
<FilterFormWithAutofocusSolution />
29+
<CodeSplittingSolution />
30+
</FilterModalSolution>
3431
<MovieListContainer />
3532
</FilterStateProviderSolution>
3633
</ErrorBoundarySolution>

src/pages/solutions/step-09-list-virtualization.jsx

+2-4
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,12 @@ import { MovieList } from '../../components/MovieList/MovieList'
88
import { ErrorBoundarySolution } from '../../solutions/step-04-error-boundary/ErrorBoundarySolution'
99
import { useEffect } from 'react'
1010
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge.js'
11+
import { CodeSplittingSolution } from '../../solutions/step-08-code-splitting/CodeSplitttingSolution.js'
1112

1213
const MovieListContainer = () => {
1314
const filterState = useFilterStateSolution()
1415
const movieQuery = useMovieQuerySolution(filterState)
1516

16-
useEffect(() => {
17-
throw new Error("I'm an error")
18-
}, [])
19-
2017
if (!movieQuery.data) {
2118
return null
2219
}
@@ -30,6 +27,7 @@ const Step09ListVirtualization = () => {
3027
<FilterStateProviderSolution>
3128
<FilterModalChallenge>
3229
<FilterFormSolution />
30+
<CodeSplittingSolution />
3331
</FilterModalChallenge>
3432
<MovieListContainer />
3533
</FilterStateProviderSolution>

src/pages/solutions/step-10-usememo-usecallback-memo.jsx

+2-4
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,12 @@ import { MovieList } from '../../components/MovieList/MovieList'
88
import { ErrorBoundarySolution } from '../../solutions/step-04-error-boundary/ErrorBoundarySolution'
99
import { useEffect } from 'react'
1010
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge.js'
11+
import { CodeSplittingSolution } from '../../solutions/step-08-code-splitting/CodeSplitttingSolution.js'
1112

1213
const MovieListContainer = () => {
1314
const filterState = useFilterStateSolution()
1415
const movieQuery = useMovieQuerySolution(filterState)
1516

16-
useEffect(() => {
17-
throw new Error("I'm an error")
18-
}, [])
19-
2017
if (!movieQuery.data) {
2118
return null
2219
}
@@ -30,6 +27,7 @@ const Step10UseMemoUseCallbackMemo = () => {
3027
<FilterStateProviderSolution>
3128
<FilterModalChallenge>
3229
<FilterFormSolution />
30+
<CodeSplittingSolution />
3331
</FilterModalChallenge>
3432
<MovieListContainer />
3533
</FilterStateProviderSolution>

src/pages/solutions/step-11-ssr.jsx

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { MovieList } from '../../components/MovieList/MovieList'
88
import { ErrorBoundarySolution } from '../../solutions/step-04-error-boundary/ErrorBoundarySolution'
99
import { useEffect } from 'react'
1010
import { FilterModalChallenge } from '../../challenges/step-05-portals/FilterModalChallenge.js'
11+
import { CodeSplittingSolution } from '../../solutions/step-08-code-splitting/CodeSplitttingSolution.js'
1112

1213
const MovieListContainer = () => {
1314
const filterState = useFilterStateSolution()
@@ -30,6 +31,7 @@ const Step11Ssr = () => {
3031
<FilterStateProviderSolution>
3132
<FilterModalChallenge>
3233
<FilterFormSolution />
34+
<CodeSplittingSolution />
3335
</FilterModalChallenge>
3436
<MovieListContainer />
3537
</FilterStateProviderSolution>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import React, { Suspense } from 'react'
2+
3+
const HelpBox = React.lazy(() =>
4+
import('../../components/DetailedHelpBox/DetailedHelpBox')
5+
)
6+
7+
export const CodeSplittingSolution = () => {
8+
return (
9+
<Suspense fallback={<div>Loading...</div>}>
10+
<HelpBox />
11+
</Suspense>
12+
)
13+
}

0 commit comments

Comments
 (0)