В блоге Артема Захарченко вышла статья про вред глобального патчинга API, при котором меняется его поведение. В качестве примера автор приводит fetch в Next.js и Bun:
// Next.js добавил кэширование и возможность сброса кэша
fetch('https://kettanaito.com', {
next: { revalidate: 10 },
})
// Bun добавил возможность проксировать запрос
fetch('https://redd.one', {
proxy: 'https://kettanaito.com',
})
В обоих случаях меняется стандартное поведение функции fetch глобально. Глобальный патчинг API не только влечет за собой затраты, которые влияют как на пользователей, так и на мейнтенеров, но и вредит другим API и даже самому языку. Как вредит глобальный патчинг:
- Поддержка. Когда вы что-то меняете глобально, вы изменяете то, чем не владеете. Поддержка того, чем ты не владеешь, сложно. Например, вы изменили глобально fetch, чтобы он умел дедуплицировать запросы. Что будет, если вы будете использовать сторонний модуль, в который также встроен механизм дедупликации. Эти два поведения будут конфликтовать, вызывая проблемы, которые сложно отладить.
- Предсказуемость. Для того, чтобы CSS одинаково работал во всех браузерах были созданы стандарты стилей. Существуют стандарты Web API для кросс-браузерной совместимости. Также Node.js хорошо поддерживает Web API, предоставляя fetch, ReadableStream, WebSocket и т.д. Таким образом, использование одного API в разных средах предсказуемо. Поэтому изменение поведения fetch в Next.js вредит предсказуемости, потому что это поведение будет работать только в Next.js.
- Обучение. Хорошее API должно обучать. Оно должно быть приближено к существующим стандартам.
Взамен существующему глобальному патчингу в bun, можно использовать существующий API fetch и Request и создать отдельную функцию проксирования:
import { proxy } from 'bun'
const proxiedRequest = proxy(proxyUrl, new Request(url, options))
await fetch(proxiedRequest)
Как можно сделать в Next.js:
import { withCache } from 'next'
const request = new Request('https://kettanaito.com')
fetch(withCache(request, { revalidate: 10 }))
Тем не менее, Next.js идет в сторону отдельной функции для кэширования запросов unstable_cache вместо глобального патчинга fetch.
https://kettanaito.com/blog/why-patching-globals-is-harmful