Проблема с вашим конфигом в том, что он опирается на свойство rule.loader
, но правило также может быть определено в секциях конфига use
или oneOf
.
Еще одна проблема заключается в том, что внутренняя конфигурация nuxt имеет несколько правил с url-loader
(для изображений, видео, шрифтов ...).
В вашем случае правило, которое вы пытались найти, имеет раздел use
и там определено url-loader
, поэтому ваша функция find
ничего не нашла и вызвала эту ошибку:
{
"test": /\.(png|jpe?g|gif|svg|webp)$/,
"use": [{
"loader": "url-loader",
"options": {
"limit": 1000,
"name": "img/[hash:7].[ext]"
}
}]
}
В отзывчивом загрузчике вы должны удалить расширения, которые вы хотите обработать с помощью responsive-loader
из правила url-loader
, чтобы избежать непредвиденного поведения и конфликтов, вот пример работы функции extend
:
extend(config, ctx) {
let imgTest = '/\\.(png|jpe?g|gif|svg|webp)$/';
// find by reg ex string to not rely on rule structure
let urlRule = config.module.rules.find(r => r.test.toString() === imgTest);
// you can use also "oneOf" section and define both loaders there.
// removed images from url-loader test
urlRule.test = /\.(svg|webp)$/;
config.module.rules.push({
test: /\.(png|jpe?g|gif)$/,
loader: "responsive-loader",
options: {
// place generated images to the same place as url-loader
name: "img/[hash:7]-[width].[ext]",
min: 350,
max: 2800,
steps: 7,
placeholder: false,
quality: 60,
adapter: require("responsive-loader/sharp")
}
})
}
Да, это выглядит грязно, но я думаю, что пока единственный способ изменить какой-либо загрузчик.
Как насчет vuetify - я думаю, что оба загрузчика будут конфликтовать друг с другом, и, вероятно, решение состоит в том, чтобы использовать один загрузчик, который будет работатьс вашими изображениями.
Надеюсь, это поможет.
Обновление для Nuxt> = 2.4.0:
Они изменили массив правил, обновите следующую строку:
let imgTest = '/\\.(png|jpe?g|gif|svg|webp)$/i';
Тогда код должен снова работать нормально.