我正在研究一个在浏览器上工作正常的项目,现在我们尝试使用nodejs在服务器端运行它。
我有以下配置:
当我尝试在nodejs上运行我的项目时,将错误视为:
Shim config not supported in Node, may or may not work
由于模块和依赖项(AMD)在浏览器上工作正常,我认为shims配置是正确的。
如果我错过了什么,请告诉我?
https://github.com/jrburke/requirejs/issues/1443
此致 和Manish
答案 0 :(得分:0)
由于模块和依赖项(AMD)在浏览器上工作正常,我认为shims配置是正确的。
这是一个不正确的假设。问题是Node.js运行时有一组与浏览器工作方式截然不同的基本假设。请考虑以下声明:
var foo = "something";
如果您在Node.js中的范围顶部执行此操作,则您已创建了一个变量,该变量是Node正在执行的文件的本地变量。如果确实希望将其设为全局,那么您必须明确地将其推送到global
。
现在,将相同的语句放在您使用script
元素的浏览器中加载的脚本范围的顶部。相同的语句创建一个全局变量。(无论var
是否存在,变量都是全局变量。)
RequireJS' shim
配置用于期望第二种行为的脚本。他们希望a)他们在其范围顶部声明的任何内容都泄露给全球空间,b)任何通过他们所依赖的脚本泄露到全球空间的东西都可以在全球空间中使用。在Node中,这两个期望几乎都是假的。 (设计用于节点的模块操作global
并非不可能,但这种情况非常罕见。)
RequireJS的作者在此issue report中解释说,他认为RequireJS尝试复制Node中的浏览器行为是不可取的。我同意他的看法。如果要在后端运行前端代码,则应将浏览器中需要shim
的模块替换为设计为在Node中运行的模块。