Поскольку заголовок вашего вопроса гласит: " на этапе сборки Babel ", я предполагаю, что вы хотели бы сделать разные сборки для настольных компьютеров и мобильных устройств (не одну для обоих и загружать необходимые модули динамически во время выполнения),Поэтому я бы сказал так:
Определите сценарии запуска в package.json
для настольных и мобильных устройств:
"scripts": {
"devmobile": "cross-env NODE_ENV=development PLATFORM=mobile webpack --progress",
"dev": "cross-env NODE_ENV=development webpack --progress",
}
... или вы можетесоздайте два разных webpack.config.js
файла для настольных и мобильных сборок, но я думаю, что выше легче ...
Затем npm run devmobile
для сборки для мобильных устройств и npm run dev
для настольных компьютеров.
Поскольку я в Windows, я использую пакет cross-env
, но это рекомендуемый способ быть независимым от ОС.
Тогда я быиспользуйте Webpack NormalModuleReplacementPlugin
:
(на основе этот пример )
В вашем webpack.config.js:
// defining the wanted platform for the build (comfing form the npm run script)
const targetPlatform = process.env.PLATFORM || 'desktop';
// then use the plugin like this
plugins: [
new webpack.NormalModuleReplacementPlugin(/(.*)-PLATFORM(\.*)/, function(resource) {
resource.request = resource.request.replace(/-PLATFORM/, `-${targetPlatform}`);
}),
]
...затем, если у вас есть эти два файла:
./storage-modules/storage-mobile.js
./storage-modules/storage-desktop.js
импортируйте нужный файл в ваш скрипт следующим образом:
import './storage-modules/storage-PLATFORM';
Таким образом, сгенерированная сборка будет содержать только файл, необходимый для текущегоПЛАТФОРМА, используемая для процесса сборки.
Другим возможным решением может быть ifdef-загрузчик , но я его не тестировал.Может быть, стоит попробовать, кажется, просто.
Если вы хотите создать хотя бы одну сборку и динамически импортировать нужный модуль, вы можете сделать что-то подобное в вашем app.js
(или как угодно):
// this needs to have defined when the app is running
const targetPlatform = process.env.PLATFORM || 'desktop';
import(
/* webpackChunkName: "[request]" */
`./storage-modules/storage-${targetPlatform}`
).then(storageModule => {
// use the loaded module
});
или:
(async () => {
const storageModule = await import(
/* webpackChunkName: "[request]" */
`./storage-modules/storage-${targetPlatform}`
);
// use the loaded module
})();
Чтобы это работало, Babel должен быть настроен .
Подробнее о Webpack с динамическим импортом здесь .