Vite项目导入@tensorflow/tfjs-node出现依赖解析错误如何解决
你导入了错误的TensorFlow.js发行包。@tensorflow/tfjs-node是仅支持Node.js运行时的后端版本,依赖C++编译的原生TensorFlow二进制、Node专属原生模块,完全不兼容浏览器环境。你看到报错里的@mapbox/node-pre-gyp就是这个包用来拉取预编译原生二进制的依赖,属于服务端专属代码。
Vite是面向浏览器的前端构建工具,预构建依赖时会尝试把所有导入的模块打包成浏览器可运行的代码,碰到这些Node专属模块时,自然无法处理模块里仅在Node环境下生效的动态引入逻辑,最终抛出依赖找不到的错误。
你之前能直接跑通test.mjs,是因为执行环境是Node,本身就支持这些原生模块和动态引入逻辑,和浏览器端的运行、构建逻辑完全不通用。
根据你的使用场景二选一即可:
- 目标是在浏览器端的Vite页面里运行TensorFlow逻辑:
- 卸载Node端专属包:执行
npm uninstall @tensorflow/tfjs-node - 安装浏览器兼容的TF.js版本:执行
npm install @tensorflow/tfjs - 把代码里的导入语句替换为
import * as tf from '@tensorflow/tfjs',张量创建、打印的业务逻辑不需要修改,重启dev服务即可正常运行。
- 卸载Node端专属包:执行
- 目标是在Vite项目的Node侧逻辑(比如Vite插件、SSR服务端代码)里调用
tfjs-node:
需要在配置里标记这个包为外置依赖,避免Vite尝试把它打包进浏览器代码,在项目根目录的vite.config.ts中添加如下配置:
import { defineConfig } from 'vite' export default defineConfig({ optimizeDeps: { exclude: ['@tensorflow/tfjs-node'] }, build: { rollupOptions: { external: ['@tensorflow/tfjs-node'] } } })
注意:就算添加了上述配置,
tfjs-node的代码也不能在浏览器侧执行,仅能在Node环境运行的逻辑中调用。
你看到的mock-aws-s3、aws-sdk、nock三个依赖缺失,是@mapbox/node-pre-gyp里的可选依赖:这个模块支持从AWS S3拉取预编译二进制文件,相关逻辑只有在特定场景下才会触发,对应依赖是动态require引入的。在Node环境下,只要没走到对应逻辑分支,就算没装这三个包也不会报错。
但Vite做依赖预构建时用的esbuild会做静态分析,不管代码实际运行时会不会走到对应分支,只要扫描到require语句就会尝试解析、打包对应依赖,找不到包就直接抛出构建错误,所以你会看到这些和业务逻辑完全无关的报错。
内容的提问来源于stack exchange,提问作者dshin

