#javascript #reactjs #gulp #browserify #envify
#javascript #reactjs #глоток #browserify #envify
Вопрос:
У меня возникли проблемы с модулем Browserify Envify в универсальном приложении React.
У меня есть следующий файл переключения функций:
export const featureToggles = {
FEATURE_EXAMPLE: (process.env.FEATURE_EXAMPLE === 'true')
};
который в моем выводе Browserify становится
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.featureToggles = void 0;const featureToggles = {
FEATURE_EXAMPLE: process.env.FEATURE_EXAMPLE === 'true' };exports.featureToggles = featureToggles;
Когда я использую свое универсальное приложение React featureToggles
, я получаю правильный ответ от сервера, но клиент перезаписывает при увлажнении. В результате новая функция с сервера заменяется старой функцией при гидратации клиента.
Мой скрипт Browserify выглядит следующим образом (этот фрагмент будет повторяться несколько раз ниже с небольшими изменениями, основанными на том, что я пробовал):
const envify = require('envify/custom');
// function declarations etc
browserify()
.transform(
babelify.configure({
ignore: [/(bower_components)|(node_modules)/]
})
)
.transform(envify(process.env))
.bundle()
.on('error', handleError)
.pipe(source('app.js'))
.pipe(buffer())
.pipe(gulpif(globalSettings.production, stripDebug()))
.pipe(gulpif(globalSettings.production, uglify()))
.pipe(gulp.dest(taskSettings.scripts.dest));
Я попытался заменить пользовательский envify на обычный (примеры отсутствуют в их readme):
const envify = require('envify');
// function declarations etc
browserify()
.transform(
babelify.configure({
ignore: [/(bower_components)|(node_modules)/]
})
)
.transform(envify)
.bundle()
// same as before here
.pipe(gulp.dest(taskSettings.scripts.dest));
Я попытался установить переменную явно:
const envify = require('envify/custom');
// function declarations etc
browserify()
.transform(
babelify.configure({
ignore: [/(bower_components)|(node_modules)/]
})
)
.transform(envify({FEATURE_EXAMPLE: 'please, something'})
.bundle()
// same as before here
.pipe(gulp.dest(taskSettings.scripts.dest));
Я пробовал очищать:
const envify = require('envify/custom');
// function declarations etc
browserify()
.transform(
babelify.configure({
ignore: [/(bower_components)|(node_modules)/]
})
)
.transform(envify({_: 'purge', FEATURE_EXAMPLE: 'please, something'})
.bundle()
// same as before here
.pipe(gulp.dest(taskSettings.scripts.dest));
Я попытался запустить его глобально:
const envify = require('envify/custom');
// function declarations etc
browserify()
.transform(
babelify.configure({
ignore: [/(bower_components)|(node_modules)/]
})
)
.transform({global: true}, envify({FEATURE_EXAMPLE: 'please, something'})
.bundle()
// same as before here
.pipe(gulp.dest(taskSettings.scripts.dest));
Я унаследовал код, поэтому я в основном просто шарю в темноте. Любая помощь будет оценена!
Из того, что я понимаю из envify, я ожидаю следующего вывода:
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.featureToggles = void 0;const featureToggles = {
FEATURE_EXAMPLE: 'true' === 'true' };exports.featureToggles = featureToggles;
Если есть какая-либо помощь, мои функции-переключатели работают локально, но не в моей промежуточной среде. Сначала это также не сработало, когда я перебирал свои функции и читал process.env
динамически. Что означало бы, что envify хотя бы что-то делает?
Ответ №1:
Дьявол кроется в деталях. Как я уже сказал в своем вопросе, проблема возникла только на моем промежуточном (и, вероятно, prod) сервере. Итак, через некоторое время я наткнулся app.json
на файл настроек Heroku, частично отвечающий за отправку настроек, какие переменные среды должны быть установлены.
Итак "FEATURE_EXAMPLE": { "required": false}
, добавление "env": {}
в мою app.json
исправленную проблему.
Мне все еще любопытно, почему я все еще вижу переменную в своей папке dist вместо ее замены.