【问题标题】:Error loading in audiosprite - Module not found: 'child_process'在 audiosprite 中加载错误 - 找不到模块:'child_process'
【发布时间】:2017-07-04 12:07:54
【问题描述】:

我正在尝试在我的 React 应用程序中加载 audiosprite,该应用程序在 Webpack 服务器上运行,我收到以下错误:

未找到模块:“child_process”在 C:\Users\BenLi\Desktop\development 项目\app\node_modules\audiosprite

不知道这可能是什么,也不知道为什么这个模块会出现这种情况,显然,Webpack 不应该抛出 child_process 错误。

我将它包含在我的应用中,如下所示:

import audiosprite from 'audiosprite';

文件中来自这里的错误:

function spawn(name, opt) {
  opts.logger.debug('Spawn', { cmd: [name].concat(opt).join(' ') })
  return require('child_process').spawn(name, opt)
}

如何解决这个错误?

【问题讨论】:

  • 非常棘手的问题(难以调试您看不到的代码)。感谢您提供赏金并选择正确的答案。

标签: javascript node.js npm webpack ecmascript-6


【解决方案1】:

TL;DR

没有解决这个问题的方法,除非您(可能)切换到提供browserify-fs 模块的Browserify(需要自己测试)。由于浏览器无论如何都无法访问文件系统或子进程,因此无法在此用例中使用模块 audiosprite。浏览器不能做它不能做的事情。

说明

这是因为 Webpack。默认情况下,Webpack 旨在编译代码以在 Web 浏览器环境中运行。它存在的全部原因是将所有内容捆绑在一起以使浏览器友好(因此名称为“webpack”)。

Node 提供了一些内置模块,例如child_process、path、os、fs 等只存在于 Node 环境中。当 Webpack 出现并尝试为浏览器捆绑代码时,浏览器无法访问这些模块。因此,当audiosprite 之类的模块使用child_process 时,Webpack 默认将它们捆绑到网络上,您不再可以访问这些模块。这就解释了为什么错误报告“找不到模块”。

“解决方案”

“修复”是指定您的 Webpack 配置以编译以在类似 Node 的环境中使用,您确实可以访问这些内置模块。这样,Webpack 就不会与内置模块混淆,并且可以使用 child_process。您可以通过指定target 选项来执行此操作。来自the Webpack Configuration documentation:

target

  • "web" 编译在类似浏览器的环境中使用(默认)
  • "node" 编译在类似 node.js 的环境中使用(使用 require 加载块)

(为简洁起见,文档被删减)

但是有一个后果。由于您将目标设置为 Node 环境,因此在使用浏览器时 require 将不起作用,因为浏览器环境中没有 require。

您可以做的是保持目标环境相同(默认为"web")并尝试根据您的需要模拟模块。用node option:

node

包括各种节点内容的 polyfill 或 mock:

  • <node buildin>: true, "mock", "empty" 或 false

并将其应用到 Webpack 配置文件中:

node: {
    fs: "mock"
}

但这会错误地告诉你:

错误:没有可用的 node.js 核心模块“fs”的浏览器版本

所以这只是设计使然。您无能为力,因为捆绑浏览器环境将不可避免地禁止您访问文件系统,因为它不能。您不能为执行浏览器中不可能完成的事情的模块提供浏览器模拟。 child_process 和其他人也是如此。

编辑:我一直在寻找一些替代方案,Browserify 可能有效,也可能无效。他们确实提供了一个browserify-fs 模块来替代Node 的fs。我还没有对此进行测试,所以我不确定它是否有用,但它看起来比 Webpack 现在做的更好。

【讨论】:

  • 您好,感谢您的回复。我已将目标:“节点”添加到 webpack 配置文件的末尾,但它抛出错误:ReferenceError:未定义要求。知道是什么原因造成的吗?
  • 请与我裸露,因为我对这一切都很陌生。我在 webpack 配置文件中添加了 exclude 行,如下所示: module:{ loaders: [{ exclude: /node_modules/, }] } 但它仍然给我同样的错误......不确定我是否做对了?
  • 您可以在此处查看:jsfiddle.net/yqus3g2z 我已将其与其他加载器一起添加到其中
  • 请注意完全确定您的意思是“就像我对包含所做的那样”?如果这可以帮助您进一步调试,这里还有完整的 webpack 文件? jsfiddle.net/yqus3g2z/1
  • 好的,所以现在它在 audiosprite.js 中给我一个错误,说 Module not found: 'fs' in C:\Users\BenLi\Desktop\development projects\music-app\node_modules\audiosprite
【解决方案2】:

我猜你必须让 NPM 安装依赖 只是

npm install --save autiosprite

【讨论】:

  • 我认为您以某种方式将其包含在浏览器中,而不是让依赖项存在于 nodejs 中。也许这个问题有点相关:github.com/webpack/webpack/issues/744
  • 如果我将它包含在浏览器中,它仍然有同样的问题
  • 更新了我的问题,如果您知道用其他东西替换该行的方法,那么错误在哪里
猜你喜欢
  • 2017-02-17
  • 2017-01-17
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2018-12-30
相关资源
最近更新 更多