使用 webpack 时节点找不到模块“fs”

Posted

技术标签:

【中文标题】使用 webpack 时节点找不到模块“fs”【英文标题】:Node cannot find module "fs" when using webpack 【发布时间】:2017-01-08 00:31:57 【问题描述】:

我正在使用 node.js 和 webpack 创建一个包。根据我的阅读,node.js 应该包含用于管理文件的fs 模块。然而,当我打电话给require("fs") 时,我得到一个Cannot find module "fs" 错误。我该怎么办?

【问题讨论】:

【参考方案1】:

我自己在捆绑 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 现在已被取代。

【讨论】:

尽管 webpack 更新很多,target: 'node' 行仍然很重要,是什么让它在 webpack v4 上工作【参考方案2】:

如果您在 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

【讨论】:

添加 fs 后出现此错误。配置对象无效。 Webpack 已使用与 API 模式不匹配的配置对象进行初始化。 - configuration.node 具有未知属性“fs”。这些属性是有效的:object __dirname?, __filename?, global? -> 节点兼容性功能的选项对象。 @SuuSoJeat 那是因为你的 webpack 版本比这个答案更新,see my answer 代替 添加 node: fs: "empty" 到 webpack.config.js 没有用,但是添加 "browser": "fs": false 到 package.json 了!成功! package.json 条目完成了这项工作。谢谢:) 我在一些遗留代码中遇到了“路径”问题,我做了完全相反的事情。删除 "browser": "path": false 现在 webpack 注入了正确的对象!【参考方案3】:

我在使用 webworkers 捆绑 NWjs 应用程序时遇到了同样的问题(这反过来又启用了节点)。

我找到的解决方案是将我在externals 中使用的每个本机模块都包含在模块名称中,并带有前缀commonjs。例如:

    ...
    target: "webworker", // or 'node' or 'node-webkit'
    externals:
        fs:    "commonjs fs",
        path:  "commonjs path"
    
    ...

我对不同项目中的目标“webworker”和“node-webkit”做了同样的事情来解决同样的问题。

webpacknwjswebworkernodejsnode

【讨论】:

【参考方案4】:

将以下配置添加到您的 webpack.config.js

resolve: 
  fallback: 
    fs: false
  

【讨论】:

更新到 laravel-mix v6 时这对我有用 @kia nasirzadeh 我在 Laravel 8 中遇到了类似的错误,我无法解决。请你帮助我好吗? ***.com/questions/68032168/…【参考方案5】:

在尝试了我在互联网上找到的所有内容(targetexternalsnode configs)之后,唯一对我有用的解决方案是替换:

const filesystem = require("fs")
        or
import fs from "fs"

通过特殊的 webpack 版本

const fs = __non_webpack_require__("fs")

这会生成一个不被 webpack 解析的 require 函数。

【讨论】:

【参考方案6】:

我需要构建一个类,如果在浏览器中执行将使用fetch,如果在节点中执行则使用fs。由于其他原因,生成单独的捆绑包是不切实际的,因此我生成了一个针对浏览器的捆绑包。

如果脚本在节点中运行,我使用的解决方案是使用eval('require("fs")')

const fs = eval('require("fs")')

浏览器安全(fs 在浏览器中是 null):

const fs = typeof window === 'object'
    ? null
    : eval('require("fs")')

【讨论】:

【参考方案7】:

除了PDG的回答

我已经习惯了这种简短的复制/粘贴糖果。

使用 pathfs

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,
...

【讨论】:

【参考方案8】:

对于我们正在构建的解决方案,我们必须强制使用旧版本的 webpack:

npm install --save --force webpack@webpack-3

【讨论】:

【参考方案9】:

使用预定义的解决方案会更优雅: 将target: 'node' 添加到 webpack 配置文件中。

更多信息:official documentation

【讨论】:

以上是关于使用 webpack 时节点找不到模块“fs”的主要内容,如果未能解决你的问题,请参考以下文章

找不到模块:错误:无法解析模块“fs”

未找到模块:错误:无法使用 Webpack 解析“fs”

Webpack 在构建时使用 node 'fs' 模块,因此浏览器获取函数的结果

Webpack Express 无法解析模块“fs”,请求依赖是表达式

.10-浅析webpack源码之graceful-fs模块

无法使用 Vue CLI 3 要求“fs”