You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Netlify部署Next.js访问feed报Cannot find module 'esbuild'

问题根因

两类异常均为Next.js 12项目部署到Netlify时SSR路由的适配问题:

  • Cannot find module 'esbuild':pages/feeds下的xml路由会被Netlify识别为SSR页面,打包为独立Serverless Function运行。Next.js 12将esbuild作为内置构建依赖,默认归类为devDependencies,Netlify打包函数时不会自动将间接引用的开发依赖打入产物,运行时加载对应代码块时直接抛出模块缺失错误。
  • 路径调整后feed内容为空:Serverless函数运行时工作目录为/var/task,与本地开发时的项目根目录不一致,读取posts目录mdx文件使用的相对路径在函数环境下指向错误位置;未显式配置的情况下,posts目录不会被自动打入SSR函数部署包,函数运行时无法读取到mdx源文件。
解决方案

修复esbuild缺失报错

两种方案二选一即可,优先选择配置文件方式:

  1. 配置文件方式(推荐)
    在项目根目录新建或修改netlify.toml,添加如下配置:
[build]
  command = "npm run build"
  publish = ".next"

[[plugins]]
  package = "@netlify/plugin-nextjs"

[functions]
  included_files = ["node_modules/esbuild/**"]
  node_bundler = "esbuild"
  1. 依赖调整方式
    直接将esbuild从开发依赖移到生产依赖,保证部署时会被安装到函数运行环境:
npm install esbuild --save

修复feed内容为空问题

  1. 修正文件读取路径
    所有读取posts目录文件的逻辑,禁止使用./posts这类相对路径,统一通过process.cwd()拼接项目根目录(Netlify函数运行时process.cwd()默认指向部署后的项目根目录):
// 错误写法
const postsDir = path.join('./posts')
// 正确写法
const postsDir = path.join(process.cwd(), 'posts')
  1. 配置静态资源打包规则
    修改netlify.toml中functions段的included_files配置,将posts下的mdx文件显式加入函数打包清单:
[functions]
  included_files = ["node_modules/esbuild/**", "posts/**/*.mdx"]
  node_bundler = "esbuild"
  1. 调整路由生成方式
    feed路由不要使用带fallback的ISR模式,要么改用getServerSideProps在请求时动态生成内容,要么在getStaticPaths中显式声明feed路径确保构建时预渲染,避免运行时拿不到文章数据。
本地验证

部署前执行npx netlify dev在本地模拟Netlify运行环境,访问feed路径确认内容正常输出后再触发生产部署,部署完成后先清除Netlify CDN缓存再访问,避免命中旧的错误缓存。

注意:feed生成逻辑中不要引入任何浏览器端专属API(如window、document对象),否则SSR阶段会抛出运行时错误,同样会导致feed生成失败。

内容的提问来源于stack exchange,提问作者Kevin Ramirez Zavalza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:36:14