切换至pnpm后SvelteKit构建失败:Rollup解析canvas.node报错
SvelteKit + pnpm构建时pdf.js触发node-canvas二进制解析错误的解决需求
TL;DR:构建SvelteKit项目时,Rollup尝试解析本不应纳入构建产物的canvas.node二进制文件,触发来自node-canvas和pdf.js的解析错误。希望找到将pdf.js标记为仅浏览器端解析的方法,或其他让pdf.js与pnpm兼容的方案;node-canvas官方方案不适用,因为项目需要同时生成Node.js和浏览器端产物。
将SvelteKit项目的包管理器从npm切换为pnpm后,开发模式运行正常,但执行构建时失败,原始错误日志如下:
node_modules/.pnpm/pdfjs-dist@3.9.179/node_modules/pdfjs-dist/build/pdf.js (1950:23) Use of eval in "node_modules/.pnpm/pdfjs-dist@3.9.179/node_modules/pdfjs-dist/build/pdf.js" is strongly discouraged as it poses security risks and may cause issues with minification. # ... 成功的构建输出省略 .svelte-kit/output/server/index.js 104.13 kB .svelte-kit/output/server/entries/pages/room/_room_/_page@room.svelte.js 125.46 kB .svelte-kit/output/server/chunks/media-handlers.js 145.42 kB Run npm run preview to preview your production build locally. > Using @sveltejs/adapter-node error during build: RollupError: Unexpected character '' (Note that you need plugins to import files that are not JavaScript) at error (file:///home/oscarhermoso/Git/org-repo/node_modules/.pnpm/rollup@3.28.0/node_modules/rollup/dist/es/shared/node-entry.js:2245:30) at Module.error (file:///home/oscarhermoso/Git/org-repo/node_modules/.pnpm/rollup@3.28.0/node_modules/rollup/dist/es/shared/node-entry.js:13674:16) at Module.tryParse (file:///home/oscarhermoso/Git/org-repo/node_modules/.pnpm/rollup@3.28.0/node_modules/rollup/dist/es/shared/node-entry.js:14405:25) at Module.setSource (file:///home/oscarhermoso/Git/org-repo/node_modules/.pnpm/rollup@3.28.0/node_modules/rollup/dist/es/shared/node-entry.js:14006:39) at ModuleLoader.addModuleSource (file:///home/oscarhermoso/Git/org-repo/node_modules/.pnpm/rollup@3.28.0/node_modules/rollup/dist/es/shared/node-entry.js:24526:20) ELIFECYCLE Command failed with exit code 1.
通过修改node_modules添加console.trace后,获取到完整错误信息,发现问题源于Rollup尝试解析二进制文件canvas.node,依赖调用链如下:
Trace: { cause: SyntaxError: Unexpected character '' (1:0) # <-- 包含不可见字符U+007f # ... 其他信息省略 code: 'PARSE_ERROR', id: '/home/oscarhermoso/Git/org-repo/node_modules/.pnpm/canvas@2.11.2/node_modules/canvas/build/Release/canvas.node', message: "Unexpected character '\x7F' (Note that you need plugins to import files that are not JavaScript)", frame: '1: \x7FELF\x02\x01\x01\x00\x00\x00\x00\x00\x' # ... 其他信息省略 } # ... # 完整调用链: /home/oscarhermoso/Git/org-repo/node_modules/.pnpm/canvas@2.11.2/node_modules/canvas/build/Release/canvas.node /home/oscarhermoso/Git/org-repo/node_modules/.pnpm/canvas@2.11.2/node_modules/canvas/lib/bindings.js /home/oscarhermoso/Git/org-repo/node_modules/.pnpm/canvas@2.11.2/node_modules/canvas/index.js /home/oscarhermoso/Git/org-repo/node_modules/.pnpm/canvas@2.11.2/node_modules/canvas/lib/image.js /home/oscarhermoso/Git/org-repo/node_modules/.pnpm/canvas@2.11.2/node_modules/canvas/lib/canvas.js /home/oscarhermoso/Git/org-repo/node_modules/.pnpm/canvas@2.11.2/node_modules/canvas/lib/context2d.js /home/oscarhermoso/Git/org-repo/node_modules/.pnpm/canvas@2.11.2/node_modules/canvas/lib/pattern.js /home/oscarhermoso/Git/org-repo/node_modules/.pnpm/pdfjs-dist@3.9.179/node_modules/pdfjs-dist/build/pdf.js
我的理解是Rollup在构建时错误地解析了canvas.node二进制文件,但实际上该文件完全不需要被打包——因为pdf.js仅用于浏览器端。目前不清楚为何切换包管理器到pnpm会触发这个问题,除了切回npm外没有其他思路,恳请提供解决方案建议。
内容的提问来源于stack exchange,提问作者Oscar Hermoso
相关产品推荐
相关产品推荐

