【问题标题】:Is it possible to lazy load a set of components/modules in React from a url?是否可以从 url 延迟加载 React 中的一组组件/模块?
【发布时间】:2020-01-09 18:55:13
【问题描述】:

我正在构建一个 React 应用程序,它将支持第三方开发人员编写他们自己的组件,我们将对其进行测试,然后托管在我们公司的 CDN 上。我使用@loadable/component 动态加载模块,但我不知道如何让它适用于位于网址中的东西。

这是迄今为止我对延迟加载组件的了解。要获取的组件在 .json 文件中进行了概述。这个 .json 文件被解析,我编写的一个组件在该位置获取 index.js 并将该组件加载到应用程序中。

import moduleMetaData from "../thirdparty_modules"; //the json file outlining which modules to load
import loadable from "@loadable/component";
import React from "react";

const Module = (props) => {
    let id = props.id;
    let LoadedModule = null;

    if (!!moduleMetaData[id]) {
        let moduleLocation = moduleMetaData[id].location;

        LoadedModule = loadable(() => import(`${moduleLocation}`), {
            fallback: <div>Loading Module...</div>
        });
    }    
    return <LoadedModule/>;
}

export default Module;

这是正在使用的 .json 文件:

{
  "module1": {
    "name": "ModuleTest1",
    "location": "./main/module1/index"
  }
}

然后我在 App.js 中使用这个 &lt;Module /&gt; 组件将模块加载到我的应用程序中:

const App = () => {
    const GetModules = () => {
        let loadedModules = [];
        for(let key in moduleMetaData){
            loadedModules.push(<Module key={key} id={key}/>);
        }

        return loadedModules;
    }

    return (
        <AppContext.Provider
            value={{
                routes
            }}
        >
            <StylesProvider jss={jss} generateClassName={generateClassName}>
                <Provider store={store}>
                    <MuiPickersUtilsProvider utils={MomentUtils}>
                        <Auth>
                            <Router history={history}>
                                <FuseAuthorization>
                                    <FuseTheme>
                                        <FuseLayout/>
                                    </FuseTheme>
                                </FuseAuthorization>
                            </Router>
                        </Auth>
                    </MuiPickersUtilsProvider>

                    {/*LOAD MODULES*/}
                    {GetModules()}
                </Provider>
            </StylesProvider>
        </AppContext.Provider>
    );
};

export default App;

此代码允许我从/src 目录中延迟加载组件和模块,前提是每个模块的索引文件的路径都添加到thirdparty_modules.json。

我遇到的问题是,我无法让它适用于存储在外部 Web 服务器上的模块。如果我将 module1 目录从 ./src/main/module1 移动到我们的 CDN,示例地址为 https://our.cdn.net/module1,然后将我的 .json 位置更新为 https://our.cdn.net/module1/index,我会收到错误消息:

未处理的拒绝(错误):找不到模块“https://our.cdn.net/module1/index

如何让我的组件延迟加载从外部 url 加载,而不是从本地 /src 目录加载?

【问题讨论】:

  • 您的网址不正确。它说can't find module/
  • 是正确的,即使我使用本地路径,我也会得到相同的can't find module 错误。对于不在我的 /src 目录中的任何路径,我都会收到该错误
  • 你有没有用 react 的 lazy 尝试过,或者看到 Tyler McGinnis 教程解释了这一点。让我吃早餐吧。

标签: javascript node.js reactjs import lazy-loading


【解决方案1】:

虽然您不能将它与 import 一起使用,但您仍然可以使用例如 Fetch API 检索数据并将其返回。

类似

        LoadedModule = loadable(() => fetch(moduleLocation).then(res => res.text())

应该可以正常工作。

【讨论】:

  • 我需要获取的 url 是一个 javascript 文件,而不是 json。像这样的东西可以加载 .js 文件并将 js 文件中概述的组件加载到我的应用程序中吗?
  • 对不起,愚蠢的习惯 - 当然应该是 res.text() 将响应读入字符串...要更改答案。
猜你喜欢
  • 2017-05-11
  • 1970-01-01
  • 2018-08-23
  • 2019-12-02
  • 2020-10-16
  • 1970-01-01
  • 2022-01-13
  • 2019-03-05
  • 2020-01-24
相关资源
最近更新 更多