日光菩萨 發表於 2025-5-23 18:17:00

Next.js兼容低版本浏览器

<h1 id="nextjs-兼容低版本浏览器">Next.js 兼容低版本浏览器</h1>
<h4 id="chrome--70">chrome &lt; 70</h4>
<h2 id="1globalthis">1.globalThis</h2>
<p>chrome &gt; 70 才支持 globalThis</p>
<blockquote>
<p>该 api 在 Next 框架源码中被调用</p>
</blockquote>
<ol>
<li>通过配置 polyfill</li>
</ol>
<pre><code>        yarn add regenerator-runtime core-js
</code></pre>
<ol start="2">
<li>.babelrc</li>
</ol>
<pre><code class="language-json">{
        "presets": [
                [
                        "next/babel",
                        {
                                "preset-env": {
                                        "targets": {
                                                "browsers": ["last 2 versions", "ie &gt;= 11"]
                                        },
                                        "useBuiltIns": "usage",
                                        "corejs": 3
                                }
                        }
                ]
        ],
        "plugins": [
                "@babel/plugin-proposal-do-expressions",
                "@babel/plugin-syntax-optional-chaining"
        ]
}
</code></pre>
<ol start="3">
<li>在根文件下引入</li>
</ol>
<pre><code class="language-javascript">import 'core-js/stable'
import 'regenerator-runtime/runtime'
</code></pre>
<h2 id="2queuemicrotask">2.queueMicrotask</h2>
<p>chrome &gt; 70 才支持 globalThis</p>
<ol>
<li>通过<code>&lt;Script&gt;</code>标签,处理该 api</li>
</ol>
<pre><code class="language-javascript">&lt;Script strategy="beforeInteractive"&gt;
        {`
        if (!window.queueMicrotask) {
                window.queueMicrotask = function(callback) {
                        Promise.resolve().then(callback);
                };
        }
`}
&lt;/Script&gt;
</code></pre>
<blockquote>
<p>beforeInteractive 会在页面加载完成后,水合前执行,并且阻塞线程</p>
</blockquote>
<h2 id="3failed-to-execute-observe-on-performanceobserver-required-member-entrytypes-is-undefined">3.Failed to execute 'observe' on 'PerformanceObserver': required member entryTypes is undefined.</h2>
<p>chrome &gt; 51 支持</p>
<ol>
<li>通过<code>&lt;Script&gt;</code>标签,处理</li>
</ol>
<pre><code class="language-javascript">&lt;Script strategy="beforeInteractive"&gt;
        {`
        (function () {
                if (typeof window === 'undefined') return;

                if (!('PerformanceObserver' in window)) {
                        window.PerformanceObserver = function () {
                                return {
                                        observe: function () {},
                                        disconnect: function () {},
                                        takeRecords: function () { return []; }
                                };
                        };
                        window.PerformanceObserver.supportedEntryTypes = [];
                } else if (!PerformanceObserver.supportedEntryTypes) {
                        PerformanceObserver.supportedEntryTypes = [];
                }
        })();
`}
&lt;/Script&gt;
</code></pre>
<h2 id="解决思路">解决思路</h2>
<ol>
<li>通过 polyfill 第三方库进行低版本兼容</li>
<li>在根布局入口文件中<code>/app//layout.tsx</code>,利用<code>&lt;Script&gt;</code>,在页面加载完成和 react 水合前,阻塞线程,强制在 window 上加上低版本不支持的属性或方法</li>
</ol><br><br>
来源:https://www.cnblogs.com/karle/p/18893590
頁: [1]
查看完整版本: Next.js兼容低版本浏览器