【发布时间】:2017-01-08 00:31:57
【问题描述】:
我正在使用 node.js 和 webpack 创建一个包。根据我的阅读,node.js 应该包含用于管理文件的fs 模块。然而,当我打电话给require("fs") 时,我得到一个Cannot find module "fs" 错误。我该怎么办?
【问题讨论】:
我正在使用 node.js 和 webpack 创建一个包。根据我的阅读,node.js 应该包含用于管理文件的fs 模块。然而,当我打电话给require("fs") 时,我得到一个Cannot find module "fs" 错误。我该怎么办?
【问题讨论】:
我自己在捆绑 webpack 时遇到了这个问题,并在 this thread 上找到了答案。
为我解决它的方法是使用以下配置:
module.exports = {
entry: "./app",
output: {
path: __dirname,
filename: "bundle.js"
},
module: {
loaders: [
{
test: /\.js$/,
exclude: 'node_modules',
loader: 'babel',
query: {presets: ['es2015']},
}
]
},
target: 'node'
};
通过将目标设置为节点,webpack 将进行必要的更改以捆绑您的节点应用程序
编辑:此答案针对的 webpack 1.x 现在已被取代。
【讨论】:
target: 'node' 行仍然很重要,是什么让它在 webpack v4 上工作
如果您在 nodejs 环境中运行 webpack 包,则在 webpack.config.js 文件中需要 target: 'node' 否则 webpack 将默认值作为目标 check here 的 web。
您可以通过两种方式解决问题
将以下配置添加到您的 webpack.config.js
node: {
fs: "empty"
}
或
将以下配置添加到您的 package.json 中
"browser": {
"fs": false
}
编辑:
有希望的修复是
"browser": {
"fs": false
}
【讨论】:
我在使用 webworkers 捆绑 NWjs 应用程序时遇到了同样的问题(这反过来又启用了节点)。
我找到的解决方案是将我在externals 中使用的每个本机模块都包含在模块名称中,并带有前缀commonjs。例如:
...
target: "webworker", // or 'node' or 'node-webkit'
externals:{
fs: "commonjs fs",
path: "commonjs path"
}
...
我对不同项目中的目标“webworker”和“node-webkit”做了同样的事情来解决同样的问题。
【讨论】:
将以下配置添加到您的 webpack.config.js
resolve: {
fallback: {
fs: false
}
}
【讨论】:
在尝试了我在互联网上找到的所有内容(target、externals、node configs)之后,唯一对我有用的解决方案是替换:
const filesystem = require("fs")
or
import fs from "fs"
通过特殊的 webpack 版本
const fs = __non_webpack_require__("fs")
这会生成一个不被 webpack 解析的 require 函数。
【讨论】:
我需要构建一个类,如果在浏览器中执行将使用fetch,如果在节点中执行则使用fs。由于其他原因,生成单独的捆绑包是不切实际的,因此我生成了一个针对浏览器的捆绑包。
如果脚本在节点中运行,我使用的解决方案是使用eval('require("fs")')。
const fs = eval('require("fs")')
浏览器安全(fs 在浏览器中是 null):
const fs = typeof window === 'object'
? null
: eval('require("fs")')
【讨论】:
除了PDG的回答
我已经习惯了这种简短的复制/粘贴糖果。
使用 path 和 fs :
var nodeModules = {};
fs.readdirSync(path.resolve(__dirname, 'node_modules'))
.filter(x => ['.bin'].indexOf(x) === -1)
.forEach(mod => { nodeModules[mod] = `commonjs ${mod}`; });
// Before your webpack configuration
module.exports = {
...
}
然后在您的配置文件中,将 nodeModules 变量包含在 externals 中
...
externals: nodeModules,
...
【讨论】:
对于我们正在构建的解决方案,我们必须强制使用旧版本的 webpack:
npm install --save --force webpack@webpack-3
【讨论】:
使用预定义的解决方案会更优雅:
将target: 'node' 添加到 webpack 配置文件中。
【讨论】: