mirror of
https://github.com/hanzoai/next.js.git
synced 2026-09-24 17:00:51 +00:00
Another step toward fixing #40025. Multiple `next/script` components with the same `src` may exist in the Next.js app. So the `loadScript` function will always attach the `onLoad` handler to the `loadingPromise` every time it executes. However, with strict mode (or wrapped inside the `<OffScreen />` component), the `useEffect` could execute more than once for the same `next/script` component, thus the `loadScript` for each `next/script` component could execute more than once (and `onLoad` to be attached more than once), results in `onLoad` fires more than once. The PR makes sure that for every `next/script` component mounted, the `loadScript` will always be executed only once for each of them. The corresponding `onload fires correctly` integration test case is also updated to run in dev mode. ## Bug - [x] Related issues linked using `fixes #number` - [x] Integration tests added - [ ] Errors have helpful link attached, see `contributing.md`
50 lines
1.1 KiB
JavaScript
50 lines
1.1 KiB
JavaScript
/* global _ */
|
|
import Script from 'next/script'
|
|
import Link from 'next/link'
|
|
|
|
const url =
|
|
'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js'
|
|
|
|
const Page = () => {
|
|
return (
|
|
<div class="container">
|
|
<div id="onload-div-1" />
|
|
<Link href="/page9">Page 9</Link>
|
|
<Script
|
|
src={url}
|
|
id="script1"
|
|
onLoad={() => {
|
|
document.getElementById('onload-div-1').textContent += _.repeat(
|
|
'a',
|
|
3
|
|
)
|
|
}}
|
|
></Script>
|
|
<Script
|
|
src={url}
|
|
id="script2"
|
|
onLoad={() => {
|
|
// eslint-disable-next-line no-undef
|
|
document.getElementById('onload-div-1').textContent += _.repeat(
|
|
'b',
|
|
3
|
|
)
|
|
}}
|
|
></Script>
|
|
<Script
|
|
src={url}
|
|
id="script3"
|
|
onLoad={() => {
|
|
// eslint-disable-next-line no-undef
|
|
document.getElementById('onload-div-1').textContent += _.repeat(
|
|
'c',
|
|
3
|
|
)
|
|
}}
|
|
></Script>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export default Page
|