javascript - 仅动态导入模块一次,而不是在 React 中的每个组件实例上
问题描述
我有一个有条件地导入模块的反应组件。原因是如果模块在文件顶部正常导入,这会破坏依赖该组件的另一个项目的 webpack 构建,因为它无法处理导入的模块。
我已经用 es6 动态导入解决了这个问题——但是,现在的问题是组件的每个实例都重新导入了模块。如果我在一页上有 100 个组件,它会将该模块导入 100 次,使其效率极低并减慢页面加载时间。
什么是只导入一次的正确方法,然后让所有组件实例的其余部分引用该 1 个动态导入的模块?
这是我的组件:
import React from "react"
export default class Link extends React.Component {
state = {
gatsbyLink: null
}
...
componentDidMount() {
if (GLOBAL_FLAG) {
import("gatsby").then(({ Link }) => {
this.setState({
gatsbyLink: Link
})
})
}
}
render() {
const { gatsbyLink } = this.state;
const GatsbyLink = gatsbyLink ? gatsbyLink : "";
...
return (<GatsbyLink {...}>...</GatsbyLink>)
}
}
解决方案
我不确定动态导入的模块是否被缓存。如果不是,您可以导出一个承诺,如果设置了标志,则该承诺会解析动态导入的 gatsby。您仍然需要在使用 gatsby 的每个组件中导入并调用它,但它不会每次都动态导入模块。
const conditionallyResolveGatsby = () => {
// You could reject as well
return GLOBAL_FLAG ? import('gatsby') : Promise.resolve();
};
export default conditionallyResolveGatsby();
你也可以尝试使用require。
推荐阅读
- python - 在 Python 中明智地读取文件块
- c# - 如何使用泛型方法?
- node.js - 从 Kubernetes 集群中的另一个服务连接到 MongoDB Ops Manager 上的 ReplicaSet,给出 MongooseServerSelectionError
- c++ - cout/cin 在内部调用 printf() / scanf() 是否像 `new` 调用 malloc?
- julia - Julia中的二阶微分方程
- dynamic - 什么是与值或变量相关联的“类型”?
- javascript - Nativescript-Vue 本地图像未显示
- c++ - 如何从参考参数中打印出文件的内容?我
- html - 如何降低高度并同时使其在 Bootstrap 4 中响应
- android - Android Studio强制关闭笔记本电脑?