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

在Vercel部署的Next.js 14.1中,如何在Server Action访问本地文件?

在Vercel部署Next.js 14.1时解决Server Action访问本地文件的问题

可行方案:通过ES模块导入静态文件

直接在Server Action中导入所需的PDF模板和字体文件,让Next.js构建工具自动处理资源打包与路径映射,这是适配Vercel部署环境的最优解,步骤如下:

  • 导入静态文件
    在你的Server Action文件(例如actions/generate-pdf.ts)中,直接导入目标文件:
import templatePdf from './pdf_data/template.pdf';
import customFont from './pdf_data/your-font.ttf';

Next.js默认支持这类静态资源导入,会返回生产环境中可用的正确文件路径。

  • 使用导入的路径读取文件
    在PDF生成逻辑中,直接用导入的路径替代相对路径读取文件:
import fs from 'fs/promises';

export async function generatePdf() {
  // 读取模板PDF
  const templateBuffer = await fs.readFile(templatePdf);
  // 读取字体文件
  const fontBuffer = await fs.readFile(customFont);

  // 执行PDF生成逻辑(例如使用pdf-lib等库)
  // ...
}
  • 自定义webpack配置(可选)
    如果Next.js默认未处理你的文件类型,可在next.config.js中添加规则:
/** @type {import('next').NextConfig} */
const nextConfig = {
  webpack: (config) => {
    config.module.rules.push({
      test: /\.(pdf|ttf)$/,
      type: 'asset/resource',
      generator: {
        filename: 'static/assets/[hash][ext]',
      },
    });
    return config;
  },
};

export default nextConfig;

该配置会将PDF和字体文件打包到static/assets目录,Next.js会自动维护路径的正确性。

为什么CopyPlugin方案失效?

Vercel部署Next.js时,Server Action会被编译为边缘函数或Node.js函数,生产环境的构建产物目录结构与本地.next/server完全不同,你通过CopyPlugin复制到.next/server/actions的文件在部署后根本不存在,因此触发ENOENT错误。

与API路由方案的对比

用Server Action实现的优势在于逻辑内聚,无需额外创建API路由文件,更贴合App Router的设计思路,同时避免了API路由的网络请求开销。

注意事项

  • 确保导入路径是相对于Server Action文件的相对路径,避免路径错误。
  • 若你的PDF生成库需要文件路径而非Buffer,直接使用导入的变量即可,它们是生产环境中的绝对路径。

内容的提问来源于stack exchange,提问作者Kargzul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:27:40