reactjs - 从 Lighthouse for Google Recaptcha 和 Google Maps API 解决“删除未使用的 Javascript”的最合适方法
问题描述
我正在使用Gatsby 框架在 React 网页上工作,并且我正在使用 AWS 进行持续部署,同时获得了良好的页面速度值。
改进机会之一是删除未使用的 Javascript,它解释了这一点:
抱歉,请点击此链接。我没有 10 的声誉来发布图片:( x2
这是我创建地图的代码(使用@react-google-maps/api
):
useEffect(() => {
const loadScriptByURL = (id, url, callback) => {
const isScriptExist = document.getElementById(id);
if (!isScriptExist) {
let script = document.createElement("script");
script.type = "text/javascript";
script.src = url;
script.id = id;
script.onload = function () {
if (callback) callback();
};
document.body.appendChild(script);
}
if (isScriptExist && callback) callback();
}
loadScriptByURL("recaptcha-key", `https://www.google.com/recaptcha/api.js?render=${SITE_KEY}`, function () {
console.log("Script loaded!");
});
}, []);
这是我调用recaptcha的代码:
<LoadScript
googleMapsApiKey='...'>
<GoogleMap
mapContainerClassName={styles.mapSection}
center={defaultProps.center}
zoom={defaultProps.zoom}
onUnmount={() => {}}
onLoad={() => {}}>
<Marker position={markerLocation} onClick={infoToggleOpen}>
...
</Marker>
</GoogleMap>
</LoadScript>
解决这些插件的删除未使用的 Javascript错误的最正确方法(或最简单的方法)是什么?我该如何使用React.lazy()
或loadable-components
(因为我尝试过但对我不起作用)来解决这个问题?
解决方案
除了一些评论:
当
const isScriptExist = document.getElementById(id);
你在 React 中直接指向 DOM 时,你创建和操作一个虚拟 DOM (vDOM) 以避免像这样的浏览器的高性能操作。此外,这些在 React 范围之外的动作(不使用钩子)可能会导致一些奇怪的行为,因为您可能会阻塞React 的水合过程。你可以使用钩子达到同样的效果
useRef
,保持 React 的范围,refName.current
(refName
是你应该应用的id
地方)它与你的.ref
document.getElementById
正如您所说,保存的脚本 kB 毫无意义,尤其是
utils.js
尝试改进它们是一个好点。
UsingReact.lazy
是一种异步加载(更多)组件的方法,以避免对浏览器的初始阻塞请求,从而更有效地加载组件。在你的情况下:
// import <LoadScript> from 'somewhere';
import <GoogleMap> from 'somewherex2';
import React, { Suspense } from 'react';
const LoadScript = React.lazy(() => import('./LoadScript'));
const YourComponentName=()=>(
<>
<Suspense fallback={<div>Loading...</div>}>
<LoadScript
googleMapsApiKey='...'>
<GoogleMap
mapContainerClassName={styles.mapSection}
center={defaultProps.center}
zoom={defaultProps.zoom}
onUnmount={() => {}}
onLoad={() => {}}>
<Marker position={markerLocation} onClick={infoToggleOpen}>
...
</Marker>
</GoogleMap>
</LoadScript>
</Suspense>
</>
)
您将需要对React.lazy
和 导入的组件进行一些试验。请记住,React 允许您使用后备组件 ( Suspense
)。
推荐阅读
- arduino - 在不在程序中的范围内接收到的数据是正确的
- javascript - 如何使用 javascript 访问 DynamoDB Web 服务
- c++ - 由于 Windows 10 上共享内存中无法访问的内存而导致崩溃
- visual-studio-code - 是否有一个扩展可以帮助在 VSCode 中对标签进行可视化分组?
- python - 巨大的稀疏 Csr_matrix tp Pandas 数据帧的转换
- javascript - 如何将方法添加到多个变量
- java - Java Android 错误:类是抽象的,无法实例化
- jsf - 如何使用 primefaces 日历过滤日期范围?
- python - Pytest-django 依赖注入
- .htaccess - 使用 /?1 重定向 URL