Javascript 全局变量在NodeJS中不工作

Javascript 全局变量在NodeJS中不工作,javascript,node.js,laravel-elixir,rollupjs,Javascript,Node.js,Laravel Elixir,Rollupjs,我试图让全局变量在node.js中工作,但似乎我并不真正理解这个概念,即使我的理解与文档相符 最小示例 我的main.js文件是使用汇总编译的: global.a = 1; require('./core/test.js'); 我的core/test.js文件很简单: console.log(a); 这会导致以下错误: 未捕获引用错误:未定义 完整编译的输出为: (function (exports) { 'use strict'; var commonjsGlobal = typeof

我试图让全局变量在node.js中工作,但似乎我并不真正理解这个概念,即使我的理解与文档相符

最小示例 我的main.js文件是使用汇总编译的:

global.a = 1;
require('./core/test.js');
我的core/test.js文件很简单:

console.log(a);
这会导致以下错误:

未捕获引用错误:未定义

完整编译的输出为:

(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)之后定义的。我不能100%确定这在JS中是否重要,但它可能会导致错误

所以我的问题是:这是什么原因,我做错了什么

可能相关信息:我正在使用拉维长生不老药来编译所有内容

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

编辑:附加上下文 我真正想做的是让Zurb基金会与Laravel Elixir合作,尽管No.js。我通过NPM安装了基础站点
foundation sites
依赖于它自己拉入的
jquery
。但是,基金会似乎并没有遵循通常的惯例,只使用诸如<代码> var jQuery=需求('jQuery);代码>在它自己的js文件中。它实际上依赖于可用的全局
jQuery
变量。因此,我必须以某种方式确保这一点

我的实际文件如下所示:

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

因此,如果有任何基金会/拉威尔特定的答案,我也很乐意听到。有没有我没有得到的东西,或者基金会没有把他们的包裹“正确”的方式创建吗?

< P>你应该是正确的,它应该工作。下面是一个工作示例:

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

// file2.js
console.log(a);
运行
node file1.js
,您将看到控制台上打印的
'hello'


看起来你正在使用其他工具(拉维/长生不老药)。直接使用node,看看会发生什么。

在我看来,您的捆绑包存在一个问题,它不尊重您执行这两行的顺序。你的消息来源显然是:

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;`
  }
};

诚然,这是一个黑客行为,但解决了我的捆绑问题(在我的情况下,从汇总中切换不是一个选项)。

@T.J.Crowder好的,将其编辑到底部。似乎global只是另一个对象,恰巧被命名为“global”。如果你用:global.a=1把一些东西放进去,那么你应该可以用:console.log(global.a)把它拿出来。@kokoko:No.NodeJS正是为了这个目的。我也是这么想的。您是否有一个指向说明
import
被明确定义为未在模块的分步控制流中执行的文档的链接?顺便说一下,我为这个问题添加了一些额外的上下文。也许你对这件事也了解得更多?