Игнорирование конкретных require () в Webpack? - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть библиотека, совместимая с NodeJS и браузером, и обе они запускаются через Webpack для создания окончательного пакета.Проблема, с которой я сталкиваюсь, заключается в том, что Webpack перепишет все операторы require() в __webpack_require__() и попытается связать библиотеку, которая не работает для таких вещей, как fs и worker_threads.Как заставить его игнорировать определенные require() s и связанные с ними механизмы (require.resolve(), import и т. Д.) При заданной входной строке?

Я читал, что могу использовать webpack.IgnorePlugin, ноЯ бы предпочел, чтобы пользователь не добавлял в свою сборку специальное правило для моей библиотеки.Я также не мог заставить это работать, он все еще переписал require() s.Я также читал, что я могу сделать eval('require("fs")'), но это кажется глупым, но я готов сделать это, если это действительно лучший способ.

Пример:

//example.js
if(typeof window !== "undefined") {
    //Browser
    var myWorker = new Worker();
}
else {
    //NodeJS
    var Worker = require("worker_threads"); //I want Webpack to keep this line as-is
    var myWorker = new Worker();
}

1 Ответ

0 голосов
/ 09 октября 2018

Чтобы сохранить require вызов как есть в вашем коде после объединения с Webpack, просто замените require на __non_webpack_require__.Итак, ваш пример будет выглядеть следующим образом:

if (typeof window !== "undefined") {
    var myWorker = new Worker();
}
else {
    var Worker = __non_webpack_require__("worker_threads");
    var myWorker = new Worker();
}

Это скрытая функция Webpack (возможно, потому что она используется не очень часто), обнаруженная здесь , которая игнорирует require вызовов, такони могут быть оценены при запуске приложения, а не когда оно в комплекте.

Обратите внимание, что это не следует использовать для приложений, ориентированных на веб-браузер, так как это приведет к использованию resolve, и веб-браузеры нене знаю что такое resolveИспользуйте его только в коде, который нацелен на Node.

...