使用Webpack打包ffi-napi分发用户时遇原生构建缺失错误求助
我尝试用ffi-napi导入一个可发送有效TLS请求的Go HTTP客户端,运行打包生成的exe文件时,持续出现以下错误:
No native build was found for platform=win32 arch=x64 runtime=node abi=93 uv=1 libc=glibc node=16.16.0 webpack=true
loaded from: C:\snapshot
我试过添加以下配置,但未解决问题:
node : { __dirname : true }
且无法将ffi-napi设为外部依赖,因为它是客户端应用的必需项。
我的Webpack配置文件如下:
const path = require('path'); const CopyPlugin = require("copy-webpack-plugin"); const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); const HappyPack = require('happypack'); module.exports = { target: 'node', entry: './Main.ts', node: { __dirname: false }, output: { path: path.resolve(__dirname, 'dist'), filename: 'Main.bundle.js', }, resolve: { extensions: ['.js', '.ts'], modules: ['node_modules'] }, plugins: [ new CopyPlugin({ patterns: [{ from: "./MainProd.ts", to: path.resolve(__dirname, 'dist') }], }), new ForkTsCheckerWebpackPlugin(), new HappyPack({ id: 'ts', threads: 4, loaders: [{ path: 'ts-loader', query: { happyPackMode: true } }] }) ], mode: "production", node: { __dirname: false }, module: { rules: [{ test: /\.ts?$/, use: [{ loader: 'ng-router-loader', options: { loader: 'async-import', genDir: 'compiled', } }, { loader: 'happypack/loader?id=ts' } ] }] } };
版本信息:Node.js 18.14.0,Webpack 5.75.0,ffi-napi 4.0.3
1. 修正__dirname配置
你的Webpack配置中重复设置了node: { __dirname: false },需要改为true——ffi-napi依赖正确的文件路径解析来定位原生模块:
node: { __dirname: true }
2. 用webpack-node-externals精准控制外部依赖
安装webpack-node-externals,它可以排除大部分Node核心模块和第三方依赖,但强制包含ffi-napi确保其被正确打包:
- 安装依赖:
npm install webpack-node-externals --save-dev
- 修改Webpack配置:
const nodeExternals = require('webpack-node-externals'); module.exports = { // ...其他原有配置 externals: [nodeExternals({ allowlist: ['ffi-napi'] })], // ...其他原有配置 };
3. 手动复制ffi-napi原生二进制文件
Webpack不会自动打包原生模块文件,需通过copy-webpack-plugin将ffi-napi的二进制文件复制到打包目录:
new CopyPlugin({ patterns: [ { from: "./MainProd.ts", to: path.resolve(__dirname, 'dist') }, // 添加该规则复制原生文件 { from: 'node_modules/ffi-napi/build/Release/ffi_napi.node', to: path.resolve(__dirname, 'dist/ffi_napi.node') } ], })
4. 匹配Node版本重新构建ffi-napi
错误中提到的ABI版本93对应Node 16,但你使用的是Node 18(ABI 108),需重新构建ffi-napi以适配当前Node版本:
npm rebuild ffi-napi --update-binary
5. 适配pkg打包(若使用)
如果是用pkg将项目打包为exe,需在package.json中添加配置,确保ffi-napi的原生文件被包含:
"pkg": { "assets": [ "node_modules/ffi-napi/build/Release/**/*" ] }
完成以上步骤后重新打包项目,即可解决找不到原生构建文件的问题。
内容的提问来源于stack exchange,提问作者Taha Daboussi

