create-react-app 开发环境编译太慢的解决方案

本文介绍两种有效提升React应用启动和编译速度的方法。一是利用babel-plugin-dynamic-import-node转换import()为require(),实现异步组件同步加载;二是手动修改路由组件导入方式,结合react-loadable进行按需加载。对比显示,第一种方案启动时间减少一半以上,编译时间提速20多倍;第二种方案启动时间减少近一半,编译时间提速五倍左右。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目环境:windows 10 1089版本 create-react-app:3.0.0 react:16.8.6 react-router-dom:5.0.0

方案一

使用 babel-plugin-dynamic-import-node

原理:转换 import()为 require(),将所有异步组件都用同步的方式引入
页面路由配置文件:使用react-router推荐的loadable加载文件,不做任何修改

使用步骤

  1. 安装包
npm install babel-plugin-dynamic-import-node --save-dev

or

yarn add babel-plugin-dynamic-import-node --dev
  1. 配置环境变量

项目根目录下建 .env.development文件和.env.production文件

.env.development 文件

NODE_ENV=development
PUBLIC_URL=/
port=8343

.env.production文件 文件

NODE_ENV=production
PUBLIC_URL=/
port=8343

  1. 配置 .babelrc (package.json配置:把下面env字段对象放到"babel"字段配置项里就好)

{
    "presets": [
        "react-app"
    ],
    // 开发环境下配置项
    "env": {
        "development": {
          "plugins": [
            "dynamic-import-node"
          ]
        }
      },

    "plugins": [
        [
            "@babel/plugin-proposal-decorators",
            {
                "legacy": true
            }
        ],
        [
            "import",
            {
                "libraryName": "antd",
                "libraryDirectory": "es",
                "style": "css"
            }
        ]
    ]
}

  1. 启动项目 yarn start 完成后改变项目代码运行编译时间对比
    配置前
    在这里插入图片描述
    配置后
    在这里插入图片描述

通过两张图对比我们发现启动时间从27.269秒减少到11.462秒,快了一半多。
修改文件编译时间从16.931秒减少到0.702秒,快了20多倍。

方案二

手动修改加载路由组件的导入方法
1.项目文件目录
在这里插入图片描述

2.核心修改
src/router/loader.js 文件

import Loadable from "react-loadable";
import Loading from "@/components/Loading";

// 项目中所有页面在views文件下

const devLoader = file => require("@/views/" + file ).default;

const loader = viewPath =>
  Loadable({
    loader: () => import(`@/views/${viewPath}`),
    loading: Loading
  });

const _import = process.env.NODE_ENV === "production" ? loader : devLoader;

export default _import;

3.在路由配置文件中
src/router/modules/appSetting.js 文件中导入loader文件

import React from "react";
import loader from "../loader";

// 酒店信息设置
const SettingHotel = loader(`setting/baseSetting`);
// 协议设置
const SettingProtocol = loader(`setting/protocol`);

const routers = [
  {
    path: "/setting",
    title: "设置",
    icon: "setting",
    redirect: "/setting/base",
    forbiddenLink: true,
    subRouters: [
      {
        path: "/setting/base",
        component: () => <SettingHotel />,
        title: "基础设置"
      },
      {
        path: "/setting/protocol",
        component: () => <SettingProtocol />,
        title: "协议"
      }
    ]
  }
];

export default routers;

4.修改完成后启动项目,并修改项目代码
修改前
在这里插入图片描述
修改后
在这里插入图片描述
通过两张图对比我们发现启动时间从27.269秒减少到14.312秒,快了近一半。
修改文件编译时间从16.931秒减少到3.696秒,快了五倍左右。

其他方案

采用react-hot-loader热加载局部更新

实际体验对开发编译速度提升不大,此处略。

总结

推荐使用第一种方案,除了速度快,副作用也比较少。

第二种方案src/views/下的 .jsx或.js 文件都会被打包。不管你是否被依赖。所以这样就产生了一个副作用,就是会多打包一些可能永远都用不到 js 代码。当然这只会增加 dist或build文件夹的大小,但不会对线上代码产生任何的副作用。

第一种方案解决了第二种方案重复打包的问题,同时对代码的侵入性也很小,平时写路由的时候只需要按照官方文档路由懒加载的方式就可以了,其它的都交给babel来处理。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaofei0627

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值