#webpack #yarnpkg #webpack-5 #yarnpkg-v2
#webpack #yarnpkg #webpack-5 #yarnpkg-v2
Вопрос:
Я пытаюсь перейти на yarn 2 и сталкиваюсь с небольшим препятствием, когда дело доходит до «использования» загрузчиков на основе массива и правильного разрешения.
Вот выдержка из предыдущей рабочей конфигурации webpack.
...
{
test: /.(gif|png|jpeg|jpg|svg)$/i,
include: path.resolve(__dirname, "./static/images"),
use: [
"file-loader",
{
loader: "image-webpack-loader",
options: {
mozjpeg: { progressive: true },
gifsicle: { interlaced: true },
optipng: { enabled: false },
pngquant: { enabled: false }
}
}
]
},
...
Запуск yarn dlx @yarnpkg/doctor
возвращает следующее сообщение об ошибке.
assets/webpack.common.js:33:14: Webpack configs from non-private packages should avoid referencing loaders without require.resolve
Строка 33 столбец 14 — это символ открывающей скобки для ключа «использовать».
Когда я оборачиваю строки загрузчика в a require.resolve(...)
, я получаю ту же ошибку от команды yarn doctor.
У кого-нибудь есть идея, почему здесь возникает проблема? Это должно быть полностью нормально, основываясь на документах из webpack, но я не уверен, какой инструмент здесь испытывает трудности.
https://webpack.js.org/configuration/module/#ruleuse
Окружающая среда: OSX: 10.15.7 (19H15) — Каталина
node -v: v15.3.0
yarn —версия: 2.4.0
webpack: ~ 5.9.0
Комментарии:
1. Я нашел этот код ошибки здесь: yarnpkg.com/getting-started/migration#before-we-start , возможно , это стоит прочитать .
2. Я прочитал этот код ошибки в документах, и, к сожалению, он бесполезен. Выполнение того, что рекомендуется, не решает проблему. Похоже
require.resolve
, что это не работает, когда вы используете несколько распознавателей.3. Я считаю , что это просто Ошибка
doctor
… Регистрация проблемы в системе отслеживания ошибок Berry должна решить эту проблему. Чек находится здесь: github.com/yarnpkg/berry/blob /…
Ответ №1:
Это ошибка в @yarnpkg/doctor
, ошибка находится в этом блоке кода: https://github.com/yarnpkg/berry/blob/6b9df772ac785f73e6d08f0fc8c3f1718f296671/packages/yarnpkg-doctor/sources/cli.ts#L157-L159
if (name === `use` || name === `loader`) {
checkForUnsafeWebpackLoaderAccess(workspace, property.initializer, {configuration, report});
}
Приведенный выше блок кода обрабатывает значения для свойств use
и loader
как ссылку на загрузчик, но он не обрабатывает массивы, в вашем случае use
это массив.
Первый наивный способ исправить это внутри @yarnpkg/doctor
— изменить приведенный выше блок на:
if (name === `use` || name === `loader`) {
if (property.initializer.kind === ts.SyntaxKind.ArrayLiteralExpression) {
ts.forEachChild(property.initializer, childNode => {
if (childNode.kind !== ts.SyntaxKind.ObjectLiteralExpression) {
checkForUnsafeWebpackLoaderAccess(workspace, childNode, {configuration, report});
}
});
} else {
checkForUnsafeWebpackLoaderAccess(workspace, property.initializer, {configuration, report});
}
}
Способ, которым этот кодовый блок выше обрабатывает массив для loader
и use
свойства, заключается в посещении элементов и выполнении докторской проверки каждого элемента, который не является объектным литералом, объектные литералы будут обрабатываться во время рекурсии в processNode
функции. Это специальное ответвление для массивов необходимо для обработки элементов массива, не являющихся литералами объектов, особым образом — как ссылки на загрузчик.
Это всего лишь один из способов его реализации, другой возможный способ — помнить, что мы выполняем итерацию внутри loader
и use
массивов во processFile
внешних локальных переменных функции.