繁体   English   中英

全局变量在NodeJS中不起作用

[英]Global variable not working in NodeJS

我正在尝试让全局变量在node.js中工作,但是即使我的理解与文档相符,我似乎也不是很了解这个概念。

最小的例子

我的main.js文件是使用汇总编译的:

global.a = 1;
require('./core/test.js');

我的core / test.js文件很简单:

console.log(a);

这会导致错误:

未捕获的ReferenceError:未定义

完全编译后的输出为:

(function (exports) {
'use strict';

var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};

console.log(a);

commonjsGlobal.a = 1;

}((this.LaravelElixirBundle = this.LaravelElixirBundle || {})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIkM6L3dhbXAvd3d3L3V1YmMvcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb3JlL3Rlc3QuanMiLCJDOi93YW1wL3d3dy91dWJjL3Jlc291cmNlcy9hc3NldHMvanMvYXBwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnNvbGUubG9nKGEpO1xyXG4iLCJnbG9iYWwuYSA9IDE7XHJcbnJlcXVpcmUoJy4vY29yZS90ZXN0LmpzJyk7XHJcbiJdLCJuYW1lcyI6WyJnbG9iYWwiXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUNBZkEsY0FBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7OyJ9

看来, a被定义 console.log(a); 我不确定这在JS中是否重要,但可能会导致错误。

所以我的问题是:是什么原因造成的?我在这里做错了什么?

可能相关的信息:我正在使用Laravel Elixir编译所有内容。

注意:请不要发布关于是否在node.js或一般情况下使用全局变量的讨论。 我知道这通常是个坏主意,但在这种情况下,我有充分的理由这样做。

编辑:其他上下文

我真正想做的是通过node.js让Zurb Foundation与Laravel Elixir一起工作。 我通过NPM安装了foundation-sites foundation-sites依赖于jquery ,它本身就可以提取。 但是 ,Foundation似乎并没有遵循仅使用var jquery = require('jquery');类的常规约定var jquery = require('jquery'); 在自己的js文件中。 它实际上依赖于可用的全局jQuery变量。 因此,我必须确保以某种方式。

我的实际文件如下所示:

global.jQuery = global.$ = require('jquery');
require('foundation-sites');

因此,如果有任何特定于Foundation / Laravel的答案,我也将很高兴听到他们的声音。 我有没有得到的东西,或者Foundation是否没有以“正确”的方式创建他们的软件包?

您是正确的,它应该工作。 这是一个工作示例:

// file1.js
global.a = 'hello';
require('./file2');

// file2.js
console.log(a);

运行node file1.js ,您将看到'hello'打印到控制台。

看来您正在使用其他工具(Laravel / Elixir)。 直接使用节点,看看会发生什么。

在我看来,您的捆包机似乎有问题,不尊重您执行这两行的顺序。您的来源显然是:

global.a = 1;
require('./core/test.js');

...但是捆绑结果显然是相反的:

console.log(a);
commonjsGlobal.a = 1;

似乎正在挂起require调用。 通常,在执行控制流的特定位置进行require调用的操作不是最佳实践(实际上,在为ES2015定义模块时, import被明确定义为不在模块的逐步执行中)控制流)。

因此,如果需要执行此操作,则可能需要查看另一个捆绑器。 但是请检查它是否支持依赖关系解析顺序以外的其他顺序。

好了,我通过使用browserify而不是rollup ,以一种非常简单的方式解决了这个问题。 感谢您为我指明正确方向的其他答案。 这不是一个完美的解决方案,而且我仍然不完全了解两者之间的区别,但是它将对本项目有用。

我的gulpfile的相关部分:

mix.browserify('app.js','public/js/app.js');

要使用browserify与Laravel仙丹,我用

npm install laravel-elixir-browserify-official --save-dev

我通过提供设置所需变量的output.intro解决了汇总问题。 在您的情况下,这将是:

// rollup.config.js
export default {
  // ...
  output: {
    // ...
    intro: `let a = 1;`
  }
};

诚然,这可以算作是骇客,但在我的案例中解决了捆绑问题(不能选择放弃汇总)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM