减小包大小
从您的生产构建中挤压最后几个字节数据
在优化应用程序性能时,每个字节都很重要。本页面介绍了一些配置更改,有助于减少Apollo 客户端's 压缩包大小:
- 关闭 Apollo 客户端的发展模式
- 选择一致的导入风格
关闭开发模式
默认情况下,Apollo 客户端处于“开发模式”。这意味着 Apollo 客户端执行额外的检查,浏览器控制台显示警告。您可以通过设置globalThis.__DEV__
为false
来禁用开发模式。这样做将关闭这些检查,但它们最终会包含在您的生产压缩包中——您必须告诉打包器在构建时删除这些检查!
您可以考虑删除这些检查将在生产压缩包中减少1-3 KB。
打包器特定配置
以下是一些与打包器相关的建议,用于配置打包器,以在构建时删除globalThis.__DEV__
。
Vite
Next.js
create-react-app
使用create-react-app
,您需要使用第三方包craco
来修改打包器配置。
esbuild
Webpack
Rollup
SWC
为什么使用globalThis.__DEV__
而不是process.env.NODE_ENV
?
Apollo Client使用__DEV__
变量而非process.env.NODE_ENV,因为后者的非Node.js环境中不可用。Apollo Client可以通过CDN使用ESM导入。在此场景下,在库中使用
process
变量会导致您的应用程序崩溃。
Apollo Client无法使用类似typeof process !== "undefined" && process.env.NODE_ENV !== 'production'
的守卫语句,因为一些打包器,例如esbuild
,无法在构建时替换像typeof process
这样的语句。Apollo Client的开发者代码在构建后会保留,导致包大小无减少。
相反,检查globalThis.__DEV__
不会使浏览器崩溃,并且可以被每个打包器消除。
导入Apollo Client
根据您的打包器的功能和设置,您可以使用多种从Apollo Client导入的方式。
选择导入风格
Apollo Client提供了两种导入风格:
// "main entrypoint import" styleimport { ApolloClient, InMemoryCache, useQuery } from "@apollo/client";// "deep entrypoint import" styleimport { ApolloClient, InMemoryCache } from "@apollo/client/core";import { useQuery } from "@apollo/client/react/hooks";
在使用许多现代打包器的情况下,您选择哪一种风格通常无关紧要。
但是,需要记住的是,打包器很复杂,它可能会产生影响——特别是当您的打包器拾取CommonJS工件而不是ESM工件时。
每个打包配置都是不同的,我们无法保证哪种风格会导致最小的包大小。我们建议在小型设置中尝试这些风格,以确定在您的环境中哪种效果最佳。
ⓘ 注意
某些入口点不是“main”入口点的一部分'@apollo/client'
,只能直接导入,例如,从'@apollo/client/link/batch'
。使用这些是完全可以的,即使是当使用“main”入口点时。
为什么要有一个较大的库?
Apollo Client不仅仅是数据获取器。它是一个规范请求和响应缓存、状态管理器和React组件集成器,包括React测试工具。
要使用其他库构建类似的经验,您需要编写自定义逻辑、库和组件包装器。将此自定义代码扩展到所有应用程序组件通常会创建比Apollo Client更大的包。
自定义实现还意味着您的团队需要额外的维护工作。通过使用Apollo Client,您将所有权转交给一个专门研究GraphQL客户端的团队。
遗留支持
Apollo Client v3支持遗留JavaScript语法,并包括对一些已弃用的功能的支持。类似地,v3提供了广泛的浏览器兼容性,回溯到IE11。
下一个主要版本将优先考虑现代浏览器的支持。这次过渡将通过删除不必要的polyfills和逐步淘汰遗留语法和功能的支持来简化客户端。这些更改最终会减小包大小,但需要发行一个主要版本的更新。