Home / Function/ ssrManifestPlugin() — vite Function Reference

ssrManifestPlugin() — vite Function Reference

Architecture documentation for the ssrManifestPlugin() function in ssrManifestPlugin.ts from the vite codebase.

Entity Profile

Dependency Diagram

graph TD
  d5b72255_236c_e62d_9524_5d6892ba1d7f["ssrManifestPlugin()"]
  d870e4f6_b530_af0a_b088_f62f5217c8d2["ssrManifestPlugin.ts"]
  d5b72255_236c_e62d_9524_5d6892ba1d7f -->|defined in| d870e4f6_b530_af0a_b088_f62f5217c8d2
  8c4db194_5dfd_4391_cc9a_833655009196["resolveBuildPlugins()"]
  8c4db194_5dfd_4391_cc9a_833655009196 -->|calls| d5b72255_236c_e62d_9524_5d6892ba1d7f
  16a00926_f0e9_60f1_3006_9132a6d78745["perEnvironmentState()"]
  d5b72255_236c_e62d_9524_5d6892ba1d7f -->|calls| 16a00926_f0e9_60f1_3006_9132a6d78745
  a4adb1a7_cf54_091f_eb63_8217e684a8e1["normalizePath()"]
  d5b72255_236c_e62d_9524_5d6892ba1d7f -->|calls| a4adb1a7_cf54_091f_eb63_8217e684a8e1
  c9db8630_93b3_267d_8e26_8b62626a11ca["joinUrlSegments()"]
  d5b72255_236c_e62d_9524_5d6892ba1d7f -->|calls| c9db8630_93b3_267d_8e26_8b62626a11ca
  7e08b9a5_2650_5312_63d2_5971015349af["numberToPos()"]
  d5b72255_236c_e62d_9524_5d6892ba1d7f -->|calls| 7e08b9a5_2650_5312_63d2_5971015349af
  310ed049_c1b4_c917_b399_81bab290e5a2["generateCodeFrame()"]
  d5b72255_236c_e62d_9524_5d6892ba1d7f -->|calls| 310ed049_c1b4_c917_b399_81bab290e5a2
  b8325ee3_313b_4bc2_ecfd_3e3b5441a5f3["sortObjectKeys()"]
  d5b72255_236c_e62d_9524_5d6892ba1d7f -->|calls| b8325ee3_313b_4bc2_ecfd_3e3b5441a5f3
  style d5b72255_236c_e62d_9524_5d6892ba1d7f fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

packages/vite/src/node/ssr/ssrManifestPlugin.ts lines 19–116

export function ssrManifestPlugin(): Plugin {
  // module id => preload assets mapping
  const getSsrManifest = perEnvironmentState(() => {
    return {} as Record<string, string[]>
  })

  return {
    name: 'vite:ssr-manifest',

    applyToEnvironment(environment) {
      return !!environment.config.build.ssrManifest
    },

    generateBundle(_options, bundle) {
      const config = this.environment.config
      const ssrManifest = getSsrManifest(this)
      const { base } = config
      for (const file in bundle) {
        const chunk = bundle[file]
        if (chunk.type === 'chunk') {
          for (const id in chunk.modules) {
            const normalizedId = normalizePath(relative(config.root, id))
            const mappedChunks =
              ssrManifest[normalizedId] ?? (ssrManifest[normalizedId] = [])
            if (!chunk.isEntry) {
              mappedChunks.push(joinUrlSegments(base, chunk.fileName))
              // <link> tags for entry chunks are already generated in static HTML,
              // so we only need to record info for non-entry chunks.
              chunk.viteMetadata!.importedCss.forEach((file) => {
                mappedChunks.push(joinUrlSegments(base, file))
              })
            }
            chunk.viteMetadata!.importedAssets.forEach((file) => {
              mappedChunks.push(joinUrlSegments(base, file))
            })
          }
          if (chunk.code.includes(preloadMethod)) {
            // generate css deps map
            const code = chunk.code
            let imports: ImportSpecifier[] = []
            try {
              imports = parseImports(code)[0].filter((i) => i.n && i.d > -1)
            } catch (_e: unknown) {
              const e = _e as EsModuleLexerParseError
              const loc = numberToPos(code, e.idx)
              this.error({
                name: e.name,
                message: e.message,
                stack: e.stack,
                cause: e.cause,
                pos: e.idx,
                loc: { ...loc, file: chunk.fileName },
                frame: generateCodeFrame(code, loc),
              })
            }
            if (imports.length) {
              for (let index = 0; index < imports.length; index++) {
                const { s: start, e: end, n: name } = imports[index]
                // check the chunk being imported
                const url = code.slice(start, end)
                const deps: string[] = []
                const ownerFilename = chunk.fileName
                // literal import - trace direct imports and add to deps
                const analyzed: Set<string> = new Set<string>()
                const addDeps = (filename: string) => {
                  if (filename === ownerFilename) return
                  if (analyzed.has(filename)) return
                  analyzed.add(filename)
                  const chunk = bundle[filename] as OutputChunk | undefined
                  if (chunk) {
                    chunk.viteMetadata!.importedCss.forEach((file) => {
                      deps.push(joinUrlSegments(base, file))
                    })
                    chunk.imports.forEach(addDeps)
                  }
                }
                const normalizedFile = normalizePath(
                  join(dirname(chunk.fileName), url.slice(1, -1)),
                )
                addDeps(normalizedFile)
                ssrManifest[basename(name!)] = deps

Domain

Subdomains

Frequently Asked Questions

What does ssrManifestPlugin() do?
ssrManifestPlugin() is a function in the vite codebase, defined in packages/vite/src/node/ssr/ssrManifestPlugin.ts.
Where is ssrManifestPlugin() defined?
ssrManifestPlugin() is defined in packages/vite/src/node/ssr/ssrManifestPlugin.ts at line 19.
What does ssrManifestPlugin() call?
ssrManifestPlugin() calls 6 function(s): generateCodeFrame, joinUrlSegments, normalizePath, numberToPos, perEnvironmentState, sortObjectKeys.
What calls ssrManifestPlugin()?
ssrManifestPlugin() is called by 1 function(s): resolveBuildPlugins.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free