#javascript #node.js #webpack #antlr4
#javascript #node.js #webpack #antlr4
Вопрос:
Я столкнулся с ошибкой при использовании последней версии Webpack (5.1.0). Похоже, что конфигурация выдает ошибку, потому что схема проверки слишком ограничительна. Вот мой файл конфигурации webpack в целом и сообщение об ошибке, которое я вижу.
Webpack.config.js
https://gist.github.com/adarshbhat/3ec5950b66b78102da0cf46e51a3d633
Ошибка
[webpack-cli]
Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema.
- configuration.node should be one of these:
false | object { __dirname?, __filename?, global? }
-> Include polyfills or mocks for various node stuff.
Details:
* configuration.node has an unknown property 'module'. These properties are valid:
object { __dirname?, __filename?, global? }
-> Options object for node compatibility features.
* configuration.node has an unknown property 'net'. These properties are valid:
object { __dirname?, __filename?, global? }
-> Options object for node compatibility features.
* configuration.node has an unknown property 'fs'. These properties are valid:
object { __dirname?, __filename?, global? }
-> Options object for node compatibility features.
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! jstest@1.0.0 start: `webpack serve`
npm ERR! Exit status 2
Я пытаюсь использовать библиотеку генератора синтаксического анализа (antlr4), которая работает как в Node.js среде, а также в браузерах. Похоже, что код библиотеки требует глобальных объектов, таких как fs, и если он пуст, предполагается, что он находится в среде браузера. Согласно документации Antlr4 и документации Webpack, это поддерживаемый файл конфигурации. Но оно не работает. Пожалуйста, помогите.
Версии
- webpack: 5.1.0
- webpack-cli: 4.0.0
- webpack-dev-промежуточное программное обеспечение: 3.7.2
- webpack-dev-server: 3.11.0
Обновление (29 октября 2020)
Документация Antlr JavaScript теперь обновлена с новой конфигурацией для Webpack 5
Комментарии:
1. Похоже, вы пытаетесь использовать модули
fs
andnet
в браузерах, что невозможно2. Вы правы — библиотека пытается
require
использовать эти модули. Если он получает пустой объект, то предполагается, что он находится в среде браузера. Именно так библиотека может функционировать как в Node.js окружающая среда и среда браузера. Похоже, что другие люди смогли заставить это работать в более старых версиях Webpack.3. Лучшим решением является проверка, определено ли
window
илиdocument
:if (typeof window !== 'undefined') ...
если нет, то вы находитесь в node.js4. Согласен, что это не лучшее поведение. Однако это не под моим контролем. Это поведение уже реализовано в
antlr4
пакете библиотеки. Я просто бедняга, пытающийся его использовать. Я надеюсь, что Webpack исправит это, если это поддерживаемая конфигурация.
Ответ №1:
Мне удалось заставить это работать с некоторой помощью команды Webpack. Использование следующей конфигурации webpack, рекомендованной документацией antlr4, больше не поддерживается.
Не работает
{
node: {
fs: 'empty',
module: 'empty',
net: 'empty'
}
}
Рабочая конфигурация
{
resolve: {
fallback: {
fs: false
}
}
}
Благодаря этому я смог заставить свой анализатор JavaScript работать.
Пожалуйста, обратите внимание, что продолжаются попытки обновить antlr4 для генерации кода на основе ES6. Эта конфигурация может не понадобиться в будущем.
Комментарии:
1. это огромная проблема с потенциальным воздействием, и об этом нет ни слова ни в документации, ни в документах по миграции с версии 4 на версию 5 … webpack.js.org/configuration/node/#node
2. обратите внимание, что
false
вместо"empty"
в вашем примере здесь также используется для работы с v43. @tchakabam Я пытаюсь отправить PR для обновления документов. Можете ли вы подтвердить, что документированная конфигурация не работает и в Webpack 4?
4. отрицательный, он действительно работал с Webpack 4 на самом деле. эта проблема появилась, когда мы перешли на версию 5.
5. Та же проблема при попытке использовать webpack 5 с Next.js версия 10.2, аналогичная конфигурации, используемой для работы с webpack 4.
Ответ №2:
Next.js пользователи:
module.exports = {
webpack: (config, { isServer }) => {
if (!isServer) {
config.resolve.fallback.fs = false;
}
return config;
},
}
Ответ №3:
Точно для rails webpacker, если вы его используете, решение должно быть:
Внутри любого из config/webpack / * .js, который использует обычную пользовательскую конфигурацию (см. https://github.com/rails/webpacker#webpack-configuration подробнее), просто добавьте код, разрешающий и удаляющий свойство узла.
const { environment } = require('@rails/webpacker')
const customConfig = {
resolve: {
fallback: {
dgram: false,
fs: false,
net: false,
tls: false,
child_process: false
}
}
};
environment.config.delete('node.dgram')
environment.config.delete('node.fs')
environment.config.delete('node.net')
environment.config.delete('node.tls')
environment.config.delete('node.child_process')
environment.config.merge(customConfig);
module.exports = environment
Ответ №4:
Я столкнулся с такой же проблемой при работе со следующим js, я искал разные решения, такие как webpack5: false
или fs: false
, но это не сработало для меня.
config.node = {
// fs: 'empty'
global: true,
__filename: true,
__dirname: true,
}
это сработало для меня, потому что в webpack 3.0.0 для параметра node может быть установлено значение false, чтобы полностью отключить NodeStuffPlugin, поскольку мы работаем в JS и, особенно, в Next-JS, для которого требуется Node-JS, поэтому нам не нужно отключать его полностью, потому что, хотя ‘false’Webpack не коснулся бы вашего кода ‘__filename’ и вашего кода ‘__dirname’.
Любые исправления или рекомендации будут оценены, спасибо
Комментарии:
1. Большое вам спасибо! « [webpack-cli] Недопустимый объект конфигурации. Webpack был инициализирован с использованием объекта конфигурации, который не соответствует схеме API. — конфигурация. узел имеет неизвестное свойство ‘fs’. Эти свойства допустимы: object { __dirname?, __filename?, глобальный? } -> Объект параметров для функций совместимости узлов «
Ответ №5:
Достаточно интересно, что я получаю в случае path
(но не с file
) следующее сообщение, более понятное для CLI webpack:
BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
This is no longer the case. Verify if you need this module and configure a polyfill for it.
If you want to include a polyfill, you need to:
- add a fallback 'resolve.fallback: { "path": require.resolve("path-browserify") }'
- install 'path-browserify'
If you don't want to include a polyfill, you can use an empty module like this:
resolve.fallback: { "path": false }
Однако мне кажется, что эту информацию также следует найти здесь, и удалил утверждение о том, что любой встроенный модуль может использоваться там как свойство: https://webpack.js.org/configuration/node/#node
Ответ №6:
Если кто-то сталкивается с этой ошибкой в следующем JS, я нашел решение, отключив webpack 5, который установлен по умолчанию.
отключите его с помощью webpack5: false
next.config.js
Комментарии:
1. есть ли какие-либо побочные эффекты от изменения значения по умолчанию на не webpack5?