Webpack - критична залежність: запит залежності є виразом


86

Я отримую три попереджувальні повідомлення під час імпорту requestв проект веб-пакета без голови. Мінімальний приклад відтворення помилки доступний на GitHub (run npm installand npm start).

Critical dependency: the request of a dependency is an expression

Як я можу позбутися цього попередження?


Більше інформації:

Webpack намагається requireстатично вирішувати дзвінки, щоб зробити мінімальний пакет. Коли бібліотека використовує змінні або вирази в вимагають виклику (наприклад, require('' + 'nodent')в цих лініях в ajv), Webpack не може вирішити їх статично і імпортує весь пакет.

Моє обгрунтування полягає в тому, що цей динамічний імпорт не бажаний у виробництві, і код краще зберігати без попереджень. Це означає, що я хочу будь-яке рішення, яке вирішує проблему. Наприклад:

  1. Налаштуйте веб-пакет вручну, щоб імпортувати необхідні бібліотеки та запобігти появі попереджень.
  2. Додавання hack.jsфайлу до мого проекту, який певним чином перекриває необхідні виклики.
  3. Оновлення бібліотек. ajv-5.0.1-beta.3є виправлення, яке замовчує попередження. Однак, якщо я хочу використовувати його, мені доведеться почекати, поки він вийде, а потім har-validatorі requestвипустити наступні оновлення. Якщо є спосіб змусити har-validatorвикористовувати бета-версію ajv, це вирішить мою проблему.
  4. Інший

1. github.com/epoberezkin/ajv/issues/117#issuecomment-198328830 2. Я не думаю, що це спрацює 3. Вам доведеться трохи почекати.
esp

@esp: цей коментар github, здається, є тим, що я шукаю, але він не замовчує попередження. Якщо я зміню його на new webpack.IgnorePlugin(/async/, /ajv/), два з трьох попереджень зникнуть, але веб-пакет Cannot find module "../async". Будь-яке уявлення про належне магічне значення, щоб воно працювало?
Джодюг

Посилання на приклад коду github порушено. Будь ласка, покладіть код безпосередньо у питання.
CodeChimpy

Відповіді:


25

Вирішено за допомогою npm install request@2.79.0 --save

За словами авторів ajv, проблема, швидше за все, буде вирішена в останній версії requestчерез кілька тижнів.


@maembe спробуйте npm remove requestперевстановити, а потім у package.jsonвидаліть ^номер версії до. Якщо ви залишите ^, пакет може бути оновлений після npm updateі попередження з’явиться знову.
Джодюг

Не працював у мене. Але пропозиція @DhirendraNk в іншій відповіді нижче, яка стосується заміни webpack.ContextReplacementPlugin, спрацювала для мене.
Віль

10

Замініть це

new webpack.ContextReplacementPlugin(
        /angular(\\|\/)core(\\|\/)@angular/,
        helpers.root('./src'), // location of your src
        {} // a map of your routes
    ),

з цим-

new webpack.ContextReplacementPlugin( /(.+)?angular(\\|\/)core(.+)?/, root('./src'), {} )

8
Це справді працює. Було б непогано для більш поглибленого пояснення, чому зміна регулярного виразу вирішує цю проблему.
atconway

Це працює для мене, прикро бачити попередження, дякую.
Вілл

2
хтось знає, де знайти цей код? Я не можу знайти код для заміни.
Prem popatia

2
Це працює, оскільки ви вказуєте System.Importфункції, де знайти вихідний код у node_modulesпапці. Шлях змінюється залежно від версії Angular, яку ви використовуєте. З цим повинна працювати краще команда Angular, сподіваємось, це вже було.
Роберт Брісіта,

1

Це попередження може бути пов'язане з ін'єкціями пакунків у (залежності чи залежності від розробника).

Якщо проблема раптово з’являється, перевірте останню модифікацію у файлі package.json.

Подумайте про видалення package-lock.json, якщо ви плануєте перезапустити npm install.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.