react实现分片打包

简介: react实现分片打包


前言

React开发过程中,大部分都是单页面应用,不做代码分片的话,所有的js文件都打成一个庞大的bundlejs文件,随着项目内容的不断增多,首屏空白时间就会变得越来越长。

因此可以对代码进行分片,打包时生成多个js文件,每次页面只请求所需要的js文件,用户体验大大提升。

法一:Loadable实现(不推荐)

在React16.6之前懒加载流行使用Loadable包。

  • 安装依赖
npm i react-loadable -S
  • 路由配置
import React from 'react';
import Loadable from 'react-loadable';
const Loading = () => <div>loading</div>;  // 定义一个组件,在组件加载前展示,组件加载完成之后消失
const Index = Loadable({
  loader: () => import('../views/Index/Index'),
  loading: Loading
});
const PageOne = Loadable({
  loader: () => import('../views/PageOne/PageOne'),
  loading: Loading
});
const PageTwo = Loadable({
  loader: () => import('../views/PageTwo/PageTwo'),
  loading: Loading
});
export default [
  {
    path: '/',
    component: Index,
    exact: true,
    title: '首页',
  },
  {
    path: '/PageOne',
    component: PageOne,
    exact: true,
    title: '登录',
  },
  {
    path: '/PageTwo',
    component: PageTwo,
    exact: true,
    title: '登录',
  },
];
  • App.js
import React, { Component } from 'react';
import {
  Route,
  Switch,
  Redirect,
  BrowserRouter as Router
} from 'react-router-dom';
// 这里的是路由配置文件
import routes from './router/index';
export default class App extends Component {
  render() {
    return (
        <Router>
            <Switch>
              {
                routes.length > 0 && routes.map((route) => {  //遍历路由数组
                  const {
                    path,
                    component:C,  // 这样写,是为了以下写法中,用C来代替标签如<Home />,因为不能<component />
                    exact,
                  } = route;
                  return (
                    <Route
                      exact={exact}
                      key={path}
                      path={path}
                      render={(props) => {
                        // 实际上这里会处理很多的业务逻辑,如权限和登录(无token自动跳转到登录页),相当于vue的导航守卫
                        // console.log(props);
                        return (<C />);
                      }}
                    />
                  );
                })
              }
              {/* 默认进入/时自动匹配到/Home */}
              <Redirect
                exact
                from="/"
                to={'/'}
              />
              {/* 默认无效路径时自动匹配到首页 */}
              <Redirect to="/" />
            </Switch>
        </Router>
    );
  }
}

如果react是高版本,会出现这样的警告,所以不推荐使用此方法

法二: 使用react的lazy,Suspense方法实现分片打包

  • 路由配置
import { lazy } from 'react';
const PageOne = lazy(() => import('../views/PageOne/PageOne'));
const PageTwo = lazy(() => import('../views/PageTwo/PageTwo'));
const Index = lazy(() => import('../views/Index/Index'));
export default [
  {
    path: '/',
    component: Index,
    exact: true,
    title: '首页',
  },
  {
    path: '/PageOne',
    component: PageOne,
    exact: true,
    title: '登录',
  },
  {
    path: '/PageTwo',
    component: PageTwo,
    exact: true,
    title: '登录',
  },
];
  • App.js,引入并使用Suspense包裹要懒加载的组件(Route)
import React, { Suspense, Component } from 'react';
import {
  Route,
  Switch,
  Redirect,
  BrowserRouter as Router
} from 'react-router-dom';
// 这里的是路由配置文件
import routes from './router/index';
export default class App extends Component {
  render() {
    return (
        <Router>
          <Suspense fallback={<div>loading</div>}>
            <Switch>
              {
                routes.length > 0 && routes.map((route) => {  //遍历路由数组
                  const {
                    path,
                    component:C,  // 这样写,是为了以下写法中,用C来代替标签如<Home />,因为不能<component />
                    exact,
                  } = route;
                  return (
                    <Route
                      exact={exact}
                      key={path}
                      path={path}
                      render={(props) => {
                        // 实际上这里会处理很多的业务逻辑,如权限和登录(无token自动跳转到登录页),相当于vue的导航守卫
                        // console.log(props);
                        return (<C />);
                      }}
                    />
                  );
                })
              }
              {/* 默认进入/时自动匹配到/Home */}
              <Redirect
                exact
                from="/"
                to={'/'}
              />
              {/* 默认无效路径时自动匹配到首页 */}
              <Redirect to="/" />
            </Switch>
          </Suspense>
        </Router>
    );
  }
}

对redux进行分割

对页面进行分割后,可以进一步的切割页面所需要的数据,我们使用store的replaceReducer方法 在store.js中,添加一个维护当前reducer的对象,和一个更新reduer的方法。

let asyncReducers = {};
export const getNewReducer = (newModuleInfo) => {
  asyncReducers[newModuleInfo.name] = newModuleInfo.reducer;
  store.replaceReducer(combineReducer({
    ...asyncReducers,
  }))
}

在reducerC文件中,需要调用该方法

import { getNewReducer } from './store.js';
const state = { value: '' };
const reducer = (state = state, action) => {
  switch(action.type) {
    case 'setValue':
      return { ...state, value: action.value };
    default:
      return state;
  }
}
export default getNewReducer({ name: 'reducerC', reducer });

文章参考

https://juejin.im/post/6844903953721737224

https://www.jianshu.com/p/164be62145a7

https://segmentfault.com/a/1190000020247862?utm_source=tag-newest

https://blog.csdn.net/xutongbao/article/details/84822315

目录
相关文章
|
2月前
|
前端开发 JavaScript Java
SpringBoot项目部署打包好的React、Vue项目刷新报错404
本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
232 1
|
2月前
|
JavaScript 前端开发 应用服务中间件
本地运行打包好的React、Vue项目
本文讨论了如何本地运行打包好的React和Vue项目,并解决了使用React-Router时Tomcat部署刷新页面导致404的问题,提出了将请求转回index.html的解决方案。
28 1
本地运行打包好的React、Vue项目
|
4月前
|
资源调度 分布式计算 前端开发
[已解决]react打包部署
[已解决]react打包部署
32 0
|
6月前
|
前端开发 JavaScript Linux
relectron框架——打包前端vue3、react为pc端exe可执行程序
relectron框架——打包前端vue3、react为pc端exe可执行程序
167 1
|
6月前
|
存储 前端开发 API
React 实现文件分片上传和下载
在当今的前端开发中,处理文件流操作已经成为一个常见的需求。无论是上传、下载、读取、展示还是其他的文件处理操作,都需要高效且可靠地处理二进制数据。而随着文件大小的增加和网络传输的限制,文件分片上传和下载逐渐成为了提升性能和用户体验的必备技术。
|
6月前
|
JavaScript 前端开发 Java
React-Native Android打包
React-Native Android打包
57 0
|
6月前
|
移动开发 JavaScript 前端开发
React-Native iOS打包
React-Native iOS打包
71 0
|
6月前
|
前端开发 安全 Linux
React Native 打包 App 发布 iOS 及加固混淆过程
本文将介绍如何使用 React Native 打包并发布 iOS 应用到 App Store,并介绍了如何进行应用的加固和混淆过程。
|
SQL 缓存 前端开发
React 实现文件分片上传和下载
在开发中,文件的上传和下载是常见的需求。然而,当面对大型文件时,直接的上传和下载方式可能会遇到一些问题,比如网络传输不稳定、文件过大导致传输时间过长等等。为了解决这些问题,我们可以使用文件分片上传和下载的方式来提高效率和稳定性。 文件分片上传的主要思想是将大文件分解成多个较小的部分,然后分别进行上传,最后在服务端将这些小部分合并成完整的文件。同样,文件分片下载也是将大文件分解成多个分片,然后分别下载,最后在客户端将这些分片合并成完整的文件。
373 1
|
前端开发
React项目的打包步骤
React项目的打包步骤
436 0