Skip to content

Commit 06f3fd2

Browse files
authored
Merge pull request #15820 from ethereum/raw-file-optimization
Raw files load optimization
2 parents 1642396 + 9c45454 commit 06f3fd2

File tree

9 files changed

+81
-44
lines changed

9 files changed

+81
-44
lines changed

.eslintrc.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
"coverage/",
9191
"storybook-static/",
9292
"**/*.d.ts",
93-
"src/intl/"
93+
"src/intl/",
94+
"public/code-examples/"
9495
]
9596
}

app/[locale]/page.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ import { getMetadata } from "@/lib/utils/metadata"
6767
import { polishRSSList } from "@/lib/utils/rss"
6868

6969
import events from "@/data/community-events.json"
70-
import CreateWalletContent from "@/data/CreateWallet"
7170

7271
import {
7372
ATTESTANT_BLOG,
@@ -84,9 +83,6 @@ import {
8483
import TenYearHomeBanner from "./10years/_components/TenYearHomeBanner"
8584
import { getActivity } from "./utils"
8685

87-
import SimpleDomainRegistryContent from "!!raw-loader!@/data/SimpleDomainRegistry.sol"
88-
import SimpleTokenContent from "!!raw-loader!@/data/SimpleToken.sol"
89-
import SimpleWalletContent from "!!raw-loader!@/data/SimpleWallet.sol"
9086
import { routing } from "@/i18n/routing"
9187
import { fetchCommunityEvents } from "@/lib/api/calendarEvents"
9288
import { fetchEthPrice } from "@/lib/api/fetchEthPrice"
@@ -341,28 +337,28 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => {
341337
title: t("page-index-developers-code-example-title-0"),
342338
description: t("page-index-developers-code-example-description-0"),
343339
codeLanguage: "language-solidity",
344-
code: SimpleWalletContent,
340+
codeUrl: "/code-examples/SimpleWallet.sol",
345341
eventName: "bank",
346342
},
347343
{
348344
title: t("page-index-developers-code-example-title-1"),
349345
description: t("page-index-developers-code-example-description-1"),
350346
codeLanguage: "language-solidity",
351-
code: SimpleTokenContent,
347+
codeUrl: "/code-examples/SimpleToken.sol",
352348
eventName: "token",
353349
},
354350
{
355351
title: t("page-index-developers-code-example-title-2"),
356352
description: t("page-index-developers-code-example-description-2"),
357353
codeLanguage: "language-javascript",
358-
code: CreateWalletContent,
354+
codeUrl: "/code-examples/CreateWallet.js",
359355
eventName: "wallet",
360356
},
361357
{
362358
title: t("page-index-developers-code-example-title-3"),
363359
description: t("page-index-developers-code-example-description-3"),
364360
codeLanguage: "language-solidity",
365-
code: SimpleDomainRegistryContent,
361+
codeUrl: "/code-examples/SimpleDomainRegistry.sol",
366362
eventName: "dns",
367363
},
368364
]

src/data/CreateWallet.ts renamed to public/code-examples/CreateWallet.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const createWallet = `const ethers = require("ethers")
1+
const ethers = require("ethers")
22

33
// Create a wallet instance from a mnemonic...
44
const mnemonic =
@@ -46,6 +46,3 @@ wallet.sendTransaction(tx)
4646
// https://github.com/ethers-io/ethers.js/blob/master/docs/v5/api/signer/README.md#methods
4747
// Content is licensed under the Creative Commons License:
4848
// https://choosealicense.com/licenses/cc-by-4.0/
49-
`
50-
51-
export default createWallet
File renamed without changes.
File renamed without changes.

src/components/CodeModal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type CodeModalProps = {
2323
const CodeModal = ({ children, isOpen, setIsOpen, title }: CodeModalProps) => {
2424
const { t } = useTranslation()
2525
const codeSnippet = (Children.toArray(children)[0] as ReactElement).props
26-
.children.props.children
26+
.children
2727

2828
const { onCopy, hasCopied } = useClipboard()
2929

src/components/Homepage/CodeExamples.tsx

Lines changed: 72 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use client"
22

3-
import { Suspense, useState } from "react"
3+
import { useCallback, useEffect, useState } from "react"
44
import { Clipboard, ClipboardCheck } from "lucide-react"
55
import { useLocale } from "next-intl"
66

@@ -29,17 +29,64 @@ type CodeExamplesProps = {
2929
eventCategory: string
3030
}
3131

32+
const AccordionCodeBlock = ({
33+
code,
34+
codeLanguage,
35+
}: {
36+
code: string
37+
codeLanguage: string
38+
}) => (
39+
<>
40+
<Codeblock
41+
codeLanguage={codeLanguage}
42+
allowCollapse={false}
43+
className="[&>div]:-m-//2 [&>div]:rounded-none [&_*]:!text-xs [&_pre]:p-4"
44+
fromHomepage
45+
>
46+
{code}
47+
</Codeblock>
48+
<CopyToClipboard
49+
text={code ?? ""}
50+
className="absolute end-2 top-2 rounded p-2 hover:bg-primary/10 hover:text-primary"
51+
>
52+
{(hasCopied) => (hasCopied ? <ClipboardCheck /> : <Clipboard />)}
53+
</CopyToClipboard>
54+
</>
55+
)
56+
3257
const CodeExamples = ({ title, codeExamples }: CodeExamplesProps) => {
3358
const locale = useLocale()
3459

3560
const [isModalOpen, setModalOpen] = useState(false)
3661
const [activeCode, setActiveCode] = useState(0)
62+
const [fetchedCodes, setFetchedCodes] = useState<{ [key: number]: string }>(
63+
{}
64+
)
3765

3866
const eventCategory = `Homepage - ${locale}`
3967

40-
const toggleCodeExample = (id: number): void => {
41-
setActiveCode(id)
42-
setModalOpen(true)
68+
const getCode = useCallback(
69+
(idx: number) => {
70+
const example = codeExamples[idx]
71+
if (!fetchedCodes[idx]) {
72+
fetch(example.codeUrl)
73+
.then((res) => res.text())
74+
.then((text) => setFetchedCodes((prev) => ({ ...prev, [idx]: text })))
75+
}
76+
},
77+
[codeExamples, fetchedCodes]
78+
)
79+
80+
// For modal: fetch code when opened if needed
81+
useEffect(() => {
82+
if (isModalOpen) {
83+
getCode(activeCode)
84+
}
85+
}, [isModalOpen, activeCode, getCode])
86+
87+
// For accordion: fetch code when expanded if needed
88+
const handleAccordionOpen = (idx: number) => {
89+
getCode(idx)
4390
}
4491

4592
return (
@@ -54,7 +101,8 @@ const CodeExamples = ({ title, codeExamples }: CodeExamplesProps) => {
54101
isModalOpen && idx === activeCode && "bg-background-highlight"
55102
)}
56103
onClick={() => {
57-
toggleCodeExample(idx)
104+
setActiveCode(idx)
105+
setModalOpen(true)
58106
trackCustomEvent({
59107
eventCategory,
60108
eventAction: "Code Examples",
@@ -68,9 +116,12 @@ const CodeExamples = ({ title, codeExamples }: CodeExamplesProps) => {
68116
))}
69117
{/* Mobile */}
70118
<Accordion type="single" collapsible className="md:hidden">
71-
{codeExamples.map(({ title, description, code, codeLanguage }) => (
119+
{codeExamples.map(({ title, description, codeLanguage }, idx) => (
72120
<AccordionItem key={title} value={title} className="relative">
73-
<AccordionTrigger className="flex border-t px-6 py-4 hover:bg-background-highlight">
121+
<AccordionTrigger
122+
className="flex border-t px-6 py-4 hover:bg-background-highlight"
123+
onClick={() => handleAccordionOpen(idx)}
124+
>
74125
<div className="flex flex-col items-start gap-y-0.5">
75126
<p className="text-start text-md font-bold text-body">
76127
{title}
@@ -81,26 +132,16 @@ const CodeExamples = ({ title, codeExamples }: CodeExamplesProps) => {
81132
</div>
82133
</AccordionTrigger>
83134
<AccordionContent className="relative border-t" dir="ltr">
84-
<Suspense fallback={<SkeletonLines noOfLines={16} />}>
85-
<div className="-m-2 max-h-[50vh] overflow-auto">
86-
<Codeblock
135+
<div className="-m-2 max-h-[50vh] overflow-auto">
136+
{!fetchedCodes[idx] ? (
137+
<SkeletonLines noOfLines={16} />
138+
) : (
139+
<AccordionCodeBlock
140+
code={fetchedCodes[idx]}
87141
codeLanguage={codeLanguage}
88-
allowCollapse={false}
89-
className="[&>div]:-m-//2 [&>div]:rounded-none [&_*]:!text-xs [&_pre]:p-4"
90-
fromHomepage
91-
>
92-
{code}
93-
</Codeblock>
94-
<CopyToClipboard
95-
text={code}
96-
className="absolute end-2 top-2 rounded p-2 hover:bg-primary/10 hover:text-primary"
97-
>
98-
{(hasCopied) =>
99-
hasCopied ? <ClipboardCheck /> : <Clipboard />
100-
}
101-
</CopyToClipboard>
102-
</div>
103-
</Suspense>
142+
/>
143+
)}
144+
</div>
104145
</AccordionContent>
105146
</AccordionItem>
106147
))}
@@ -112,16 +153,18 @@ const CodeExamples = ({ title, codeExamples }: CodeExamplesProps) => {
112153
setIsOpen={setModalOpen}
113154
title={codeExamples[activeCode].title}
114155
>
115-
<Suspense fallback={<SkeletonLines noOfLines={16} dir="ltr" />}>
156+
{!fetchedCodes[activeCode] ? (
157+
<SkeletonLines noOfLines={16} />
158+
) : (
116159
<Codeblock
117160
codeLanguage={codeExamples[activeCode].codeLanguage}
118161
allowCollapse={false}
119162
className="[&_pre]:p-6"
120163
fromHomepage
121164
>
122-
{codeExamples[activeCode].code}
165+
{fetchedCodes[activeCode]}
123166
</Codeblock>
124-
</Suspense>
167+
)}
125168
</CodeModal>
126169
)}
127170
</div>

src/lib/interfaces.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,6 @@ export interface CodeExample {
174174
alt?: string
175175
id?: number
176176
codeLanguage: string
177-
code: string
177+
codeUrl: string
178178
eventName: string
179179
}

0 commit comments

Comments
 (0)