【问题标题】:Shim config not supported in Node, may or may not workNode 不支持 Shim 配置,可能有效,也可能无效
【发布时间】:2015-10-29 06:50:00
【问题描述】:
我正在开发一个在浏览器上运行良好的项目,现在我们正在尝试使用 nodejs 在服务器端运行它。
我有以下配置:
当我试图在 nodejs 上运行我的项目时,得到错误:
Shim config not supported in Node, may or may not work
由于模块和依赖项 (AMD) 在浏览器上运行良好,我假设 shims 配置是正确的。
如果我遗漏了什么,请告诉我?
https://github.com/jrburke/requirejs/issues/1443
问候
马尼什
【问题讨论】:
标签:
node.js
requirejs
r.js
【解决方案1】:
由于模块和依赖项 (AMD) 在浏览器上运行良好,我假设 shims 配置是正确的。
这是一个错误的假设。问题在于 Node.js 使用一组与浏览器工作方式截然不同的基本假设运行。考虑一下这个说法:
var foo = "something";
如果您在 Node.js 的范围顶部执行此操作,则您创建了一个变量,该变量是 Node 正在执行的文件的本地变量。如果你真的想让它成为全球性的,那么你必须明确地将它推入global。
现在,将相同的语句放在您在浏览器中加载的带有script 元素的脚本的顶部。相同的语句创建了一个全局变量。(无论var 是否存在,该变量都是全局的。)
RequireJS 的shim 配置用于预期第二种行为的脚本。他们期望 a) 他们在其作用域顶部声明的任何内容都会泄漏到全局空间,并且 b) 他们所依赖的脚本已经泄漏到全局空间的任何内容都可以在全局空间中使用。在 Node.js 中,这两种期望几乎总是错误的。 (为 node 设计的模块操作 global 并非不可能,但这种情况非常罕见。)
RequireJS 的作者在issue report 中解释说,他认为 RequireJS 尝试在 Node.js 中复制浏览器行为是不可取的。我同意他的看法。如果你想在后端运行前端代码,你应该将浏览器中需要shim的模块替换为设计用于在Node中运行的模块。