Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ganapativs/react-dynamic-import
Dynamically load and render any react module(Component or an HOC) using dynamic import 🎉
https://github.com/ganapativs/react-dynamic-import
code-splitting dynamic dynamic-import hoc library parcel performance react webpack
Last synced: about 1 month ago
JSON representation
Dynamically load and render any react module(Component or an HOC) using dynamic import 🎉
- Host: GitHub
- URL: https://github.com/ganapativs/react-dynamic-import
- Owner: ganapativs
- License: mit
- Created: 2018-10-26T11:26:43.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2023-01-06T01:51:04.000Z (almost 2 years ago)
- Last Synced: 2024-11-10T17:05:22.062Z (about 1 month ago)
- Topics: code-splitting, dynamic, dynamic-import, hoc, library, parcel, performance, react, webpack
- Language: JavaScript
- Homepage: https://codesandbox.io/s/react-dynamic-import-hooks-demo-108-kuf3u
- Size: 1.16 MB
- Stars: 28
- Watchers: 2
- Forks: 6
- Open Issues: 17
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# react-dynamic-import
⚠️ You might not need this library. Checkout [`React.lazy`](https://reactjs.org/docs/code-splitting.html#reactlazy) and see if it fits your use case.
Dynamically load and render any react module(Component or an HOC) using dynamic import 🎉
Tiny(**around 1.16kb gzip**) dynamic module loader and renderer.
👉 [DEMO](https://codesandbox.io/s/react-dynamic-import-hooks-demo-108-kuf3u)
> ⚠️ Hooks only(requires react 16.8.0 or above), use [v1.0.4](https://www.npmjs.com/package/react-dynamic-import/v/1.0.4) if you want older react versions support
>
> Dynamic loading of component is already supported in React using React.lazy and Suspense, But, dynamic loading of HOC is tricky and is unsupported in React.
>
> Should work with any bundler(eg: webpack, parcel etc) which supports dynamic import ✨[![MIT Licence](https://badges.frapsoft.com/os/mit/mit.svg?v=103)](https://opensource.org/licenses/mit-license.php)
[![Open Source Love](https://badges.frapsoft.com/os/v2/open-source.svg?v=103)](https://github.com/ganapativs/react-dynamic-import/)
[![Build Status](https://travis-ci.com/ganapativs/react-dynamic-import.svg?branch=master)](https://travis-ci.com/ganapativs/react-dynamic-import)
[![npm version](https://badge.fury.io/js/react-dynamic-import.svg)](https://badge.fury.io/js/react-dynamic-import)
[![GitHub version](https://badge.fury.io/gh/ganapativs%2Freact-dynamic-import.svg)](https://badge.fury.io/gh/ganapativs%2Freact-dynamic-import) [![Greenkeeper badge](https://badges.greenkeeper.io/ganapativs/react-dynamic-import.svg)](https://greenkeeper.io/)## Table of Contents
- [Install](#install)
- [Basic Usage](#basic-usage)
- [Advanced Usage](#advanced-usage)
- [API](#api)
- [Contribute](#contribute)
- [License](#license)## Install
### NPM
```sh
npm install react-dynamic-import
```### Yarn
```sh
yarn add react-dynamic-import
```### UMD build
```html
```
## Basic usage
1. Component
- **Folder structure**
```text
|_ realComponent.js
|_ container.js <-- working file
```- **Usage**
```js
// Import library
import ReactDynamicImport from "react-dynamic-import";
// or const ReactDynamicImport = require('react-dynamic-import');// Define dynamic import loader function
const loader = () => import(`./realComponent.js`);/**
* Use dynamic module and lazy fetch component
*
* Make sure to use it outside render method,
* else new component is rendered in each render
*
* You can choose to show a placeholder and render
* error component in case of error, check API section for more
*/
const RealComponent = ReactDynamicImport({ loader });class Container extends React.component {
render() {
/**
* This component is dynamically fetched and rendered
* on first usage/render
*/
return ;
}
}
```1. HOC
- **Folder structure**
```text
|_ realComponent.js <-- Real component to wrap in HOC
|_ withHOC.js <-- HOC
|_ container.js <-- working file
```- **Usage**
```js
// Import library
import ReactDynamicImport from "react-dynamic-import";
// or const ReactDynamicImport = require('react-dynamic-import');
import RealComponent from "./realComponent.js";// Define dynamic import loader function
const loader = () => import(`./withHOC.js`);/**
* Use dynamic module and lazy fetch HOC
*
* Make sure to use it outside render method,
* else new component is rendered in each render
*
* You can choose to show a placeholder and render error
* component in case of error, check API section for more
*/
const DynamicHOC = ReactDynamicImport({ loader, isHOC: true });
const WrappedComponent = DynamicHOC(RealComponent);class Container extends React.component {
render() {
/**
* The actual HOC is lazy loaded and executed,
* which in turn renders the actual component lazily
*/
return ;
}
}
```## Advanced usage
1. Component
- **Folder structure**
```text
|_ dynamic
| |_ realComponent-en.js
| |_ realComponent-eu.js
| |_ realComponent-kn.js
|_ container.js <-- working file
```- **Usage**
```js
// Import library
import ReactDynamicImport from "react-dynamic-import";
// or const ReactDynamicImport = require('react-dynamic-import');/**
* Define dynamic import loader function
*
* This loads specific module from many available
* modules in the directory, using given module name
*/
const loader = f => import(`./dynamic/${f}.js`);// Use dynamic module and lazy fetch component
class Container extends React.component {
constructor(props) {
super(props);/**
* Make sure to use it outside render method, else
* new component is rendered in each render
*
* You can choose to show a placeholder and render error
* component in case of error, check API section for more
*
* This loads different module when different language
* configuration is passed
*/
this.RealComponent = ReactDynamicImport({
name: `realComponent-${props.lang || "en"}`,
loader
});
}render() {
const { RealComponent } = this;/**
* This component is dynamically fetched and rendered
* on first usage/render
*/
return ;
}
}
```1. HOC
- **Folder structure**
```text
|_ dynamic <-- Dynamic HOC's
| |_ withHOC-en.js
| |_ withHOC-eu.js
| |_ withHOC-kn.js
|_ realComponent.js <-- Real component to wrap in HOC
|_ container.js <-- working file
```- **Usage**
```js
// Import library
import ReactDynamicImport from "react-dynamic-import";
// or const ReactDynamicImport = require('react-dynamic-import');
import RealComponent from "./realComponent.js";/**
* Define dynamic import loader function
*
* This loads specific module from many available
* modules in the directory, using given module name
*/
const loader = f => import(`./dynamic/${f}.js`);// Use dynamic module and lazy fetch component
class Container extends React.component {
constructor(props) {
super(props);/**
* Make sure to use it outside render method, else
* new component is rendered in each render
*
* You can choose to show a placeholder and render error
* component in case of error, check API section for more
*
* This loads different module when different language
* configuration is passed
*/
const DynamicHOC = ReactDynamicImport({
name: `withHOC-${props.lang || "en"}`,
loader,
isHOC: true
});
this.WrappedComponent = DynamicHOC(RealComponent);
}render() {
const { WrappedComponent } = this;/**
* The actual HOC is lazy loaded and executed,
* which in turn renders the actual component lazily
*/
return ;
}
}
```Checkout [API](#api) for more info.
## API
- [React Dynamic Import](docs/react-dynamic-import.md)
## Contribute
Thanks for taking time to contribute, please read [docs](docs) and checkout [src](src) to understand how things work.
### Reporting Issues
Found a problem? Want a new feature? First of all see if your issue or idea has [already been reported](../../issues).
If don't, just open a [new clear and descriptive issue](../../issues/new).### Submitting pull requests
Pull requests are the greatest contributions, so be sure they are focused in scope, and do avoid unrelated commits.
- Fork it!
- Clone your fork: `git clone https://github.com//react-dynamic-import`
- Navigate to the newly cloned directory: `cd react-dynamic-import`
- Create a new branch for the new feature: `git checkout -b my-new-feature`
- Install the tools necessary for development: `yarn`
- Make your changes.
- Commit your changes: `git commit -am 'Add some feature'`
- Push to the branch: `git push origin my-new-feature`
- Submit a pull request with full remarks documenting your changes### TODO
- [ ] Test cases
## License
[MIT License](https://opensource.org/licenses/MIT) © [Ganapati V S](https://meetguns.com)