esbuild打包后Prettier format函数报错:filename参数未定义
解决思路
- 显式导入Parser插件,避免动态导入
Prettier默认会动态加载对应parser模块,但esbuild打包时可能无法正确追踪这些动态依赖,导致生产环境中找不到模块。直接导入所需的parser并配置到plugins里:
import { format } from 'prettier'; import parserBabel from 'prettier/parser-babel'; await format(inputCode, { parser: 'babel', plugins: [parserBabel] });
- 添加虚拟绝对路径的filename参数
报错提示filename为undefined,Prettier内部部分逻辑依赖filename参数的格式(必须是绝对路径或文件URL)。即使格式化的是字符串,也可以指定一个虚拟的绝对路径文件名:
await format(inputCode, { parser: 'babel', filename: '/virtual-js-file.js' });
- 切换到Prettier Standalone版本
Prettier提供了专门用于打包场景的standalone包,该版本预打包了常用parser,无需动态导入,更适合浏览器或打包后的Node.js环境:
import { format } from 'prettier/standalone'; import parserBabel from 'prettier/parser-babel'; await format(inputCode, { parser: 'babel', plugins: [parserBabel] });
- 调整esbuild打包配置
- 关闭tree shaking:如果esbuild的tree shaking误删了Prettier的动态依赖模块,可在配置中设置
treeShaking: false。 - 标记Prettier为有副作用:在项目的
package.json中添加"sideEffects": ["prettier/**/*"],告诉打包工具不要移除Prettier的相关文件。 - 检查打包目标环境:如果是浏览器环境,确保不要使用Node.js版本的Prettier,必须用standalone版本,否则会因依赖Node.js文件系统API报错。
- 关闭tree shaking:如果esbuild的tree shaking误删了Prettier的动态依赖模块,可在配置中设置
内容的提问来源于stack exchange,提问作者Sergio Herrero
相关产品推荐
相关产品推荐

