#javascript #webpack #babeljs #babel-loader
#javascript #webpack #babeljs #babel-загрузчик
Вопрос:
Я создаю универсальное приложение JavaScript, которое полагается на один конфигурационный файл. Конфигурация содержит в основном код, который может быть безопасно выполнен на сервере и в браузере, но определенные файлы и функции должны выполняться только на стороне сервера.
Я создал плагин Babel, который я использую вместе с babel-loader
, и я применяю этот загрузчик к самому конфигурационному файлу , а также к любому файлу, который требуется непосредственно из конфигурации, используя issuer
правило Webpack:
Соответствующие загрузчики Webpack:
{
test: paths.config,
use: [
{
loader: 'babel-loader',
options: {
plugins: [
[removeObjectProperties],
],
},
},
],
},
{
issuer: paths.config,
use: [
{
loader: 'babel-loader',
options: {
plugins: [
[removeObjectProperties],
],
},
},
],
},
Плагин removeObjectProperties:
function removeObjectProperties() {
return {
visitor: {
ObjectProperty: function ObjectProperty(path) {
if (['access', 'hooks'].indexOf(path.node.key.name) > -1) {
// Found a match - remove it
path.remove();
}
},
},
};
}
Используя приведенную выше конфигурацию Webpack, мой removeObjectProperties
плагин успешно удаляет все свойства только для сервера как из конфигурации верхнего уровня, так и из любых модулей, которые требуются непосредственно из него.
Проблема в том, что issuer
правило Webpack не применяется рекурсивно. Итак, если у меня есть файл, который требуется из файла, который требуется конфигурацией, загрузчик не применяется.
Я мог бы использовать некоторые рекомендации относительно того, как либо лучше достичь своих целей рекурсивного удаления определенных свойств объекта с помощью любого неизвестного количества требуемых модулей, либо определить какой-либо другой способ полностью отделить код только на стороне сервера от кода, который будет объединен и предоставлен браузерам.
Заранее благодарю вас!
Комментарии:
1. Попробуйте добавить каталог «требуемого» файла во включаемый ключ webpack.js.org/configuration/module/#ruleinclude используя этот синтаксис: webpack.js.org/configuration/module/#condition
2. Привет @ColdFridge — спасибо за ваше предложение. К сожалению, приложение позволяет пользователю размещать свои конфигурационные файлы где угодно, в том числе над каталогом, содержащим их базовый скрипт. Так что я не думаю, что это сработает. Кроме того, упомянутый вами подход может вызвать некоторые нежелательные побочные эффекты, такие как запуск загрузчика в файлах, которые полностью отделены от файлов конфигурации моего приложения.