Node.js:如何将全局变量传递到通过require()插入的文件中?

时间:2014-11-19 01:36:16

标签: javascript node.js npm require gulp

我已将gulpfile.js拆分为/gulp文件夹中的多个文件,以便更好地整理代码。但是现在我想将变量debug (boolean)传递给将切换gulp命令行为的文件(最终我将使用命令行参数,但是现在我只想让它与变量一起工作)

使用我在yeoman angular / gulp包中看到的方法,我使用了一个名为require-dir的npm模块(它加载了/gulp中的所有* .js文件。 1}}文件夹,其中每个文件夹都有一组设置的gulp任务)。

gulpfile.js:

var gulp = require('gulp'),
  run = require('run-sequence'),
  debug = true;

require('require-dir')('./gulp');

gulp.task('default', ['build', 'server', 'watch', '...']);

哪会加载类似......

吞/ build.js:

var gulp = require('gulp'), 
  plumber = require('gulp-plumber'),
  ...;

gulp.task('build', function () {
  console.log(debug);
});

因此,当我运行运行gulp任务的命令default时,它将加载build.js然后执行build gulp任务。但不幸的是,似乎debug返回undefined。

我怎么能让这个工作?

我一直在考虑使用module.exports()和节点的require()方法,但我无法弄清楚如何在包含的文件中获取gulp任务来声明,所以然后它可以从主gulpfile.js文件(按所需顺序)运行。

有人可以提供一些帮助吗?感谢

3 个答案:

答案 0 :(得分:9)

正常的模块方式,真的。只需将gulp/build.js文件更改为不实际将任何内容导出到正确的require-able模块:

module.exports = function(debug) {
  "use strict";

  var gulp = require('gulp'), 
      plumber = require('gulp-plumber'),
      ...;

  gulp.task('build', function () {
    console.log(debug);
  });
};

然后在主文件中将其称为:

...
var loadGulp = require('require-dir/gulp');
...
var debug = true;
loadGulp(debug);

答案 1 :(得分:6)

Node.js提供了一个名为global的全局变量,实际上,它是所有模块中的相同实例(与module不同,每个模块都不同)。通过在global上设置值,它们将变为真正的全球性。作为额外的奖励,您不需要使用global.对全局变量进行前缀访问。只要您在范围内没有另一个名为global.foo的变量,foofoo都是等效的。

答案 2 :(得分:2)

我只是创建了一个包含所有变量的对象,我将其作为模块导出,因此我可以在所有任务文件中使用它。例如

<强> JS /任务/ variables.js

<input type="date" /><input type="date" disabled>

<强> JS /任务/ sass.js

module.exports = {
    myBool: true
};

<强> JS /任务/ build.js

var gulp = require('gulp'),
    $ = require('gulp-load-plugins')(),
    log = $.util.log,
    vars = require('./variables');

gulp.task('sass', function () {
    log('myBool: ' + vars.myBool); // logs "myBool: true"
    vars.myBool = false;
});

<强> /gulpfile.js

然后你可以从任何地方获取/设置这些变量:

var gulp = require('gulp'),
    $ = require('gulp-load-plugins')(),
    log = $.util.log,
    vars = require('./variables');

gulp.task('build', function () {
    log('myBool: ' + vars.myBool); // logs "myBool: false"
});