Ошибка веб-пакета — конфигурация.узел имеет неизвестное свойство ‘fs’

#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 and net в браузерах, что невозможно

2. Вы правы — библиотека пытается require использовать эти модули. Если он получает пустой объект, то предполагается, что он находится в среде браузера. Именно так библиотека может функционировать как в Node.js окружающая среда и среда браузера. Похоже, что другие люди смогли заставить это работать в более старых версиях Webpack.

3. Лучшим решением является проверка, определено ли window или document : if (typeof window !== 'undefined') ... если нет, то вы находитесь в node.js

4. Согласен, что это не лучшее поведение. Однако это не под моим контролем. Это поведение уже реализовано в 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" в вашем примере здесь также используется для работы с v4

3. @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?