next.js/packages/next/src/server/app-render/create-component-styles-and-scripts.tsx
create-component-styles-and-scripts.tsx49 lines1.3 KB
import { interopDefault } from './interop-default'
import { getLinkAndScriptTags } from './get-css-inlined-link-tags'
import type { AppRenderContext } from './app-render'
import { getAssetQueryString } from './get-asset-query-string'
import { encodeURIPath } from '../../shared/lib/encode-uri-path'
import { renderCssResource } from './render-css-resource'

export async function createComponentStylesAndScripts({
  filePath,
  getComponent,
  injectedCSS,
  injectedJS,
  ctx,
}: {
  filePath: string
  getComponent: () => any
  injectedCSS: Set<string>
  injectedJS: Set<string>
  ctx: AppRenderContext
}): Promise<[React.ComponentType<any>, React.ReactNode, React.ReactNode]> {
  const {
    componentMod: { createElement },
  } = ctx
  const { styles: entryCssFiles, scripts: jsHrefs } = getLinkAndScriptTags(
    filePath,
    injectedCSS,
    injectedJS
  )

  const styles = renderCssResource(entryCssFiles, ctx)

  const scripts: React.ReactNode[] = []
  let scriptIndex = 0
  for (const href of jsHrefs) {
    scripts.push(
      createElement('script', {
        src: `${ctx.assetPrefix}/_next/${encodeURIPath(href)}${getAssetQueryString(ctx, true)}`,
        async: true,
        key: `script-${scriptIndex}`,
      })
    )
    scriptIndex++
  }

  const Comp = interopDefault(await getComponent())

  return [Comp, styles, scripts.length ? scripts : null]
}
Quest for Codev2.0.0
/
SIGN IN