295f9da393
## Feature Change server components convention from using `.server.js` / `.client.js` file extension to determine it's a server or client component to using `'client'` js literal as a directive for determine client components boundary. React RFC: https://github.com/reactjs/rfcs/pull/189 New behavior doesn't consume `.server.js` as server components any more, if you're enabling `serverComponents` flag, every `page.js` in app dir will become server components by default. If you adding a `'client'` directive to the page, then that page will become a client component. This rule also applies to the normal js components, client components will require a `'client'` directive to indicate its identity, instead of having a `.client.js` extension. - [x] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [x] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have helpful link attached, see `contributing.md` Co-authored-by: Shu Ding <3676859+shuding@users.noreply.github.com>
39 lines
1 KiB
TypeScript
39 lines
1 KiB
TypeScript
import { stringifyRequest } from '../stringify-request'
|
|
|
|
export type ClientPagesLoaderOptions = {
|
|
absolutePagePath: string
|
|
page: string
|
|
}
|
|
|
|
// this parameter: https://www.typescriptlang.org/docs/handbook/functions.html#this-parameters
|
|
function nextClientPagesLoader(this: any) {
|
|
const pagesLoaderSpan = this.currentTraceSpan.traceChild(
|
|
'next-client-pages-loader'
|
|
)
|
|
|
|
return pagesLoaderSpan.traceFn(() => {
|
|
const { absolutePagePath, page } =
|
|
this.getOptions() as ClientPagesLoaderOptions
|
|
|
|
pagesLoaderSpan.setAttribute('absolutePagePath', absolutePagePath)
|
|
|
|
const stringifiedPageRequest = stringifyRequest(this, absolutePagePath)
|
|
const stringifiedPage = JSON.stringify(page)
|
|
|
|
return `
|
|
(window.__NEXT_P = window.__NEXT_P || []).push([
|
|
${stringifiedPage},
|
|
function () {
|
|
return require(${stringifiedPageRequest});
|
|
}
|
|
]);
|
|
if(module.hot) {
|
|
module.hot.dispose(function () {
|
|
window.__NEXT_P.push([${stringifiedPage}])
|
|
});
|
|
}
|
|
`
|
|
})
|
|
}
|
|
|
|
export default nextClientPagesLoader
|