更新
我访问了该网站,我确定您正在使用 Gatsby。Gatsby 正在使用 SSR,而 React.lazy 和 Suspense 尚不可用于服务器端渲染。如果您想在服务器渲染的应用程序中进行代码拆分,建议使用React docs 中的Loadable Components。它有一个很好的指南,用于使用服务器端渲染进行包拆分。
有一个 gatsby 插件可以让您的生活更轻松gatsby-plugin-loadable-components-ssr。安装和配置插件后,您可以loadable
像这样使用:
AmazonFrame.js
import React from "react";
const AmazonFrame = ({ src, width, height }) => (
<iframe src={src} width={width} height={height} scrolling="no"></iframe>
);
App.js
import React from "react";
import loadable from "@loadable/component";
const AmazonFrame = loadable(() => import("./AmazonFrame"), {
fallback: <div>Loading...</div>
});
function App() {
return (
<div>
<AmazonFrame src="src" width="100%" height="200px" />
</div>
);
}
export default App;
或者
import React from "react";
import loadable from "@loadable/component";
const AmazonFrame = loadable(() => import("./AmazonFrame"));
function App() {
return (
<div>
<AmazonFrame fallback={<div>Loading...</div>} />
</div>
);
}
export default App;
原答案
您需要使用代码拆分。代码拆分是 Webpack、Rollup 和 Browserify(通过 factor-bundle)等打包器支持的一项功能,它可以创建多个可以在运行时动态加载的包。
如果您正在使用 Create React App,这已经为您配置好了,您可以立即开始使用它。
代码拆分你的应用程序可以帮助你“延迟加载”用户当前需要的东西,这可以显着提高你的应用程序的性能。虽然您没有减少应用程序中的代码总量,但您避免了加载用户可能永远不需要的代码,并减少了初始加载期间所需的代码量。
这是您的问题的示例解决方案,它将延迟加载亚马逊广告,iframe
因此它不会与您的初始捆绑包一起加载:
AmazonFrame.js
import React from "react";
const AmazonFrame = ({ src, width, height }) => (
<iframe src={src} width={width} height={height} scrolling="no"></iframe>
);
export default AmazonFrame;
App.js
import React, { Suspense, lazy } from "react";
// React.lazy takes a function that must call a dynamic import(). This must return a Promise
// which resolves to a module with a default export containing a React component.
const AmazonFrame = lazy(() => import("./AmazonFrame"));
function App() {
return (
<div>
{/* The lazy component should then be rendered inside a Suspense component, which allows us to show some fallback
content (such as a loading indicator) while we’re waiting for the lazy component to load */}
{/* The fallback prop accepts any React elements that you want to render while waiting for the component to load */}
<Suspense fallback={<div>Loading...</div>}>
<AmazonFrame src="src" width="100%" height="200px" />
</Suspense>
</div>
);
}
export default App;