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

Bui*_*er1 12 javascript require node.js npm gulp

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

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

gulpfile.js:

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

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

gulp.task('default', ['build', 'server', 'watch', '...']);
Run Code Online (Sandbox Code Playgroud)

哪个会加载像......

吞掉/ build.js:

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

gulp.task('build', function () {
  console.log(debug);
});
Run Code Online (Sandbox Code Playgroud)

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

我怎么能让这个工作?

我正在考虑使用just module.exports()和node的require()方法,但我无法弄清楚如何在包含的文件中声明gulp任务,以便可以从主gulpfile.js文件(按照所需的顺序)运行.

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

Mik*_*ans 10

正常的模块方式,真的.只需更改该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);
  });
};
Run Code Online (Sandbox Code Playgroud)

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

...
var loadGulp = require('require-dir/gulp');
...
var debug = true;
loadGulp(debug);
Run Code Online (Sandbox Code Playgroud)

  • ......它仍然是javascript.`require('./ gulp/build')(debug);`工作正常,但看起来很奇怪,所以你可能想要更改module.exports以返回一个对象`{loadTask:function(debug){...相反,所以你的主代码调用看起来像`require('./ gulp/build').loadTask(debug);`而不是.在你的眼睛上更好,作为代码电话更明智. (2认同)

And*_*ner 6

Node.js提供了一个名为的全局变量global,实际上,module它是所有模块中的相同实例(不同于每个模块中的不同).通过设定值,global它们变得真正全球化.作为额外的奖励,您不需要使用前缀访问全局变量global..这两个global.foo和公正foo是等价的,只要你没有命名的另一个变量foo的范围.

  • 它们在某些情况下非常合适,例如在运行时可能会或可能不会更改但在整个应用程序中使用的变量.并非所有应用程序都是Web应用程序,有时它们是特定需求可能与正常意识形态不同的工作者.因此,这是正确的答案,而不是迈克上面的教条,基于他的理论"全球化是邪恶的".如果你是懒惰并且把所有东西放在全球范围内,全球是邪恶的,但它们存在是有原因的,并且有时为什么需要它们有无数的原因. (2认同)