Mirror: The small sibling of the graphql package, slimmed down for client-side libraries.
1<div align="center">
2 <h2 align="center">graphql-web-lite</h2>
3 <p align="center"><strong>The small sibling of the <code>graphql</code> package, slimmed down for client-side libraries</strong></p>
4 <br />
5 <a href="https://npmjs.com/package/graphql-web-lite">
6 <img alt="NPM Version" src="https://img.shields.io/npm/v/graphql-web-lite.svg" />
7 </a>
8 <a href="https://npmjs.com/package/use-interactions">
9 <img alt="License" src="https://img.shields.io/npm/l/graphql-web-lite.svg" />
10 </a>
11 <a href="https://bundlephobia.com/result?p=graphql-web-lite">
12 <img alt="Minified gzip size" src="https://img.shields.io/bundlephobia/minzip/graphql-web-lite.svg?label=gzip%20size" />
13 </a>
14 <br />
15 <br />
16</div>
17
18The `graphql` package serves two purposes in being the reference implementation of the
19[GraphQL specification](https://spec.graphql.org/) and being used as the shared toolkit
20for implementing GraphQL in client-side and server-side JavaScript applications. This
21can cause bloat for client-side apps, where we'd rather choose lower bundlesize impact
22over fidelity.
23
24`graphql-web-lite` is an **experimental** library, providing an alias package that can
25be swapped in for the standard `graphql` package in client-side applications.
26It aims to reduce the size of imports that are in common use by GraphQL clients and
27users, while still providing most `graphql` exports that are used in other contexts.
28
29## Installation
30
31`graphql-web-lite` mirrors the folder structure of the regular `graphql` package and
32includes mostly the same files and imports as the `graphql` package, minus a couple
33that aren't commonly used for client-side GraphQL.
34This offers us several installation options, depending on how the package is aliased
35to the regular `"graphql"` import.
36
37<details>
38<summary><strong>Installation with <code>package.json</code> aliases</strong></summary>
39
40When your dependencies and `node_modules` folder isn't used by a _GraphQL server_ and
41only used by a _GraphQL clients_, you can use a quick and easy npm installation alias.
42In your `package.json` file you can define your `graphql` installation to use
43`graphql-web-lite` instead, which is supported by both Yarn and npm:
44
45```diff
46{
47 "dependencies": {
48- "graphql": "^15.5.0"
49+ "graphql": "npm:graphql-web-lite@^15.5.1000"
50 }
51}
52```
53
54Alternatively, you can run an installation command to alias the package:<br />
55
56```sh
57npm install --save graphql@npm:graphql-web-lite
58# or
59yarn add graphql@npm:graphql-web-lite
60```
61
62When this isn't suitable — for instance, because the same dependencies are shared
63with an API or server-side GraphQL consumer, or you're working inside a monorepo —
64you can try one of the other aliasing techniques below.
65
66</details>
67
68<details>
69<summary><strong>Installation with Webpack aliases</strong></summary>
70
71First, we'll need to install `graphql-web-lite` _alongside_ the regular `graphql`
72package.
73
74```sh
75npm install --save graphql-web-lite
76# or
77yarn add graphql-web-lite
78```
79
80To alias a package in Webpack, an entry must be added to your Webpack
81configuration's `resolve.alias` section. Depending on your implementation,
82the configuration may already contain some keys inside `resolve.alias`, and
83you'd want to add another entry for `"graphql"`.
84
85```js
86const webpackConfig = {
87 // ...
88 resolve: {
89 alias: {
90 graphql: 'graphql-web-lite',
91 },
92 },
93};
94```
95
96</details>
97
98<details>
99<summary><strong>Installation with Next.js</strong></summary>
100
101First, we'll need to install `graphql-web-lite` _alongside_ the regular `graphql`
102package.
103
104```sh
105npm install --save graphql-web-lite
106# or
107yarn add graphql-web-lite
108```
109
110In your [Next.js configuration file](https://nextjs.org/docs/api-reference/next.config.js/introduction),
111under `next.config.js`, you can add an additional `webpack()` function that is
112able to modify Next's Webpack configuration to add an alias for `graphql`.
113
114```js
115module.exports = {
116 webpack(config, { isServer }) {
117 if (!isServer) {
118 config.resolve.alias = {
119 ...config.resolve.alias,
120 graphql: 'graphql-web-lite',
121 };
122 }
123 return config;
124 },
125};
126```
127
128Here we're also ensuring that the alias isn't applied on the server-side, in case
129an API route is using `graphql` for a server-side GraphQL schema.
130
131</details>
132
133<details>
134<summary><strong>Installation with Rollup's alias plugin</strong></summary>
135
136First, we'll need to install `graphql-web-lite` _alongside_ the regular `graphql`
137package.
138
139```sh
140npm install --save graphql-web-lite
141# or
142yarn add graphql-web-lite
143```
144
145In Rollup, the easiest way to add a new alias is to use `@rollup/plugin-alias`.
146We'll have to install this plugin and ensure that every import and deep import
147to `graphql` is aliased to `graphql-web-lite`.
148
149Any Rollup-based build will fail when the import name of the package does not
150match the `name` field in the module's `package.json` file, so this step is
151necessary.
152
153```js
154import alias from '@rollup/plugin-alias';
155
156module.exports = {
157 plugins: [
158 alias({
159 entries: [{ find: 'graphql', replacement: 'graphql-web-lite' }],
160 }),
161 ],
162};
163```
164
165</details>
166
167<details>
168<summary><strong>Installation with Vite</strong></summary>
169
170First, we'll need to install `graphql-web-lite` _alongside_ the regular `graphql`
171package.
172
173```sh
174npm install --save graphql-web-lite
175# or
176yarn add graphql-web-lite
177```
178
179In your [Vite configuration file](https://vitejs.dev/config/#config-file-resolving)
180you may add a new entry for its `resolve.alias` entries. This entry works the same
181as Rollup's alias plugin.
182
183```js
184import { defineConfig } from 'vite';
185
186export default defineConfig({
187 resolve: {
188 alias: {
189 graphql: 'graphql-web-lite',
190 },
191 },
192});
193```
194
195Here we're also ensuring that the alias isn't applied on the server-side, in case
196an API route is using `graphql` for a server-side GraphQL schema.
197
198</details>
199
200<details>
201<summary><strong>Installation with Parcel</strong></summary>
202
203First, we'll need to install `graphql-web-lite` _alongside_ the regular `graphql`
204package.
205
206```sh
207npm install --save graphql-web-lite
208# or
209yarn add graphql-web-lite
210```
211
212In Parcel, we can add an entry in our `package.json` file for an alias. Specifically,
213the `alias` property may contain an object that maps packages to their aliases.
214
215```diff
216{
217 "alias": {
218+ "graphql": "graphql-web-lite"
219 }
220}
221```
222
223</details>
224
225<details>
226<summary><strong>Installation with Jest's module mapping</strong></summary>
227
228First, we'll need to install `graphql-web-lite` _alongside_ the regular `graphql`
229package.
230
231```sh
232npm install --save graphql-web-lite
233# or
234yarn add graphql-web-lite
235```
236
237Jest allows any module names to be remapped using regular expression-based
238mappings. In your Jest config you'll need to add an entry for `graphql` that
239remaps all imports and deep imports to `graphql-web-lite`.
240
241```json
242{
243 "moduleNameMapper": {
244 "graphql(.*)": "graphql-web-lite$1"
245 }
246}
247```
248
249</details>
250
251## Impact & Changes
252
253In short, most utilities, functions, and classes exported by the `graphql`
254package are only used for server-side GraphQL. Some of them have been removed
255in `graphql-web-lite` to discourage its server-side usage, and help bundlers
256exlude them if tree-shaking were to fail.
257
258Most GraphQL clients rely on importing the parser, printer, visitor, and the
259`GraphQLError` class. These have all been modified to reduce their bundlesize
260impact and to remove any support for
261[GraphQL's schema language and type system](https://spec.graphql.org/June2018/#sec-Type-System).
262
263Any debugging calls, development-time warnings, and other non-production code
264is also being transpiled away, and `process.env.NODE_ENV` has been compiled
265away.
266
267<details>
268<summary><strong>Full List of Changes</strong></summary>
269
270| Export | Changes | Notes |
271| -------------------------- | ----------- | ------------------------------------------------------------------- |
272| `getVisitFn` | _unchanged_ | n/a |
273| `visitInParallel` | _unchanged_ | n/a |
274| `BREAK` | _unchanged_ | n/a |
275| `visit` | _modified_ | works recursively and does not detect invalid AST nodes |
276| `print` | _modified_ | won't output any schema nodes and does not detect invalid AST nodes |
277| `printLocation` | _modified_ | won't output source snippets |
278| `printSourceLocation` | _modified_ | won't output source snippets |
279| `parse` | _modified_ | won't parse schema nodes or throw precise syntax errors |
280| `parseType` | _modified_ | won't throw precise syntax errors |
281| `parseValue` | _modified_ | won't throw precise syntax errors |
282| `GraphQLError` | _modified_ | doesn't handle locations and Error stacks |
283| `syntaxError` | _removed_ | n/a |
284| `printType` | _removed_ | n/a |
285| `printSchema` | _removed_ | n/a |
286| `printIntrospectionSchema` | _removed_ | n/a |
287| `lexicographicSortSchema` | _removed_ | n/a |
288| `isSchema` | _removed_ | n/a |
289| `isInterfaceType` | _removed_ | n/a |
290| `getDescription` | _removed_ | n/a |
291| `findDeprecatedUsages` | _removed_ | n/a |
292| `buildSchema` | _removed_ | n/a |
293| `buildASTSchema` | _removed_ | n/a |
294| `assertSchema` | _removed_ | n/a |
295| `assertInterfaceType` | _removed_ | n/a |
296| `assertCompositeType` | _removed_ | n/a |
297| `assertAbstractType` | _removed_ | n/a |
298| `TokenKind` | _removed_ | n/a |
299| `Token` | _removed_ | n/a |
300| `Lexer` | _removed_ | n/a |
301| `GraphQLUnionType` | _removed_ | n/a |
302| `GraphQLInterfaceType` | _removed_ | n/a |
303| `GraphQLInputObjectType` | _removed_ | n/a |
304
305</details>