Вам потребуется для использования веб-пакета (или другого упаковщика). Код не запускается, когда он упакован, поэтому у компилятора нет возможности узнать, какой ветви логики следовать (app_1 или app_2),Поэтому вам нужно войти в логику компоновщика, чтобы достичь своей цели.
Однако, это не так страшно, как кажется, так как в webpack есть встроенная возможность сделать это (сторонних разработчиков не требуется ...)
Я хотел бы изучить использование webpack.providePlugin
(https://webpack.js.org/plugins/provide-plugin)
или его родственника DefinePlugin
(https://webpack.js.org/plugins/define-plugin)
(Боюсь, что эти примеры не в моей голове, поэтому очень маловероятно, что они будут работать при первом проходе.)
Примеры:
Для обоих потребуется модуль поставщика...
// in path/provider.js
module.exports = {
live: '/path/to/live/image',
dev: '/path/to/dev/image'
}
Пример предоставления плагина
// in webpack
new webpack.ProvidePlugin({
imagePath: [
'path/provider', // the file defined above
process.env.ENVIRONMENT // either 'dev' or 'live'
]
}),
// in code
export default function Test() {
return (
<img src={imagePath} alt="" />
);
}
Пример определения плагина:
// in webpack
new webpack.DefinePlugin({
'process.env.ENVIRONMENT': JSON.stringify(process.env.ENVIRONMENT)
});
// in code
var providers = require('path/provider'); // same path provider as above
export default function Test() {
return (
<img src={providers[process.env.ENVIRONMENT]} alt="" />
);
}
В обоих случаях компоновщик вынужденсверните переменную до фактического литерального значения во время компиляции - до того, как произойдет объединение. Поскольку теперь вы свернули логический путь до единственного параметра, теперь можно свободно связывать только соответствующие активы.