Home / Function/ indexHtmlMiddleware() — vite Function Reference

indexHtmlMiddleware() — vite Function Reference

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

Function typescript ViteCore ConfigEngine calls 12 called by 2

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

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