Webpack дерево встряхивает с непривычным импортом - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь разработать библиотеку, аналогичную Ax ios, как для клиентской, так и для серверной части. Я надеялся, что функция встряхивания дерева из веб-пакета поможет мне удалить мертвый код из импорта при использовании на стороне клиента, но это не так. Вот краткий пример кода:

import http from "http";
import https from "https";

export class FetchClient {
    static request(...) { ... }
};

export class FetchServer {
    static request(...) { ... }
}

Когда я импортирую только FetchClient, веб-пакет все еще включает в себя код для «http» и «https» в моем пакете, что делает пакет на ~ 100 КБ больше ожидаемого Несмотря на то, что он не используется в этом пути кода.

Также я посмотрел код для Ax ios, похоже, что они используют условную require вместо import (см. часть кода адаптера). Хитрость заключается в том, чтобы условно и поэтому асинхронно загружать зависимости http и https? В этом случае код все еще будет в моем пакете, чего я хотел бы избежать.

Примечание: я использую TerserPlugin (minimizer), "sideEffects": false в моих пакетах. json и модули полностью.

РЕДАКТИРОВАТЬ:

Мне удалось go обойти мою проблему, используя плагин WebPackPlaygin и разделив мой код на 3 файла: 2 файла, содержащие каждую реализацию ( для клиента и сервера) и основной файл, содержащий следующие логики c:

let adapter = null;
if (process.env.EXEC_ENV === "node") {
    adapter = (await import("./adapter/node.http.js")).default;
}
else if (process.env.EXEC_ENV === "web") {
    adapter = (await import(/* webpackMode: "eager" */"./adapter/window.fetch.js")).default;
}

Мне кажется довольно странным, что webpack не может сделать это сам, я думал, что это был флаг sideEffects за. Может быть, анализатор stati c недостаточно умен?

1 Ответ

0 голосов
/ 26 апреля 2020

import https from "https";

При таком импорте импортируются все файлы. Поскольку он не знает, может быть некоторая глобальная инициализация. В то же время HTTP и HTTPS модуль не будет доступен на стороне клиента. Так что это должно быть для просмотра.

Топор ios также включает follow-redirects, который включает в себя модуль HTTP и HTTPS.

Топор ios: transport = isHttpsProxy ? httpsFollow : httpFollow;

Это condition не требуется, это conditional возврат. adaptor pattern.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...