検索
ホームページウェブフロントエンドjsチュートリアルReact と Redux の動的インポート (コード付き)
React と Redux の動的インポート (コード付き)Mar 23, 2019 am 09:51 AM
javascriptreact.jsフロントエンドプログラマー

この記事で紹介する内容は、React と Redux の動的インポート (コード付き) に関するもので、一定の参考価値があります。必要な友人は参考にしてください。 、お役に立てば幸いです。

コードの分離と動的インポート

大規模な Web アプリケーションの場合、コードの編成は非常に重要です。高性能でわかりやすいコードの作成に役立ちます。最も単純な戦略の 1 つはコード分離です。 Webpack などのツールを使用すると、コードを小さな部分に分割し、静的と動的という 2 つの異なる戦略に分割できます。

静的コード分離では、アプリケーションのさまざまな部分が最初に特定のエントリ ポイントとして扱われます。これにより、Webpack はビルド時に各エントリ ポイントを個別のバンドルに分割できます。これは、アプリのどの部分が最も閲覧されるかがわかっている場合に最適です。

動的インポートでは、Webpack のインポート メソッドを使用してコードを読み込みます。 import メソッドは Promise を返すため、非同期待機を使用して返された結果を処理できます。

// getComponent.js
async function getComponent() {
   const {default: module} = await import('../some-other-file')
   const element = document.createElement('p')
   element.innerHTML = module.render()
   return element
}

これは非常に不自然な例ですが、この方法がいかに簡単であるかがわかります。 Webpack を使用して面倒な作業を行うことで、アプリケーションをさまざまなモジュールに分割できます。必要なコードは、ユーザーがアプリケーションの特定の部分をクリックしたときにのみロードされます。

このアプローチを React が提供する制御構造と組み合わせると、遅延読み込みを通じてコード分割を行うことができます。これにより、コードの読み込みを最後の瞬間まで遅らせることができ、最初のページ読み込みを軽減できます。

React による遅延読み込みの処理

モジュールをインポートするには、どの API を使用するかを決定する必要があります。 React を使用してコンテンツをレンダリングしていることを考慮して、そこから始めましょう。

以下は、ビュー名前空間を使用してモジュール コンポーネントをエクスポートする単純な API です。

// my-module.js
import * as React from 'react'

export default {
    view: () => <p>My Modules View</p>
}

import メソッドを使用してこのファイルをロードしたので、

async function getComponent() {
    const {default} = await import('./my-module')
    return React.createElement(default.view)
})

などのモジュールのビュー コンポーネントに簡単にアクセスできます。ただし、React ではこのメソッドをまだ使用していません。モジュールを遅延ロードします。これを行うには、LazyLoadModule コンポーネントを作成します。このコンポーネントは、特定のモジュールのビュー コンポーネントの解析とレンダリングを担当します。

// lazyModule.js
import * as React from "react";

export class LazyLoadModule extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      module: null
    };
  }
 
  // after the initial render, wait for module to load
  async componentDidMount() {
    const { resolve } = this.props;
    const { default: module } = await resolve();
    this.setState({ module });
  }

  render() {
    const { module } = this.state;

    if (!module) return <p>Loading module...</p>;
    if (module.view) return React.createElement(module.view);

  }
}

以下は、LazyLoadModule コンポーネントを使用してモジュールをロードする方法を示しています。

// my-app.js

import {LazyLoadModule} from './LazyLoadModule'

const MyApp = () => (
    <p>
        </p><h1 id="Hello">Hello</h1>
        <lazyloadmodule> import('./modules/my-module')} />
    
)

ReactDOM.render(<myapp></myapp>, document.getElementById('root'))</lazyloadmodule>

以下は、いくつかの例外処理を追加するオンライン例です。

https://codesandbox.io/embed/...

React を使用して各モジュールの読み込みを処理することにより、アプリケーション内でいつでも、ネストされたコンポーネントを含むコンポーネントを遅延読み込みできます。モジュール。

Redux の使用

これまで、アプリケーションのモジュールを動的にロードする方法を説明してきました。ただし、ロード時にモジュールに正しいデータを入力する必要があります。

redux ストアをモジュールに接続する方法を見てみましょう。各モジュールのビュー コンポーネントを公開することで、各モジュールの API を作成しました。各モジュールのレデューサーを公開することでこれを拡張できます。また、モジュールの状態がアプリケーションのストアに存在するための名前を公開する必要もあります。

// my-module.js
import * as React from 'react'
import {connect} from 'react-redux'

const mapStateToProps = (state) => ({
    foo: state['my-module'].foo,
})
const view = connect(mapStateToProps)(({foo}) => <p>{foo}</p>)

const fooReducer = (state = 'Some Stuff') => {
    return state
}
const reducers = {
    'foo': fooReducer,
}

export default {
    name: 'my-module',
    view,
    reducers,
}

上の例は、モジュールがレンダリングに必要な状態を取得する方法を示しています。

しかし、まず ストア でさらに作業を行う必要があります。モジュールがロードされるときに、モジュールの reducer を登録できる必要があります。したがって、モジュール dispatcheaction を実行すると、store が更新されます。これを実現するには、 replaceReducer メソッドを使用します。

まず、2 つの追加メソッド registerDynamicModuleunregisterDynamicModule をストアに追加する必要があります。

// store.js
import * as redux form 'redux'

const { createStore,  combineReducers } = redux

// export our createStore function
export default reducerMap => {
    
    const injectAsyncReducers = (store, name, reducers) => {
        // add our new reducers under the name we provide
        store.asyncReducers[name] = combineReducers(reducers);
        // replace all of the reducers in the store, including our new ones
        store.replaceReducer(
            combineReducers({
                ...reducerMap,
                ...store.asyncReducers
            })
        );
    };
    
    // create the initial store using the initial reducers that passed in
    const store = createStore(combineReducers(reducerMap));
    // create a namespace that will later be filled with new reducers
    store.asyncReducers = {};
    // add the method that will allow us to add new reducers under a given namespace
    store.registerDynamicModule = ({ name, reducers }) => {
        console.info(`Registering module reducers for ${name}`);
        injectAsyncReducers(store, name, reducers);
    };
    // add a method to unhook our reducers. This stops our reducer state from updating any more.
    store.unRegisterDynamicModule = name => {
        console.info(`Unregistering module reducers for ${name}`);
        const noopReducer = (state = {}) => state;
        injectAsyncReducers(store, name, noopReducer);
    };
    
    // return our augmented store object
    return store;
}

ご覧のとおり、コード自体は非常に単純です。 store に 2 つの新しいメソッドを追加します。これらの各メソッドは、storereducer を完全に置き換えます。

拡張機能 store を作成する方法は次のとおりです:

import createStore from './store'

const rootReducer = {
    foo: fooReducer
}

const store = createStore(rootReducer)

const App = () => (
    <provider>
        ...
    </provider>
)

次に、 # で使用できるように LazyLoadModule を更新する必要があります。 ##store reducer モジュールを ## に登録します。

storeprops を通じて取得できます。これは単純ですが、毎回 store を取得する必要があることを意味し、バグが発生する可能性があります。これを念頭に置いて、LazyLoadModule コンポーネントに store を取得させます。

react-redux コンポーネントが store をコンテキストに追加するときは、## Get で contextTypes を使用するだけです。 #LazyLoadModule にあります。

// lazyModule.js 
export class LazyLoadModule extends React.component {
    ...
    async componentDidMount() {
        ...
        const {store} = this.context
    }
}

LazyLoadModule.contextTypes = {
    store: PropTypes.object,
}

现在可以从 LazyLoadModule 的任何实例访问我们的 store。 剩下的唯一部分就是把 reducer 注册到 store 中。 记住,我们是这样导出每个模块:

// my-module.js
export default {
    name: 'my-module',
    view,
    reducers,
}

更新 LazyLoadModulecomponentDidMountcomponentWillUnmount 方法来注册和注销每个模块:

// lazyModule.js 
export class LazyLoadModule extends React.component {
    ...
    async componentDidMount() {
        ...
        const { resolve } = this.props;
        const { default: module } = await resolve();
        const { name, reducers } = module;
        const { store } = this.context;
        if (name && store && reducers)
            store.registerDynamicModule({ name, reducers });
         this.setState({ module });
    }
    ...
    
    componentWillUnmount() {
        const { module } = this.state;
        const { store } = this.context;
        const { name } = module;
        if (store && name) store.unRegisterDynamicModule(name);
    }
}

线上示例如下:
https://codesandbox.io/s/znx1...

总结:

通过使用 Webpack 的动态导入,我们可以将代码分离添加到我们的应用程序中。这意味着我们的应用程序的每个部分都可以注册自己的 components 和 reducers,这些 components 和 reducers将按需加载。此外,我们还减少了包的大小和加载时间,这意味着每个模块都可以看作是一个单独的应用程序。

本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的JavaScript视频教程栏目!

以上がReact と Redux の動的インポート (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はsegmentfaultで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
React父组件怎么调用子组件的方法React父组件怎么调用子组件的方法Dec 27, 2022 pm 07:01 PM

调用方法:1、类组件中的调用可以利用React.createRef()、ref的函数式声明或props自定义onRef属性来实现;2、函数组件、Hook组件中的调用可以利用useImperativeHandle或forwardRef抛出子组件ref来实现。

es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript的Symbol类型、隐藏属性及全局注册表详解JavaScript的Symbol类型、隐藏属性及全局注册表详解Jun 02, 2022 am 11:50 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

原来利用纯CSS也能实现文字轮播与图片轮播!原来利用纯CSS也能实现文字轮播与图片轮播!Jun 10, 2022 pm 01:00 PM

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

怎么调试React源码?多种工具下的调试方法介绍怎么调试React源码?多种工具下的调试方法介绍Mar 31, 2023 pm 06:54 PM

怎么调试React源码?下面本篇文章带大家聊聊多种工具下的调试React源码的方法,介绍一下在贡献者、create-react-app、vite项目中如何debugger React的真实源码,希望对大家有所帮助!

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境