indexHtmlMiddleware() — vite Function Reference
Architecture documentation for the indexHtmlMiddleware() function in indexHtml.ts from the vite codebase.
Entity Profile
Dependency Diagram
graph TD fc571085_3ab0_feca_5965_61c2be1d5c08["indexHtmlMiddleware()"] 3f56d5b2_9fca_532f_3bfc_6bfb2be77015["indexHtml.ts"] fc571085_3ab0_feca_5965_61c2be1d5c08 -->|defined in| 3f56d5b2_9fca_532f_3bfc_6bfb2be77015 5c50110b_5c76_c14f_b1dd_3efd3df7f375["preview()"] 5c50110b_5c76_c14f_b1dd_3efd3df7f375 -->|calls| fc571085_3ab0_feca_5965_61c2be1d5c08 24ecf2a1_3c09_d451_76f3_9485b4e993f8["_createServer()"] 24ecf2a1_3c09_d451_76f3_9485b4e993f8 -->|calls| fc571085_3ab0_feca_5965_61c2be1d5c08 40ede279_f539_5c9c_95c0_9686e55d8650["isDevServer()"] fc571085_3ab0_feca_5965_61c2be1d5c08 -->|calls| 40ede279_f539_5c9c_95c0_9686e55d8650 10b9dea8_362c_1af2_93be_afa4dd9aed9e["cleanUrl()"] fc571085_3ab0_feca_5965_61c2be1d5c08 -->|calls| 10b9dea8_362c_1af2_93be_afa4dd9aed9e 202ab9f4_58a5_311d_2d48_4d57ff3e4b5c["triggerBundleRegenerationIfStale()"] fc571085_3ab0_feca_5965_61c2be1d5c08 -->|calls| 202ab9f4_58a5_311d_2d48_4d57ff3e4b5c 95af623a_b371_82bb_94fc_ff6a88f1555c["generateFallbackHtml()"] fc571085_3ab0_feca_5965_61c2be1d5c08 -->|calls| 95af623a_b371_82bb_94fc_ff6a88f1555c 7c73fde5_2ada_95e2_0b3f_1ad78222da67["send()"] fc571085_3ab0_feca_5965_61c2be1d5c08 -->|calls| 7c73fde5_2ada_95e2_0b3f_1ad78222da67 2f0da199_9f02_5b00_9a83_0406650f871a["fsPathFromId()"] fc571085_3ab0_feca_5965_61c2be1d5c08 -->|calls| 2f0da199_9f02_5b00_9a83_0406650f871a a4adb1a7_cf54_091f_eb63_8217e684a8e1["normalizePath()"] fc571085_3ab0_feca_5965_61c2be1d5c08 -->|calls| a4adb1a7_cf54_091f_eb63_8217e684a8e1 dfa2b928_25a4_a78f_1e11_1e7e643cae09["resolve()"] fc571085_3ab0_feca_5965_61c2be1d5c08 -->|calls| dfa2b928_25a4_a78f_1e11_1e7e643cae09 fe25e7e9_e8e7_d04f_5c4c_9b4e6daa8350["checkLoadingAccess()"] fc571085_3ab0_feca_5965_61c2be1d5c08 -->|calls| fe25e7e9_e8e7_d04f_5c4c_9b4e6daa8350 f06a4729_72a9_90d9_1358_3db737d66a6e["respondWithAccessDenied()"] fc571085_3ab0_feca_5965_61c2be1d5c08 -->|calls| f06a4729_72a9_90d9_1358_3db737d66a6e d9d49dad_960b_4712_7c44_9345473c62e5["isParentDirectory()"] fc571085_3ab0_feca_5965_61c2be1d5c08 -->|calls| d9d49dad_960b_4712_7c44_9345473c62e5 style fc571085_3ab0_feca_5965_61c2be1d5c08 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
packages/vite/src/node/server/middlewares/indexHtml.ts lines 442–542
export function indexHtmlMiddleware(
root: string,
server: ViteDevServer | PreviewServer,
): Connect.NextHandleFunction {
const isDev = isDevServer(server)
const fullBundleEnv =
isDev && server.environments.client instanceof FullBundleDevEnvironment
? server.environments.client
: undefined
// Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...`
return async function viteIndexHtmlMiddleware(req, res, next) {
if (res.writableEnded) {
return next()
}
const url = req.url && cleanUrl(req.url)
// htmlFallbackMiddleware appends '.html' to URLs
if (url?.endsWith('.html') && req.headers['sec-fetch-dest'] !== 'script') {
if (fullBundleEnv) {
const pathname = decodeURIComponent(url)
const filePath = pathname.slice(1) // remove first /
let file = fullBundleEnv.memoryFiles.get(filePath)
if (!file && fullBundleEnv.memoryFiles.size !== 0) {
return next()
}
const secFetchDest = req.headers['sec-fetch-dest']
if (
[
'document',
'iframe',
'frame',
'fencedframe',
'',
undefined,
].includes(secFetchDest) &&
((await fullBundleEnv.triggerBundleRegenerationIfStale()) ||
file === undefined)
) {
file = { source: await generateFallbackHtml(server as ViteDevServer) }
}
if (!file) {
return next()
}
const html =
typeof file.source === 'string'
? file.source
: Buffer.from(file.source)
const headers = isDev
? server.config.server.headers
: server.config.preview.headers
return send(req, res, html, 'html', { headers, etag: file.etag })
}
let filePath: string
if (isDev && url.startsWith(FS_PREFIX)) {
filePath = decodeURIComponent(fsPathFromId(url))
} else {
filePath = normalizePath(
path.resolve(path.join(root, decodeURIComponent(url))),
)
}
if (isDev) {
const servingAccessResult = checkLoadingAccess(server.config, filePath)
if (servingAccessResult === 'denied') {
return respondWithAccessDenied(filePath, server, res)
}
if (servingAccessResult === 'fallback') {
return next()
}
servingAccessResult satisfies 'allowed'
} else {
// `server.fs` options does not apply to the preview server.
// But we should disallow serving files outside the output directory.
if (!isParentDirectory(root, filePath)) {
return next()
}
}
Domain
Subdomains
Calls
Called By
Source
Frequently Asked Questions
What does indexHtmlMiddleware() do?
indexHtmlMiddleware() is a function in the vite codebase, defined in packages/vite/src/node/server/middlewares/indexHtml.ts.
Where is indexHtmlMiddleware() defined?
indexHtmlMiddleware() is defined in packages/vite/src/node/server/middlewares/indexHtml.ts at line 442.
What does indexHtmlMiddleware() call?
indexHtmlMiddleware() calls 12 function(s): checkLoadingAccess, cleanUrl, fsPathFromId, generateFallbackHtml, get, isDevServer, isParentDirectory, normalizePath, and 4 more.
What calls indexHtmlMiddleware()?
indexHtmlMiddleware() is called by 2 function(s): _createServer, preview.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free