rsnext/examples/script-component/pages/polyfill.tsx
Sukka c206d89ec2
feat(eslint): enhance no-unwanted-polyfill w/ new endpoints (#62719)
The PR adds the new `polyfill.io` instance endpoint (from Fastly and
Cloudflare) to the `eslint-plugin-next`'s `no-unwanted-polyfillio`
rules, so these new endpoints can be detected by the rule.

---

`polyfill.io` was acquired by **a China-based CDN company** "Funnull",
see [the announcement from the `polyfill.io` domain owner's
Twitter](https://x.com/JakeDChampion/status/1761315227008643367) and
https://github.com/polyfillpolyfill/polyfill-service/issues/2834.
Despite Funnull's claims of operating in the United States, the
predominance of Simplified Chinese on its website suggests otherwise,
and it turns out that **"Funnull" is notorious for providing service for
the betting and pornography industries**.

[The original creator of the `polyfill.io` has voiced his concern on
Twitter](https://twitter.com/triblondon/status/1761852117579427975). And
since the acquisition, numerous issues have emerged
(https://github.com/polyfillpolyfill/polyfill-service/issues/2835,
https://github.com/polyfillpolyfill/polyfill-service/issues/2838,
https://github.com/alist-org/alist/issues/6100), rendering the
`polyfill.io` service **extremely unstable**. Since then, Fastly
([Announcement](https://community.fastly.com/t/new-options-for-polyfill-io-users/2540))
and Cloudflare
([Announcement](https://blog.cloudflare.com/polyfill-io-now-available-on-cdnjs-reduce-your-supply-chain-risk))
has hosted their own instances of `polyfill.io` service.

---------

Co-authored-by: Steven <steven@ceriously.com>
2024-03-06 16:42:53 +00:00

50 lines
1.3 KiB
TypeScript

import { useEffect, useRef, useState } from "react";
import Script from "next/script";
import s from "../styles/polyfill.module.css";
export default function Polyfill() {
const ref = useRef<HTMLSpanElement>(null);
const [lastIntersection, setIntersection] = useState(new Date());
useEffect(() => {
const observer = new IntersectionObserver(
(intersections) => {
const isIntersecting = intersections[0]?.isIntersecting;
if (isIntersecting) {
setIntersection(new Date());
}
},
{
rootMargin: "45px",
},
);
if (ref.current) {
observer.observe(ref.current);
}
return () => observer.disconnect();
}, []);
return (
<>
{/* We ensure that intersection observer is available by polyfilling it */}
<Script
src="https://polyfill-fastly.io/v3/polyfill.min.js?features=IntersectionObserverEntry%2CIntersectionObserver"
strategy="beforeInteractive"
/>
<main className={s.container}>
<h1>IntersectionObserver Polyfill</h1>
<h5>Scroll down to see when was the last intersection</h5>
<section className={s.section}>
<span ref={ref}>
Last intersection at {lastIntersection.toTimeString()}
</span>
</section>
</main>
</>
);
}