react 动态加载组件

2,167 阅读7分钟
原文链接: segmentfault.com
首页 问答专栏 讲堂 更多

SegmentFault

搜索 热门标签 全部 javascriptphppython javamysqlios androidnode.js html5 linuxc++css3 git golang ruby vimdockermongodb 登录免广告
  1. 问答
  2. 问答详情

react如何动态加载组件?

13.4k 次浏览 问题对人有帮助,内容完整,我也想知道答案 1 问题没有实际价值,缺少关键内容,没有改进余地

有很多组件、根据类型不同,希望能够动态加载对应的组件。

现在的做法是,通过if else 或者switch 去渲染,但是这些组件都是一次性的全部加载进来了。

陌鸿ci 22 2017-09-01 提问 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 默认排序 时间排序 7 个回答 答案对人有帮助,有参考价值 2 答案没帮助,是错误的答案,答非所问

可以尝试着使用一下 react-loadable,一款按需加载的工具,功能挺齐全的~~~

Einskang 41 2017-09-03 回答 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

在render函数里面定义一个变量let component = ''保存想渲染的组件,根据条件将不同的组件赋值给前面的变量,最后将变量写入return里面<div>{component}</div>

t现在是冬天t 753 2017-09-01 回答 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

可以搜索一下 webpack,code split

Cola 1.4k 2017-09-01 回答 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

使用 require('Component') 动态加载组件:

if (type = 'number') {
    Input = require('NumberInput')
}

PS:这段代码应该在编译的过程中完成。

notebin 2.8k 2017-09-01 回答 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

segmentfault.com/a/11...
这篇文章写得挺好的,我现在也是按照这种方式做的:

  1. 定义一个 asyncComponent 函数
  2. 使用方式

    import { asyncComponent } from './AsyncComponent'
    
    const Foo = asyncComponent(() => import(/* webpackChunkName: "foo" */ "./foo"))
    
    <Route path="/xx" component={Foo} />
  3. webpack配置文件中,配置chunkName
    chunkFilename: '[name].js'

文章里面用的webpack2, 我使用的是webpack3,功能是OK的。

补充: 也可以看看这篇文章 segmentfault.com/a/11...

无名小贝勒 5.4k 2017-09-01 更新 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

如果你使用的webpack1,可以使用require.ensure();
语法如下:

require.ensure(dependencies: String[], callback: function(require), chunkName: String)

可参考链接:www.css88.com/doc/webp...

如果你用的webpack2或webpack3,请使用import()
语法如下:

import("模块路径").then(ModuleName =>{});

参考链接:webpack.js.org/api/mo...

其实以上是使用webpack代码分离按需加载功能;

以下是参考文章:
webpack 按需打包加载: github.com/eyasliu/bl.…
在Webpack中使用Code Splitting实现按需加载: www.alloyteam.com/2016...
基于webpack Code Splitting实现react组件的按需加载: zhuanlan.zhihu.com/p/...

alwaysVe 1.6k 2017-09-01 回答 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知 答案对人有帮助,有参考价值 0 答案没帮助,是错误的答案,答非所问

react-loadable吧,这玩意很强大,需要webpack2+以及babel-plugin-dynamic-import-webpack插件支持。如果你升级最新create-react-app,则不需要额外配置,直接引入即可,最新版官方脚手架好似已经帮你解决了import()的语法支持。

clipboard.png

dynamic.js

import Loadable from 'react-loadable'
//下面一段代码即可按需按需加载完react组件,webpack会自动切割代码
export const AdminList = Loadable({
  loader: () => import('./admin.list'),
  loading: () => null
})

routes.js

import React from 'react'
import { Route, Switch } from 'react-router-dom'
import * as routerMap from 'rootPath/application/config/routerMap'
import { AdminList } from './dynamic'

export default () => (
  <Switch>
    <Route exact path={routerMap.ADMIN_LIST} component={AdminList} />
  </Switch>
)

webpack切割后的代码:

clipboard.png

小奶桶 983 2017-09-04 回答 提交评论 × 评论支持部分 Markdown 语法:**bold**_italic_[link](http://example.com)> 引用`code`- 列表
同时,被你 @ 的用户也会收到通知

撰写答案

同步到新浪微博 [舍弃] 提交回答

预览

讲堂推荐 更多

Planets 广告位促销,月曝光三千万,10 元/天

推广链接

Java 微服务实践课
上千人学习过的微服务实栈课
大神的PHP 进阶之路
亿级 PV 项目的架构梳理,性能提升实战

相似问题

分享扩散: ••• ×Close

分享

分享到微博?

取消 分享 ×Close

关闭问题(请谨慎操作)

删除问题(请谨慎操作)

删除回答(请谨慎操作)

忽略回答

关闭理由: 删除理由: 忽略理由:

推广(招聘、广告、SEO 等)方面的内容 与已有问题重复(请编辑该提问指向已有相同问题) 答非所问,不符合答题要求 宜作评论而非答案 带有人身攻击、辱骂、仇恨等违反条款的内容 无法获得确切结果的问题 非开发直接相关的问题 非技术提问的讨论型问题 其他原因(请补充说明)

补充说明:

取消 提交 × Close

我要该,理由是:

    返回重选 取消 提交

    在 SegmentFault,学习技能、解决问题

    每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

    免费注册 立即登录
    产品
    热门问答
    热门专栏
    热门课程
    最新活动
    技术圈
    酷工作
    移动客户端
    课程
    Java 开发课程
    PHP 开发课程
    Python 开发课程
    前端开发课程
    移动开发课程
    资源
    每周精选
    用户排行榜
    徽章
    帮助中心
    声望与权限
    社区服务中心
    合作
    关于我们
    广告投放
    职位发布
    讲师招募
    联系我们
    关注
    产品技术日志
    社区运营日志
    市场运营日志
    团队日志
    社区访谈
    条款
    服务条款
    隐私政策

    扫一扫下载 App

    Copyright © 2011-2019 SegmentFault. 当前呈现版本 19.02.27
    浙ICP备 15005796号-2   浙公网安备 33010602002000号 杭州堆栈科技有限公司版权所有

    CDN 存储服务由 又拍云 赞助提供

    移动版 桌面版

    回顶部 为了保证账号安全,请先绑定手机 手机号码test 验证码 获取验证码