5

我想延迟加载所有顶级组件以缩短加载时间。我正在使用react-on-rails来集成 React 和 Ruby on Rails。要渲染组件,我必须像这样注册它们registration.jsx

import ReactOnRails from 'react-on-rails';
import Component1 from '../components/Component1';
import Component2 from '../components/Component2';

ReactOnRails.register({Component1, Component2});

我尝试了两种方法:

1. React.lazy:

import {lazy} from "react";
const Component1 = lazy(() => import("../components/Component1"));

但是浏览器会报错...

Uncaught Error: Module build failed: SyntaxError: 
.../app/registration.jsx: Unexpected token, expected ";" (20:113)

看来我不能在这个文件中使用延迟加载。所以我在 Component1 的一个子组件中尝试了它。但它仍然不起作用。

 const SubComponent = lazy(() => import("./SubComponent"));

这将返回:

Uncaught ReferenceError: SubComponent is not defined

2.反应加载:

官方文档

这似乎是由react-on-rails(见下文)推荐的,但我得到了一个不同的错误,说 react-on-rails 找不到这样的组件。

import ReactOnRails from 'react-on-rails';
import Loadable from "react-loadable";

const loading = () => {
  return <div>Loading...</div>;
}

const Component1 = Loadable({
  "loader": () => import('../components/Component1'),
  "loading": loading
});

import Component2 from '../components/Component2';

ReactOnRails.register({Component1, Component2});

这是错误:

Uncaught ReferenceError: ReactOnRails encountered an error while rendering component: Component1.
Original message: React is not defined

我也尝试在子组件上使用它。但它只是不渲染它。

import Loadable from "react-loadable";

const loading = () => {
  return <div>Loading...</div>;
}

const SubComponent = Loadable({
  "loader": () => import("./SubComponent"),
  "loading": loading
});

class Component1 extends PureComponent {
  render () {
    return (
      <SubComponent />
    )

  }
}

但这只会返回“正在加载...”

问题:

唯一的好消息是 Webpack 正确地将包拆分为基于组件的更小的包,所以我认为可行react-loadable,但没有正确呈现。

是否可以使用延迟加载组件react-on-rails?还是我有语法错误?似乎react-on-rails控制组件的加载方式。

另一个想法:也许我应该只对子组件进行延迟加载。但我想知道这是否真的有助于减少初始加载时间。有什么想法吗?

4

0 回答 0