ssrManifestPlugin.ts — vite Source File
Architecture documentation for ssrManifestPlugin.ts, a typescript file in the vite codebase. 14 imports, 1 dependents.
Entity Profile
Dependency Diagram
graph LR d870e4f6_b530_af0a_b088_f62f5217c8d2["ssrManifestPlugin.ts"] 5abb8c87_ffcb_f2d4_7421_e36705d9e5c7["plugin.ts"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> 5abb8c87_ffcb_f2d4_7421_e36705d9e5c7 1dc2cf7d_5d97_c778_8c33_6449a7607aef["Plugin"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> 1dc2cf7d_5d97_c778_8c33_6449a7607aef 04ad4685_2ce3_556a_152b_c93668a74b3b["importAnalysisBuild.ts"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> 04ad4685_2ce3_556a_152b_c93668a74b3b 031bc221_67a8_c579_f2bf_bb30a08beeb2["utils.ts"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> 031bc221_67a8_c579_f2bf_bb30a08beeb2 310ed049_c1b4_c917_b399_81bab290e5a2["generateCodeFrame"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> 310ed049_c1b4_c917_b399_81bab290e5a2 c9db8630_93b3_267d_8e26_8b62626a11ca["joinUrlSegments"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> c9db8630_93b3_267d_8e26_8b62626a11ca a4adb1a7_cf54_091f_eb63_8217e684a8e1["normalizePath"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> a4adb1a7_cf54_091f_eb63_8217e684a8e1 7e08b9a5_2650_5312_63d2_5971015349af["numberToPos"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> 7e08b9a5_2650_5312_63d2_5971015349af b8325ee3_313b_4bc2_ecfd_3e3b5441a5f3["sortObjectKeys"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> b8325ee3_313b_4bc2_ecfd_3e3b5441a5f3 0c33ff62_54e9_5c90_902b_b26728e71fca["environment.ts"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> 0c33ff62_54e9_5c90_902b_b26728e71fca 16a00926_f0e9_60f1_3006_9132a6d78745["perEnvironmentState"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> 16a00926_f0e9_60f1_3006_9132a6d78745 51e96894_3556_ed5c_1ede_97d449867adf["node:path"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> 51e96894_3556_ed5c_1ede_97d449867adf de89267c_fa10_663d_9911_671e0929ea1b["es-module-lexer"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> de89267c_fa10_663d_9911_671e0929ea1b 693ca867_249b_3e5a_0ce1_8930413b7fcd["rolldown"] d870e4f6_b530_af0a_b088_f62f5217c8d2 --> 693ca867_249b_3e5a_0ce1_8930413b7fcd style d870e4f6_b530_af0a_b088_f62f5217c8d2 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
import { basename, dirname, join, relative } from 'node:path'
import { parse as parseImports } from 'es-module-lexer'
import type {
ParseError as EsModuleLexerParseError,
ImportSpecifier,
} from 'es-module-lexer'
import type { OutputChunk } from 'rolldown'
import type { Plugin } from '../plugin'
import { preloadMethod } from '../plugins/importAnalysisBuild'
import {
generateCodeFrame,
joinUrlSegments,
normalizePath,
numberToPos,
sortObjectKeys,
} from '../utils'
import { perEnvironmentState } from '../environment'
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
}
}
}
}
}
this.emitFile({
fileName:
typeof config.build.ssrManifest === 'string'
? config.build.ssrManifest
: '.vite/ssr-manifest.json',
type: 'asset',
source: JSON.stringify(sortObjectKeys(ssrManifest), undefined, 2),
})
},
}
}
Domain
Subdomains
Functions
Dependencies
Imported By
Source
Frequently Asked Questions
What does ssrManifestPlugin.ts do?
ssrManifestPlugin.ts is a source file in the vite codebase, written in typescript. It belongs to the ViteCore domain, ConfigEngine subdomain.
What functions are defined in ssrManifestPlugin.ts?
ssrManifestPlugin.ts defines 1 function(s): ssrManifestPlugin.
What does ssrManifestPlugin.ts depend on?
ssrManifestPlugin.ts imports 14 module(s): Plugin, environment.ts, es-module-lexer, generateCodeFrame, importAnalysisBuild.ts, joinUrlSegments, node:path, normalizePath, and 6 more.
What files import ssrManifestPlugin.ts?
ssrManifestPlugin.ts is imported by 1 file(s): build.ts.
Where is ssrManifestPlugin.ts in the architecture?
ssrManifestPlugin.ts is located at packages/vite/src/node/ssr/ssrManifestPlugin.ts (domain: ViteCore, subdomain: ConfigEngine, directory: packages/vite/src/node/ssr).
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free