Я пытаюсь разработать библиотеку, аналогичную 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 недостаточно умен?