Focus on improving the first screen loading speed of applications and providing the best user experience.
npm install @route-resource-preload/webpack-pluginπ Focus on improving the first screen loading speed of applications and providing the best user experience, inspiration comes from the preloading of NextJS.
#### δΈζζζ‘£
Based-on-route-resource-preload-effect.gif

As we can see from the gif, the display time of the loading component is greatly reduced by route-resource-preload relative to react.lazy.
Split modules loads as needed, improving the first screen loading experience of your App. Minimize dynamic component loading time and providing the best user experience.automatic the preloading of resources ( JS / Component / Module-Federation / UMD / Svg / Png , Etc) and providing the best user experience. manually to preload.typescript.React .route-resource-preload support code splitting of components, and support automatic preloading and manual preloading of components to avoid poor component interaction experience due to component rendering delays.when to preload in more detailModule-FederationMore types of resource (image/font/svg/css/js/...)> It can be seen from the table that preloading significantly improves the loading speed of components, especially for complex components, the improvement of loading speed is more obvious. This shows that in complex business scenarios, preloading can significantly improve component loading speed and user experience.
shell
npm install @route-resource-preload/webpack-plugin @route-resource-preload/react
`Using in react
#### Method 1 - Manually To Preload Single Component Based on Dynamic
`js
import { dynamic } from '@route-resource-preload/react' const Image = dynamic({
loader: () => import('Components'),
loading: (props) => <>loading...>,
})
const handleClick = () => {
// execute preloading
Image.preload()
}
export default function Main(props){
return
}
`#### Method 2 - Manually To Preload Multiple Components
1. Step 1: First, you need add
plugin in your build config.
`js
const RouteResourcePreloadPlugin = require('@route-resource-preload/webpack-plugin') webpack: {
plugins: {
add: [
new RouteResourcePreloadPlugin({
// [the-preloading-flag]: ['path']
// project's components(modules)
modulePreloadMap: {
"flagA": ["../components/A"]
},
// module-federation's components(modules)
mfPreloadMap: {
"flagMF": ["ling_core/Components"]
},
// static assets (just like js/css/png/jpg/font, etc.)
assetPreloadMap: {
"flagA": ['https://domain.com/xxx.png']
}
})
]
},
}
`2. Step 2: Create a
Preloader and run
`js
import { Preloader } from '@route-resource-preload/react' const preloader = new Preloader()
// execute preloading
preloader.run('flagA')
`#### Method 3 - Automatic Preloading.
1. Step 1: First, you need add
plugin in your build config.
`js
const RouteResourcePreloadPlugin = require('@route-resource-preload/webpack-plugin') webpack: {
plugins: {
add: [
new RouteResourcePreloadPlugin({
// [the-preloading-flag]: ['path']
// project's components(modules)
modulePreloadMap: {
"flagA": ["../components/A"]
},
// module-federation's components(modules)
mfPreloadMap: {
"flagMF": ["ling_core/Components"]
},
// static assets (just like js/css/png/jpg/font, etc.)
assetPreloadMap: {
"flagA": ['https://domain.com/xxx.png']
}
})
]
},
}
`2. Step 2:
Dynamic import component and render PreloadLink
`js
import { dynamic, PreloadLink } from '@route-resource-preload/react' // project's component
const ComponentA = dynamic({
loader: ()=>import('../components/A'),
loading: () => <>loading...>
})
// module-federation's component
const Image = dynamic({
loader: ()=>import('your_lib/Components'),
loading: () => <>loading...>,
submodule: 'Image' // may be you didn't export default, just like " export { Image, ...Others } " in js.
})
export default function Main(props){
return <>
{
navigate('/A') // navigate comes from react-router-dom, you can custom your code.
}}
>
Preload Component A
{/ Link comes from react-router-dom, you can custom your code. /}
Preload MF
>
}
`API
- #### dynamic - Split your component code and load it dynamically
`js
const Modal = dynamic({
loader: () => import('xxx/Modal'),
// loading: () => <>loading...>,
// suspense: true,
// submodule: 'submodule',
// visible: true,
})
`Param | Description | Type | Default Value | necessary
---- | ---- | ---- | ---- | ---
loader | dynamic import module | () => Promise>>| - | β
loading | A spinner for displaying loading state | ComponentType | - | β
submodule | maybe you didn't export default, you need it | string | - | β
visible | whether to render immediately after the components in the view are preloaded | boolean | true | β
suspense | use react
for displaying loading state | boolean | - | β>
dynamic will return a HOC with onEnd prop, which will call back after the component is dynamically rendered to adapt to complex and changeable business scenarios, such as custom loading package elements/or computing component rendering time-consuming, etc.`js
function CommonLoading (props: { moduleName: string }) {
const { moduleName } = props
const [loading, setLoading] = useState(true)
const Com = useMemo(()=>dynamic({ loader: () => import(${moduleName})}),[moduleName]) // custom loading
return
{ setLoading(false)}} />
}
`- #### Preloader - Manually to preload based on
flag
`js
const preload = new Preloader(options)preload.run('flag') // plugin flag
`
Param | Description | Type | Default Value | necessary
---- | ---- | ---- | ---- | ---
publicPath | yout server publicPath | string | - | β> Preloader's
publicPath is the same as RouteResourcePreloadPlugin's publicPath
- #### PreloadLink - Automatic the preloading of resources based on
flag
`js
Preload Component
`Props | Description | Type | Default Value | necessary
---- | ---- | ---- | ---- | ---
flag | the preloading flag | string | - | β
children | children ReactNode | ReactNode | - | β
action | trigger preload action | string (init / inview / hover) | hover | β
onClick | PreloadLink click event | () => void | - | β
className | PreloadLink classname | string | - | β
publicPath | yout server publicPath | string | - | β
> PreloadLink's
publicPath is the same as RouteResourcePreloadPlugin's publicPathPlugin
- #### Webpack-RouteResourcePreloadPlugin
> RouteResourcePreloadPlugin's
publicPath is the same as PreloadLink's publicPath
`js
new RouteResourcePreloadPlugin({
// [the-preloading-flag]: ['path'] // project's components(modules)
modulePreloadMap: {
"flagA": ["../components/A"]
},
// module-federation's components(modules)
mfPreloadMap: {
"flagMF": ["xxx/Components"]
},
// static assets (just like js/css/png/jpg/font, etc.)
assetPreloadMap: {
"flagA": ['https://domain.com/xxx.png']
}
})
`Params | Description | Type | Default Value | necessary
---- | ---- | ---- | ---- | ---
modulePreloadMap | project's components(modules) | modulePreloadMap Object | - | β
mfPreloadMap | module-federation's components(modules) | mfPreloadMap Object | - | β
assetPreloadMap | static assets | assetPreloadMap Object | - | β
publicPath | your server publicPath | string | - | β
Others
- #### init / inview / hover
value | Description
--- | ---
init | Trigger preload after PreloadLink rendering
inview | Trigger preload after PreloadLink in the view
hover | Trigger preload after your mouse hover in the PreloadLink
- #### modulePreloadMap Object
`js
{
"flagA": ["../components/A"],
// [the-preloading-flag]: ['your project's components path']
}
`- #### mfPreloadMap Object
`js
{
"flagMF": ["ling_core/Components"]
// [the-preloading-flag]: ['your module-federation's components path']
}
`- #### assetPreloadMap Object
`js
{
"flagA": ['https://domain.com/xxx.png']
// [the-preloading-flag]: ['your static assets link'] (image/font/svg/css/js/...)
}
``