blog icon indicating copy to clipboard operation
blog copied to clipboard

react-router和react-router-dom的区别

Open mrdulin opened this issue 8 years ago • 25 comments

react-router v4,我称之为“第四代react-router”,react-routerreact-router-dom的区别是什么呢?

为什么有时候我们看到如下的写法:

写法1:

import {Switch, Route, Router, HashHistory, Link} from 'react-router-dom';

写法2:

import {Switch, Route, Router} from 'react-router';
import {HashHistory, Link} from 'react-router-dom';

先简单说下各自的功能:

react-router: 实现了路由的核心功能 react-router-dom: 基于react-router,加入了在浏览器运行环境下的一些功能,例如:Link组件,会渲染一个a标签,Link组件源码a标签行; BrowserRouterHashRouter 组件,前者使用pushStatepopState事件构建路由,后者使用window.location.hashhashchange事件构建路由。

react-router-native: 基于react-router,类似react-router-dom,加入了react-native运行环境下的一些功能。

从源码层面来说明:

首先看react-router-dom中的Switch组件的源码

"use strict";
require("./warnAboutDeprecatedCJSRequire")("Switch");
module.exports = require("./index.js").Switch;

只是从react-router中导入Switch组件,然后重新导出而已。

查看其他模块的源码, Route组件的源码 Router组件的源码 ...

Switch一样,都是从react-router中导入了相应的组件,重新导出而已,并没有对实现做什么特殊处理。

结论:

  1. react-router-dom依赖react-router,所以我们使用npm安装依赖的时候,只需要安装相应环境下的库即可,不用再显式安装react-router。基于浏览器环境的开发,只需要安装react-router-dom;基于react-native环境的开发,只需要安装react-router-nativenpm会自动解析react-router-dom包中package.json的依赖并安装。

react-router-dompackage.json依赖:

"dependencies": {
    "history": "^4.7.2",
    "invariant": "^2.2.2",
    "loose-envify": "^1.3.1",
    "prop-types": "^15.5.4",
    "react-router": "^4.2.0",
    "warning": "^3.0.0"
  }

安装了react-router-domnpm会解析并安装上述依赖包。可以看到,其中包括react-router

  1. 所以,回到最开始的写法。基于浏览器环境的开发,写法1就可以了。

参考链接:

https://github.com/ReactTraining/react-router/issues/4648 https://github.com/ReactTraining/react-router/blob/master/packages/react-router/README.md

Flag Counter

mrdulin avatar Dec 11 '17 04:12 mrdulin

受教了

BYChoo avatar Feb 27 '18 02:02 BYChoo

分析得很清楚学习了

ClarenceC avatar Apr 12 '18 08:04 ClarenceC

我也正尝试作用

hollownewman avatar Jun 04 '18 06:06 hollownewman

清清楚楚、明明白白,喜欢这样的文字。

wcodingw avatar Jun 16 '18 08:06 wcodingw

thx

niceboybao avatar Sep 10 '18 14:09 niceboybao

感谢作者

sidlu-company avatar Nov 24 '18 02:11 sidlu-company

thx

frontsomni avatar Nov 25 '18 07:11 frontsomni

写得很清楚,谢谢

songning0605 avatar Dec 15 '18 07:12 songning0605

thx

stackwar avatar Dec 20 '18 03:12 stackwar

受教了

rainykane avatar Feb 20 '19 03:02 rainykane

thx

YangQii avatar Mar 04 '19 10:03 YangQii

thx

wild2life avatar Mar 26 '19 07:03 wild2life

thx

Shunqiang avatar Apr 11 '19 09:04 Shunqiang

little sun

kangenpingmai avatar May 17 '19 02:05 kangenpingmai

分析明白

Zeus-Iqd avatar Jul 04 '19 06:07 Zeus-Iqd

清楚明了

ghostcode avatar Oct 10 '19 06:10 ghostcode

阿里戈多

gdmec07150725 avatar Nov 02 '19 03:11 gdmec07150725

十分感谢,简洁明了

7neves avatar May 12 '20 01:05 7neves

我一个java开发表示看懂了

HelloJavaWorld123 avatar May 16 '20 06:05 HelloJavaWorld123

受教了

changchangge avatar Sep 04 '20 02:09 changchangge

么么哒

tianyazjq avatar Nov 02 '20 06:11 tianyazjq

3q

Chuyue0 avatar Nov 06 '20 10:11 Chuyue0

谢了,解决了困惑

Wangjinqian avatar Mar 15 '21 02:03 Wangjinqian

3q

orient-i avatar Jul 17 '21 07:07 orient-i

统计来访者的插件数据很有趣,US第一...想半天才反应过来是VPN,妙啊

TimRChen avatar Sep 17 '21 08:09 TimRChen