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

Posted

技术标签:

【中文标题】未找到模块:错误:无法使用 Webpack 解析“fs”【英文标题】:Module not found: Error: Can't resolve 'fs' Using Webpack 【发布时间】:2018-09-30 14:44:03 【问题描述】:

嗨,我在我的应用程序中使用套接字 io。这需要 fs。当我尝试使用下面的 webpack 配置捆绑我的 javascript 时。我收到错误无法解析“fs”。

Module not found: Error: Can't resolve 'fs' in 'my application path/node_modules/socket.io/lib'

我通过添加 target:'node'node:fs:'empty' 找到。这个问题得到了解决。

但是 sass-loader 有一个问题。出现以下错误。

ERROR in javascript/bundle.js from UglifyJs
Unexpected token: name (zlibLimiter) [javascript/bundle.js:60019,4]
Child extract-text-webpack-plugin ../../../node_modules/extract-text-webpack-plugin/dist ../../../node_modules/css-loader/index.js??ref--2-2!../../../node_modules/sass-loader/lib/loader.js!s

忽略上述错误运行应用程序。低于错误。

external "crypto":1 Uncaught ReferenceError: require is not defined
    at Object.__decorate (external "crypto":1)
    at __webpack_require__ (bootstrap 93620a17882f7a2aa1d3:19)
    at Object.byteToHex (rng.js:4)
    at __webpack_require__ (bootstrap 93620a17882f7a2aa1d3:19)

下面是我的 webpack 配置和版本。谁能帮我解决这个问题。

"webpack": "~3.6.0", npm -v 5.8.0 节点 -v v8.4.0

const webpack = require('webpack');
const env = process.env.NODE_ENV;
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const path = require('path');
const extractSass = new ExtractTextPlugin(
  filename: 'css/[name].css',
  allChunks: false
);


let output = 
  path: __dirname + '/src/main/resources/static/',
  filename: 'javascript/[name].js'
;

if (env === 'debug' || env === 'nondev') 
  output = 
    path: __dirname + '/target/classes/static/',
    filename: 'javascript/[name].js'
  ;


let config = 
  context: __dirname + '/app/js/src',
  entry: 
    bundle: './index.jsx',
    application: './static/scss/application.scss',
    'application-pdap': './static/scss/application-pdap.scss'
  ,
  output: output,
  devtool: 'cheap-module-source-map',
  module: 
    rules: [
      
        test: /.jsx?$/,
        loader: 'babel-loader',
        exclude: /node_modules/,
        query: presets: ['es2015', 'react']
      ,
      
        test: /\.(woff|woff2|eot|ttf|svg|png|jpg|gif)$/,
        loader: 'file-loader?limit=1024&name=images/[name].[ext]'
      ,
      
        test: /\.(scss|css)$/,
        include: [path.resolve(__dirname, 'app/js/src/static/scss')],
        use: ExtractTextPlugin.extract(
          publicPath: '../',
          use: [
            
              loader: 'css-loader',
              options: 
                minimize: true,
                sourceMap: false
              
            ,
            loader: 'sass-loader'
          ],
          fallback: 'style-loader'
        )
      
    ]
  ,
  plugins: [extractSass],

;

if (env === 'production' || env === 'nondev') 
  config.devtool = 'nosources-source-map';

  config.plugins.push(
    new webpack.DefinePlugin(
      'process.env': NODE_ENV: '"production"'
    )
  );

  config.plugins.push(new webpack.optimize.UglifyJsPlugin(
    compress: warnings: false,
    comments: false,
    sourceMap: false,
    minimize: false
  ));


module.exports = config;

【问题讨论】:

您应该接受提交的答案或解释为什么它不适合您 【参考方案1】:

解决方案取决于您要构建的应用程序的类型。通常前端和后端 JavaScript 代码是分开打包的,有效地创建了两个输出包。

前端

对于前端/Web 项目,将 socket.io client 库添加到您的应用程序包中。无需包含任何节点依赖项 (fs) 或模拟条目,如 node: fs:'empty' 。您可以选择target:'web' 或将其省略,因为它是默认设置。

后端

选择target:'node' 并安装socket.io server 库。您不需要指定externals: ["fs"],如另一个答案所示,因为target: 'node' 将负责不捆绑pathfs 和其他内置模块。

最好避免npm i fs - 这是一个不必要的逃生舱口和安全风险。已经发生过使用通用包名的恶意 npm 包的案例。

您甚至可以考虑是否需要一个节点后端包。另一种方法是安装webpack-node-externals,它将所有或特定的npm包视为"externals"并将它们从捆绑包中排除:

var nodeExternals = require('webpack-node-externals');

module.exports = 
  target: 'node', // ignore built-in modules like path, fs, etc.
  externals: [nodeExternals()], // ignore all modules in node_modules folder
  // ...
;

这对后端来说很有意义,因为所有依赖项都在服务器启动时安装在 node_modules 中,并且不需要包含在包中。

从加载器中排除文件

要从某些加载器及其转换中排除文件,您可以使用exclude 模块规则。一个例子是从babel-loader 转换中省略node_modules

 test: /\.(jsx|js)$/, exclude: /node_modules/, loader: "babel-loader" 

Further reading

【讨论】:

这是一个更好的解决方案! 对于任何有兴趣在浏览器中加载 socket.io 的人来说,解决方案是使用不需要 fs 的 socket.io-client 模块【参考方案2】:

只需安装 fs (npm i fs),然后在你的 webpack 配置中添加

externals: ["fs"],

【讨论】:

fs 默认不可用吗?为什么npm i fs 当 webpack 尝试检索 socket.io 模块并在当前 socket.io 目录中搜索所需的库时发生此错误。如果你没有在当前项目目录下安装 fs,你应该安装它。 不确定这样做是否安全。来自 NPM 的注释:“这个包名当前没有被使用,但以前被另一个包占用。为了避免恶意使用,npm 挂在包名上,但是松散的,如果你,我们可能会给你想要。” IMO 最佳工作答案,因为它不需要加载节点。 不再工作“未捕获的 ReferenceError:fs 未在 eval 中定义(外部“fs”?a40d:1)”【参考方案3】:

如果有人仍然遇到此问题,您可以尝试以下解决方法。更新您的 webpack 文件以包含以下配置:

node: 
    fs: 'empty',

我们在项目中遇到了类似的问题,添加此特定配置解决了 webpack 中与“fs”相关的错误。 还值得检查 Webpack 版本的版本。我们不得不将 webpack 和 webpack cli 版本分别恢复为 4.0.04.2.0

【讨论】:

以上是关于未找到模块:错误:无法使用 Webpack 解析“fs”的主要内容,如果未能解决你的问题,请参考以下文章

未找到模块:错误:无法在 webpack.common.js 中解析

未找到模块:错误:无法解析 React-js?

未找到模块:错误:无法解析 JSON

未找到入口模块中的错误 - 在 Webpack 配置文件中

“未找到模块:错误:无法解析模块”错误在 signrequest-client 角度

bcrypt,将../node_modules/node-pre-gyp/lib/publish.js中的错误序列化:未找到模块:错误:无法解析'aws-sdk'