我正在尝试为客户端和服务器端开发一个类似Axios的库。我希望webpack的摇树功能能帮助我在客户端使用时从导入中删除死代码,但事实并非如此。以下是代码的一个简短示例:
import http from "http";
import https from "https";
export class FetchClient {
static request(...) { ... }
};
export class FetchServer {
static request(...) { ... }
}
当我只导入FetchClient时,webpack仍然在我的捆绑包中包含"http"one_answers"https"的代码,这使得捆绑包比预期的大100KB,即使它没有在这个代码路径中使用。
我还查看了Axios的代码,它们似乎使用了条件require而不是import(请参阅适配器代码部分(。诀窍是先条件加载,然后异步加载http和https依赖关系吗?在这种情况下,代码仍然在我的捆绑包中,这是我想避免的。
注意:我一直在我的packages.json和模块中使用TerserPlugin(minimizer(,"sideEffects":false。
编辑:
我设法解决了我的问题,通过使用EnvironmentPlugin webpack插件,并将我的代码拆分为3个文件:2个文件包含每个实现(用于客户端和服务器(,主文件包含以下逻辑:
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标志的作用。也许静态分析器不够聪明?
import https from "https";
这样导入将导入所有文件。由于它不知道,可能存在一些全局初始化。同时HTTP和HTTPS模块在客户端上将不可用。因此,它必须被激怒。
Axios还包括follow-redirects
,包括HTTP
和HTTPS
模块。
Axios:transport = isHttpsProxy ? httpsFollow : httpFollow;
这不是condition
要求,这是conditional
返回。adaptor pattern
。