zam*_*6ak 7 module server-side node.js webpack
我有一个Node.js应用程序,它有很少的本机模块,通过node-gyp创建.这些模块不会以"node_modules"结尾,并且需要来自Node的标准"require"...
我的webpack配置基于这篇文章 如果我运行应用程序"unpackaged" - 一切正常......但是在我运行"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.
Run Code Online (Sandbox Code Playgroud)
我确保所有的加载器都安装了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
Run Code Online (Sandbox Code Playgroud)
server.native.js非常简单,调用本机模块
try {
module.exports = require('../build/Release/mymodule.node');
console.log('native module loaded...');
} catch (err) {
console.log(err);
}
Run Code Online (Sandbox Code Playgroud)
这是我的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
}
];
Run Code Online (Sandbox Code Playgroud)
在过去的两年里,我想知道如何与webpack@4和一起使用本机模块webpack@5。说起来很遗憾,但在花了数百个小时研究将本机模块集成到捆绑包中的想法之后,我得出了一个结论:这是多么不可能。
我的建议是将正在使用的每个模块.node或其他类型的本机模块放入nodeExternals-webpack将跳过它们,如果您想运行您的捆绑包,则需要安装模块。用于webpack本机项目并不是一个好的解决方案,我会简化建议不要使用它。
| 归档时间: |
|
| 查看次数: |
6658 次 |
| 最近记录: |