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

发布内置FormData的NPM包时append方法报错如何解决

问题解答

核心结论

不推荐面向浏览器端的NPM包内置FormData实现,你遇到的发布后formData.append传入File类型报错、本地运行正常的问题,本质是rollup构建环节错误引入了Node.js环境的FormData polyfill导致的类型不兼容,和你写的forEach遍历逻辑没有关系。

根因说明

浏览器原生提供的FormData接口可以直接识别标准File/Blob类型,但Node生态下的form-data包是为Node服务端环境设计的,它的append方法会对传入的参数做Node端的类型校验,无法识别浏览器原生的File对象,调用时就会抛出错误。
本地开发时你运行在Vite等构建工具的开发服务器下,代码直接在浏览器环境执行,调用的是原生FormData所以没有异常;rollup构建发布包时如果配置不当,会自动把Node端的form-data依赖打进产物里,就会触发这个报错。

修复步骤

  • 修正rollup的模块解析配置,确保优先加载浏览器端依赖:
// rollup.config.js
import resolve from '@rollup/plugin-node-resolve'
import commonjs from '@rollup/plugin-commonjs'

export default {
  // 其余配置(input/output/vue插件等)保持不变
  plugins: [
    resolve({
      browser: true,
      preferBuiltins: false, // 关闭Node内置模块优先逻辑
      exportConditions: ['browser', 'module', 'import', 'default']
    }),
    commonjs(),
    // 其余插件保持不变
  ]
}
  • 如果你项目里手动安装过form-data依赖,直接把它加入rollup的外部依赖列表,不要打进最终产物:
// rollup.config.js 对应配置项
export default {
  // 其余配置省略
  external: ['form-data']
}
  • 如果你的包需要兼容IE等不支持原生FormData的旧浏览器,不要在顶层直接引入polyfill,加环境判断动态加载浏览器专用的polyfill即可:
if (typeof window !== 'undefined' && !window.FormData) {
  // 仅在原生FormData不存在时加载浏览器专用polyfill
  await import('formdata-polyfill')
}

验证方式

重新构建后,在生成的产物文件中搜索form-data相关的引入语句,确认没有把Node端的form-data实现打进包后,发布测试版本到NPM安装验证即可,append方法传入File类型的报错会直接消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:06:28