查看: 92|回覆: 0

Next.js兼容低版本浏览器

[複製鏈接]

6

主題

1

回帖

0

積分

热心网友

金币
1
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2008-11-18
發表於 2025-5-23 18:17:00 | 顯示全部樓層 |閲讀模式

Next.js 兼容低版本浏览器

chrome < 70

1.globalThis

chrome > 70 才支持 globalThis

该 api 在 Next 框架源码中被调用

  1. 通过配置 polyfill
	yarn add regenerator-runtime core-js
  1. .babelrc
{
	"presets": [
		[
			"next/babel",
			{
				"preset-env": {
					"targets": {
						"browsers": ["last 2 versions", "ie >= 11"]
					},
					"useBuiltIns": "usage",
					"corejs": 3
				}
			}
		]
	],
	"plugins": [
		"@babel/plugin-proposal-do-expressions",
		"@babel/plugin-syntax-optional-chaining"
	]
}
  1. 在根文件下引入
import 'core-js/stable'
import 'regenerator-runtime/runtime'

2.queueMicrotask

chrome > 70 才支持 globalThis

  1. 通过<Script>标签,处理该 api
<Script strategy="beforeInteractive">
	{`
	if (!window.queueMicrotask) {
		window.queueMicrotask = function(callback) {
			Promise.resolve().then(callback);
		};
	}
`}
</Script>

beforeInteractive 会在页面加载完成后,水合前执行,并且阻塞线程

3.Failed to execute 'observe' on 'PerformanceObserver': required member entryTypes is undefined.

chrome > 51 支持

  1. 通过<Script>标签,处理
<Script strategy="beforeInteractive">
	{`
	(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 = [];
		}
	})();
`}
</Script>

解决思路

  1. 通过 polyfill 第三方库进行低版本兼容
  2. 在根布局入口文件中/app/[locale]/layout.tsx,利用<Script>,在页面加载完成和 react 水合前,阻塞线程,强制在 window 上加上低版本不支持的属性或方法


来源:https://www.cnblogs.com/karle/p/18893590
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部