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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:42:41