【问题标题】:Using webpack with NodeJs native modules将 webpack 与 NodeJs 原生模块一起使用
【发布时间】:2015-09-28 21:33:22
【问题描述】:

我有一个 Node.js 应用程序,其中包含几个通过 node-gyp 创建的本机模块。 这些模块不会出现在“node_modules”中,而是通过 Node 的标准“require”...

我的 webpack 配置基于 this article 如果我运行“未打包”的应用程序 - 一切正常...... 但是在我运行“webpack -p --progress”并尝试运行它之后,我得到以下信息:

X:\myapp>node main-backend.bundle.js env=production port=80 ssl_port=443
[Error: Cannot open X:\myapp\lib\modules\my-module\build\Release\mymodule.node: Error: The specified module could not be found.

我确保所有加载程序都安装了 npm。 从错误中,我可以看出路径是正确的(相对于 server.native.js)但显然不是 app.js ......但是,这在使用常规 node.js 时“正常工作”,我不确定是否这甚至是问题的症结所在……

我将不胜感激!

这是我的应用程序的精简布局

myapp/
    app.js
    node_modules/
    lib/
      modules/
        my-module/
           src/
             one.cc
             one.h
           lib/
             server.native.js
           bindings.gyp
           build/
             Release/
               mymodule.node

server.native.js 很简单,调用原生模块

try {
    module.exports = require('../build/Release/mymodule.node');
    console.log('native module loaded...');
} catch (err) {
    console.log(err);
}

这是我的 webpack.config.js

var webpack = require("webpack");
var path = require("path");
var fs = require("fs");

var nodeModules = {};
fs.readdirSync("node_modules")
  .filter(function(x) {
    return [".bin"].indexOf(x) === -1;
  })
  .forEach(function(mod) {
    nodeModules[mod] = "commonjs " + mod;
  });


module.exports = [
  {
    name: "server-side",
    context: __dirname,
    entry: {
      "main-backend": "./app.js"
    },
    target: "node",
    output: {
      path: __dirname,
      filename: "[name].bundle.js",
      chunkFilename: "[id].bundle.js"
    },
    module: {
      loaders: [
        { test: /\.json$/,   loader: "json-loader" },
        { test: /\.jade$/,   loader: "jade-loader" },
        { test: /\.node$/,   loader: "node-loader" }
      ]
    },
    externals: [nodeModules],
    resolve: {
      extensions: [ "", ".js", ".node"]
    },
    plugins: [
      new webpack.IgnorePlugin(/\.(css|less)$/)
      new webpack.BannerPlugin("require(\"source-map-support\").install();", { raw: true, entryOnly: false })
    ],
    node: {
      __dirname: true,
      __filename: true
    },
    devtool: "sourcemap",
    profile: true
  }
];

【问题讨论】:

  • 根据文章,您使用的是 externals: [nodeModules], 而不是 externals: nodeModules

标签: node.js module server-side webpack


【解决方案1】:

在过去的两年里,我一直在想如何使用原生模块以及 webpack@4webpack@5。说起来很可悲,但是在将原生模块集成到一个包中的想法上花费了数百个小时后,我得出了一个结论,即这是多么不可能。

我的建议是将每个使用 .node 或其他类型本机模块的模块放入 nodeExternals - webpack 会跳过它们,如果你想运行你的包,你需要安装模块.对原生项目使用 webpack 不是一个好的解决方案,我会简化建议在没有它的情况下进行。

【讨论】:

    猜你喜欢
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2016-10-09
    • 1970-01-01
    • 2021-03-08
    • 2017-01-16
    相关资源
    最近更新 更多