【问题标题】:Node modules undefined in my webpack bundled script我的 webpack 捆绑脚本中未定义的节点模块
【发布时间】:2018-11-06 05:47:29
【问题描述】:

我正在制作一个基于 jped 图片的网络应用程序,它可以识别字符并将其呈现在用户的交互式界面中 - 这包括一些异步代码。有 4 个 js 脚本文件,它们都需要 npm 模块和一个 html 视图。

为了测试应用程序客户端,我决定将脚本捆绑在一起。 它显示以下错误消息:

Uncaught ReferenceError: require is not defined

我的 npm 模块列表,其代码在运行时返回此错误:

我试过了:

  1. browserify 我的脚本打包成一个包,但我读到它不适用于异步函数;
  2. webpack 将脚本打包成一个包,但是像 fs 和 child_process 这样的节点模块正在返回 'undefined' ;
  3. 添加特定的 Node 模块 child-process-ctor,以强制将 child_process 包含在其中

唉,返回相同的错误消息。

问题:

  1. 捆绑脚本是正确的方法吗?
  2. 是webpack没有转译fs和child_processcorrectly的问题吗?
  3. 我应该考虑哪些可能的解决方案?

谢谢大家 :-) 这是我关于 SO 的第一个问题——欢迎任何反馈!

PS:这对于Using module "child_process" without Webpack 可能是多余的。

【问题讨论】:

  • 我假设当您说要运行 node.js“客户端”时,您的意思是您希望为客户端提供一个更干净的前端包,而不是公开所有开发脚本。那是对的吗?如果是这样,您是否查看过类似这样的 node-webpack 库:github.com/shakacode/node-webpack-async-example
  • @YAHsaves :我可能会误解自己。当我说我想在“客户端”运行 node.js 时,我的意思是我的应用程序旨在无服务器使用,全部来自浏览器或客户端。我仅将节点用于 npm 模块(inc;. tesseractocr)。我刚读了你的链接。您的 node-webpack-async-example 是否有助于在我的应用程序中使用外部模块和 Node 模块(fs、child_process)?谢谢!!
  • @emond 如果你想在浏览器中运行你的脚本 node.js 模块将不起作用。 Node js 模块需要 node.js 运行时。因此,为了让它在“客户端”工作,您的客户端需要安装 node.js,并且他们需要从节点命令行(或任何其他类似机制)运行您的脚本。
  • @YAHsaves 哇,这是一个实现。我认为 Node.js 模块设计为在服务器上运行......但天真地认为 browserify/webpack 捆绑器会创建“静态资产”,然后可以在客户端运行而无需 Node.js 运行时环境.显然我误解了这一点。因此,如果我的应用程序仅在客户端运行,我不应该首先使用 Node.js,对吗?
  • 你说 node.js 可以在服务器上运行是正确的。那是因为服务器将安装 node.js 及其所有依赖项。但是,当在服务器上使用 node.js 时,它基本上变成了 php。它是一个后端处理脚本,使服务器输出网站文件。很容易将“node javascript”与“browser compatible”混淆,因为它们都是“javascript”,但是 node 模块是将 node 与常规 javascript 区分开来并且需要 node 运行。所以如果你想运行这个真正的客户端,你需要找到节点的替代品。

标签: javascript node.js webpack browserify


【解决方案1】:

好的,这个答案是对我的 cmets 的跟进,它更直接地回答了这个问题。但是在这里,我将详细介绍可能不必要的内容,但它将彻底回答您的要求。此外,它具有教育意义,我会说一旦你开始真正深入研究它就会很有趣:D

从头开始。随着互联网在早期变得更加先进,对一种“前端逻辑”的需求也在增加,而 Netscape 对这一需求的回应是在创纪录的时间内诞生了一种具有竞争力的尖端编程语言。

我所说的创纪录时间是指 10 天,而竞争性是指几乎没有功能。

没错,Javascript 在 10 天内诞生 (literally)。正如你可以想象的那样,它是一种非常糟糕的语言,但它运行良好,人们开始使用它。

因为它是互联网的编程语言,而且由于互联网的发展速度如此之快,所以有足够多的人开始使用它,以至于删除它的想法变得可怕。

如果您更改它,您将破坏与数百万个网站的向后兼容性。另一个想法是保留它,但也要实施新标准。然而,这很难证明这一点,因为 javascript 已经花费了大量工作来维护,维护多个标准将是一场噩梦(咳...flash 咳)。

Javascipt 对“新”程序员来说很容易学习,但问题是在 php、ruby、mySql、Mongo、Css、Html 都在各自王国中作为统治王者统治的世界中,javascript 是唯一的一种语言。

所以someone 认为将 javascript 移动到服务器是一个好主意,因此 node.js 诞生了。

但是,要让 javascript 表示服务器上的任何内容,它必须能够执行您不希望它能够在浏览器中执行的操作。例如,扫描您的硬盘驱动器并编辑您的文件。

如果您访问的每个网站都可以开始扫描并上传系统中的所有内容well....

但是,如果您的服务器软件无法编辑或读取文件,您需要将其发送至well....

你明白了。它是相同的语言,但由于安全问题 node.js 有一些差异。主要是它允许使用的模块。

现在是有趣的部分。你可以在浏览器中运行 node.js 客户端吗?技术上是的。事实上,现在我们将整个operating systems 转储到一个名为asm.js 的javascript 子集中,没有任何javascript 无法处理足够的处理能力。

但是,即使您将整个 node.js 引擎(基本上是 chrome 的精简版)转储到 asm.js 中,您仍然会受到“主机”浏览器设置的相同安全限制,因此您的模块只能在浏览器提供的沙箱中运行。

所以从技术上讲,它只是另一个浏览器中的一个浏览器,以一半的速度运行,具有相同的安全限制。

这是我推荐做的事情吗?当然不是。

这是人们以前从未尝试过的东西吗?当然不是。

所以我希望这有助于回答你的问题。

【讨论】:

  • 这很有帮助,这远远超出了我的问题:坦率地说,这正是我需要阅读的内容,但不知道要问什么/如何问。再次感谢@YAHsaves!我解决问题的方法是错误的——如果不是你帮助我,我可能会浪费更多时间:-)
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2016-10-13
  • 2022-12-23
  • 1970-01-01
相关资源
最近更新 更多