c206d89ec2
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>
50 lines
1.3 KiB
TypeScript
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>
|
|
</>
|
|
);
|
|
}
|