首页 > 其他分享 >React实战篇——二、代码分片

React实战篇——二、代码分片

时间:2022-11-03 10:27:29浏览次数:52  
标签:react 实战篇 代码 React css 分片 import chunk 打包

二、代码分片

默认情况下,npm run build时,create-react-app内部使用webpack将src路径下的所有代码打包成一个js文件和一个css文件。对于一个大型应用,如果还把代码打包到一个文件中,会延长网页的加载时间,给用户带了不好的体验。

理想情况下,用户访问一个页面时,该页面应该只加载自己使用到的代码。解决这个问题的方案是代码分片,将js代码分片打包到多个文件,然后在访问时按需加载

create-react-app通过动态import()方法实现代码分片。import()接收一个模块的路径作为参数,然后返回一个Promise对象,Promise对象的值就是待导入的模块对象:

class App extends Component {
  handleClick = () => {
    import('./moduleA').then(({moduleA}) => {//使用moduleA
    }).catch(err => {
      //处理错误
    })
  }
  render() {
    return (
      <div>
        <button onClick={this.handleClick}>加载moduleA</button>
      </div>
    );
  }
}

以上会将moduleA.js和它所依赖的其他模块单独打包到一个chunk文件中,只有当用户点击了加载按钮,才开始加载这个chunk文件。

 

当项目中使用React Router,一般根据路由信息进行代码分片,每个路由依赖的代码单独打包成一个chunk。例如:

import React, { Component } from "react";

export default function asyncComponent(importComponent) {
  class AsyncComponent extends Component {
    constructor(props) {
      super(props);
      this.state = {
        component: null
      };
    }

    componentDidMount() {
      importComponent().then((mod) => {this.setState({
          // 同时兼容ES6和CommonJS的模块
          component: mod.default ? mod.default : mod
        });
      });
    }

    render() {
      const C = this.state.component;
      return C ? <C {...this.props} /> : null;
    }
  }

  return AsyncComponent;
}
  asyncComponent接收一个函数参数importComponent,importComponent内通过import()语法动态导入模块。在AsyncComponent被挂载后,importComponent就会被调用,进而触发动态导入。  
import React, { Component } from "react";
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import asyncComponent from "./AsyncComponent";

const AsyncHome = asyncComponent(() => import("./components/Home"));
const AsyncLogin = asyncComponent(() => import("./components/Login"));

class App extends Component {
  render() {
    return (
      <Router>
        <Switch>
          <Route exact path="/" component={AsyncHome} />
          <Route path="/login" component={AsyncLogin} />
          <Route path="/posts" component={AsyncHome} />
        </Switch>
      </Router>
    );
  }
}

export default App;

注意!在使用import()时,必须显式的声明要导入的组件路径,webpack在打包时,会根据这些显式的声明拆分代码,否则,webpack无法获得足够的关于拆分代码的信息。

打包后没有单独的css文件了,因为css被打包到各个chunk中,当chunk被加载执行时,会动态的把css插入页面。如果希望把chunk中的css打包到单独的文件,就需要修改webpack使用ExtractTextPlugin插件的配置,但create-react-app没有把webpack的配置文件暴露给用户,为了修改相应配置,需要将create-react-app管理的配置文件放出来。在根路径下执行:npm run eject,项目中会出现config和scripts,scripts中包含项目启动、编译和测试的脚本,config中包含项目使用的配置文件

在webpack.config.prod.js中找到配置 ExtractTextPlugin 的地方:

new ExtractTextPlugin({
  filename: cssFilename,
  allChunks: true //新加配置项
})

重新编译,各个chunk文件使用的css样式又会被统一打包到main.css

注意!npm run eject不可逆

标签:react,实战篇,代码,React,css,分片,import,chunk,打包
From: https://www.cnblogs.com/sxww-zyt/p/16853536.html

相关文章

  • 阿里云oss分片上传,大文件上传
    ​ 阿里云oss分片上传,一定要注意,当分片上传的时候,一般都是大文件,文件上传可能时间很长,一定要注意修改前端响应时间,如果配有网关,网关请求时间酌情修改,使用Nginx代理时,ngin......
  • React 组件销毁时清除订阅、定时器以及清理异步操作和取消请求等资源
    问题Warning:Can'tperformaReactstateupdateonanunmountedcomponent.Thisisano-op,butitindicatesamemoryleakinyourapplication.Tofix,cancel......
  • oss分片上传
    ​分片上传1.OSS依赖          com.aliyun.oss      aliyun-sdk-oss      3.10.2    2.OSS官网提供的上传工具......
  • 深入分析React-Scheduler原理
    关键词:reactreact-schedulerscheduler时间切片任务调度workLoop背景本文所有关于React源码的讨论,基于Reactv17.0.2版本。文章背景工作中一直有在用React......
  • 经常被问到的react-router实现原理详解
    在单页面应用如日中天发展的过程中,备受关注的少了前端路由。而且还经常会被xxx面试官问到,什么是前端路由,它的原理的是什么,它是怎么实现,跳转不刷新页面的...一大堆为什么,......
  • 深度讲解React Props
    一、props的介绍当React遇到的元素是用户自定义的组件,它会将JSX属性作为单个对象传递给该组件,这个对象称之为“props”。函数声明的组件,会接受一个props形参,获取属性传递......
  • 前端面试指南之React篇(二)
    react中这两个生命周期会触发死循环componentWillUpdate生命周期在shouldComponentUpdate返回true后被触发。在这两个生命周期只要视图更新就会触发,因此不能再这两个生命......
  • React的useLayoutEffect和useEffect执行时机有什么不同
    我们先看下React官方文档对这两个hook的介绍,建立个整体认识useEffect(create,deps):该Hook接收一个包含命令式、且可能有副作用代码的函数。在函数组件主体内(这......
  • 前端面试指南之React篇(一)
    组件之间传值父组件给子组件传值在父组件中用标签属性的=形式传值在子组件中使用props来获取值子组件给父组件传值在组件中传递一个函数在子组件中用props来获取......
  • React循环DOM时为什么需要添加key
    一、React渲染流程和更新流程react渲染流程:jsx->虚拟dom->真实domreact更新流程:props/state改变->render函数重新执行->生成新的虚拟dom树->新旧虚拟dom树进......