使用webpack时,节点找不到模块"fs"

use*_*968 40 node.js webpack

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

Joe*_*hey 41

我在捆绑webpack时遇到了这个问题并在这个帖子上找到了答案.

为我解决它的方法是使用以下配置:

module.exports = {
  entry: "./app",
  output: {
    path: __dirname,
    filename: "bundle.js"
  },
  module: {
      loaders: [
          {  
              test: /\.js$/,
              exclude: 'node_modules',
              loader: 'babel',
              query: {presets: ['es2015']},
          }
      ]
  },
  target: 'node'
};
Run Code Online (Sandbox Code Playgroud)

通过将target设置为node,webpack将进行必要的更改以捆绑您的节点应用程序

编辑:这个答案针对webpack 1.x,现已被取代.

  • 然后我得到的要求没有定义 (19认同)
  • 应用此解决方案后,我也得到了"require not defined".任何线索? (14认同)
  • 尽管 webpack 较新,但 `target: 'node'` 行仍然很重要,这也是它在 webpack v4 上工作的原因 (5认同)
  • 在申请上述内容后,我也得到了要求,任何建议都会很棒. (2认同)

PDG*_*PDG 13

使用webworkers捆绑NWjs应用程序时,我遇到了同样的问题(后者又启用了节点).

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

    ...
    target: "webworker", // or 'node' or 'node-webkit'
    externals:{
        fs:    "commonjs fs",
        path:  "commonjs path"
    }
    ...
Run Code Online (Sandbox Code Playgroud)

我已经为不同项目中的目标"webworker"和"node-webkit"做了同样的事情来解决同样的问题.


Hem*_*ari 12

如果您在nodejs环境中运行webpack包,则在webpack.config.js文件中需要target:'node',否则webpack将默认值作为web for target check here.

您可以通过两种方式解决问题

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

node: {
    fs: "empty"
}
Run Code Online (Sandbox Code Playgroud)

要么

将以下配置添加到package.json

"browser": {
    "fs": false
}
Run Code Online (Sandbox Code Playgroud)

  • 添加 fs 后出现此错误。配置对象无效。Webpack 已使用与 API 架构不匹配的配置对象进行初始化。-configuration.node 有一个未知属性“fs”。这些属性有效: object { __dirname?, __filename?, global? } -> 用于节点兼容性功能的选项对象。 (4认同)
  • @SuuSoJeat那是因为你的webpack版本比这个答案更新,[参见我的答案](/sf/answers/4510017291/) (3认同)
  • 将 node: { fs: "empty" } 添加到 webpack.config.js 不起作用,但将 "browser": { "fs": false } 添加到 package.json 却起作用了!成功! (2认同)

ash*_*deh 11

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

resolve: {
  fallback: {
    fs: false
  }
}
Run Code Online (Sandbox Code Playgroud)


Gom*_*ino 9

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

const filesystem = require("fs")
        or
import fs from "fs"
Run Code Online (Sandbox Code Playgroud)

通过特殊的 webpack 版本

const fs = __non_webpack_require__("fs")
Run Code Online (Sandbox Code Playgroud)

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


wiz*_*lus 7

我需要构建一个fetch在浏览器中fs执行或在 node.js 中执行时使用的类。由于其他原因,生成单独的包是不切实际的,所以我生成了一个针对浏览器的包。

我使用的解决方案是eval('require("fs")')在脚本在 node.js 中运行时使用。

const fs = eval('require("fs")')
Run Code Online (Sandbox Code Playgroud)

浏览器安全(fsnull在浏览器中):

const fs = typeof window === 'object'
    ? null
    : eval('require("fs")')
Run Code Online (Sandbox Code Playgroud)