Resolving Unexpected Output Path Errors in Vercel Deployments


  "version": 2,

  "builds": \[

    {

      "src": "package.json",

      "use": "@vercel/static-build",

      "config": {

        "distDir": "\_site"

      }

    }

  \],

  "rewrites": \[

    {

      "source": "/api/:path\*",

      "destination": "/src/views/api/:path\*.js"

    },

    {

      "source": "/product/:uid",

      "destination": "/index.html"

    },

    {

      "source": "/(.\*)",

      "destination": "/index.html"

    }

  \],

  "headers": \[

    {

      "source": "/index.html",

      "headers": \[

        {

          "key": "Cache-Control",

          "value": "no-store, no-cache, must-revalidate"

        },

        {

          "key": "Pragma",

          "value": "no-cache"

        },

        {

          "key": "Expires",

          "value": "0"

        }

      \]

    }

  \]

}

import path from "path";

import fs from "fs";

import htmlmin from "html-minifier";

import EleventyVitePlugin from "@11ty/eleventy-plugin-vite";

import pluginPug from "@11ty/eleventy-plugin-pug";



export default function (*eleventyConfig*) {

  // Temp folder for Vite

  const tempFolder = ".11ty-vite";

  if (!*fs*.existsSync(tempFolder)) *fs*.mkdirSync(tempFolder, { recursive: true });



  // Plugins

  *eleventyConfig*.addPlugin(pluginPug);



  *eleventyConfig*.addPlugin(EleventyVitePlugin, {

    tempFolderName: tempFolder,

    viteOptions: {

      root: "src",

      publicDir: "public",

      build: {

        outDir: path.resolve(process.cwd(), ".11ty-vite"), // <- add this

        emptyOutDir: true,

        rollupOptions: {

          input: {},

        },

      },

    }



  });



  // Passthrough copy

  *eleventyConfig*.addPassthroughCopy("public");

  *eleventyConfig*.addPassthroughCopy("src/fonts");

  *eleventyConfig*.addPassthroughCopy("src/app");




  // HTML minify

  *eleventyConfig*.addTransform("htmlmin", (*content*, *outputPath*) => {

    if (*outputPath* && *outputPath*.endsWith(".html")) {

      return htmlmin.minify(*content*, {

        useShortDoctype: true,

        removeComments: true,

        collapseWhitespace: true,

      });

    }

    return *content*;

  });



  // Directory config

  return {

    dir: {

      input: "src/views",

      output: "\_site",

      includes: "\_includes",

      data: "\_data",

    },

    passthroughFileCopy: true,

    htmlTemplateEngine: "pug",

    pathPrefix: "/", // important for root-relative links

  };

};  "scripts": {

    "prebuild": "mkdir -p .11ty-vite && rimraf \_site",

    "build:vercel": "pnpm run prebuild && npx eleventy --config=.eleventy-build.js",

    "vercel-build": "pnpm run build:vercel",

    "build:win": "powershell -ExecutionPolicy Bypass -File build.ps1",

    "dev": "eleventy --config=.eleventy.js --serve --incremental",

    "clean": "rimraf \_site .11ty-vite"

  },

I dont understand why I keep getting this error Error: Unexpected output path (was not in output directory \_site): ./\_site/about/index.html

Hi, @azziefuzzie! Welcome to the Vercel Community.

It looks like the issue comes from how Eleventy and Vite are handling their output directories. Right now, you have a mismatch:

  • Eleventy outputs to _site
  • Vite outputs to .11ty-vite

This conflict prevents Vercel from picking up the correct build output.

Try updating your Eleventy config so that Vite builds to the same directory as Eleventy:

_eleventyConfig_.addPlugin(EleventyVitePlugin, {
  tempFolderName: tempFolder,
  viteOptions: {
    root: "src",
    publicDir: "public",
    build: {
      outDir: path.resolve(process.cwd(), "_site"), // Match Eleventy output
      emptyOutDir: false, // Prevents Eleventy files from being deleted
      rollupOptions: {
        input: {},
      },
    },
  },
});

If that doesn’t work, try removing the custom outDir from your config and let EleventyVitePlugin handle it automatically.

Thanks, @pawlean I tried both solutions also tried removing the with removing the “outDir: path.resolve(process.cwd(), ‘_site’)”, couldn’t get it to work though still the same error :
import path from ‘path’;

import fs from ‘fs’;

import htmlmin from ‘html-minifier’;

import EleventyVitePlugin from ‘@11ty/eleventy-plugin-vite’;

import pluginPug from ‘@11ty/eleventy-plugin-pug’;

export default function (eleventyConfig) {

// — Ensure temp folder exists —

const tempFolder = ‘.11ty-vite’;

if (!fs.existsSync(tempFolder)) fs.mkdirSync(tempFolder, { recursive: true });

// — Server —

eleventyConfig.setServerOptions({ port: 3000 });

// — Plugins —

eleventyConfig.addPlugin(pluginPug);

eleventyConfig.addPlugin(EleventyVitePlugin, {

tempFolderName: tempFolder,

viteOptions: {

  root: 'src',

  publicDir: 'public',

  build: {



    outDir: path.resolve(process.cwd(), '\_site'),

    emptyOutDir: false, 

    rollupOptions: {

      input: {}, 

    },

  },

  css: {

    preprocessorOptions: {

      scss: {

        additionalData: \`@import "@styles/utils/variables.scss";\`,

      },

    },

  },

  resolve: {

    alias: {

      '@styles': path.resolve(process.cwd(), 'src/styles'),

      '@app': path.resolve(process.cwd(), 'src/app'),

      '@utils': path.resolve(process.cwd(), 'src/app/utils'),

      '@components': path.resolve(process.cwd(), 'src/app/components'),

      '@shaders': path.resolve(process.cwd(), 'src/app/shaders'),

      '@classes': path.resolve(process.cwd(), 'src/app/classes'),

      '@animations': path.resolve(process.cwd(), 'src/app/animations'),

      '@pages': path.resolve(process.cwd(), 'src/app/pages'),

    },

  },

},

});

// — Passthrough copy —

eleventyConfig.addPassthroughCopy(‘public’);

eleventyConfig.addPassthroughCopy(‘src/app’);

eleventyConfig.addPassthroughCopy(‘src/fonts’);

eleventyConfig.addPassthroughCopy(‘src/styles’);

eleventyConfig.setServerPassthroughCopyBehavior(‘copy’);

// — HTML minify —

eleventyConfig.addTransform(‘htmlmin’, (content, outputPath) => {

if (*outputPath* && *outputPath*.endsWith('.html')) {

  return htmlmin.minify(*content*, {

    useShortDoctype: true,

    removeComments: true,

    collapseWhitespace: true,

  });

}

return *content*;

});

// — Return directory config —

return {

dir: {

  input: 'src/views/',

  output: '\_site',

  includes: '\_includes',

  data: '\_data',

},

passthroughFileCopy: true,

htmlTemplateEngine: 'pug',

};

};

Hi @azziefuzzie! :bell:

This thread’s been quiet for a while. If you’re still facing issues, please share any relevant details (logs, screenshots, error messages) so we can take another look!