Node.js: как передать глобальную переменную в файл, вставленный через require()?
Я разделил свой gulpfile.js
на несколько файлов в папке /gulp
, чтобы упорядочить код немного лучше. Но теперь я хочу передать переменную debug (boolean)
в файлы, которые будут включать поведение команды gulp (в конечном итоге я буду использовать аргументы командной строки, но пока я просто хочу заставить ее работать с переменной).
Как я получил эту настройку, используя метод, который я видел в пакете yoman angular/gulp, использует модуль npm под названием require-dir
(который загружает все *.js файлы в /gulp
, где каждый из них имеет набор задач gulp, которые установлены).
gulpfile.js:
var gulp = require('gulp'),
run = require('run-sequence'),
debug = true;
require('require-dir')('./gulp');
gulp.task('default', ['build', 'server', 'watch', '...']);
Что бы загрузило что-то вроде...
gulp/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()
и node require()
, но я не мог понять, как получить задачу gulp внутри включенного файла, чтобы он мог быть запущен из основного файла gulpfile.js
(в желаемой последовательности).
Может ли кто-нибудь помочь? Благодаря
Ответы
Ответ 1
Нормальный способ модуля, действительно. Просто измените этот файл gulp/build.js
на то, что он не экспортирует ничего в надлежащий требуемый модуль:
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);
Ответ 2
Node.js предлагает одну глобальную переменную с именем global
, которая, по сути, является одним и тем же экземпляром во всех модулях (в отличие от module
, который отличается в каждом модуле). Установив значения на global
, они становятся действительно глобальными. В качестве дополнительного бонуса вам не нужен префиксный доступ к глобальным переменным с помощью global.
. Оба global.foo
и просто foo
эквивалентны, если у вас нет другой переменной с именем foo
в области.
Ответ 3
Я просто создаю один объект со всеми переменными в нем, которые я экспортирую в виде модуля, поэтому я могу использовать его во всех моих файлах задач. Например
JS/задачи/variables.js
module.exports = {
myBool: true
};
JS/задачи/sass.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;
});
JS/задачи/build.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"
});
/gulpfile.js
Затем вы можете получить/установить эти переменные из любого места:
var gulp = require('gulp'),
$ = require('gulp-load-plugins')(),
runSequence = require('run-sequence'),
vars = require('./js/tasks/variables'),
requireDir = require('require-dir')('./js/tasks');
gulp.task('production', function(){
runSequence('sass', 'build');
});