1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title></title>
    6. <script src="https://cdn.bootcss.com/react/15.4.2/react.min.js"></script>
    7. <script src="https://cdn.bootcss.com/react/15.4.2/react-dom.min.js"></script>
    8. <script src="https://cdn.bootcss.com/babel-standalone/6.22.1/babel.min.js"></script>
    9. <script src="https://unpkg.com/react-router-dom/umd/react-router-dom.min.js"></script>
    10. </head>
    11. <body>
    12. <div id="content"></div>
    13. </body>
    14. <script type="text/babel">
    15. console.log(window.ReactRouterDOM)
    16. var BrowserRouter = window.ReactRouterDOM.BrowserRouter
    17. var HashRouter = window.ReactRouterDOM.HashRouter
    18. var Link = window.ReactRouterDOM.Link
    19. var MemoryRouter = window.ReactRouterDOM.MemoryRouter
    20. var NavLink = window.ReactRouterDOM.NavLink
    21. var Prompt = window.ReactRouterDOM.Prompt
    22. var Redirect = window.ReactRouterDOM.Redirect
    23. var Route = window.ReactRouterDOM.Route
    24. var Router = window.ReactRouterDOM.Router
    25. var StaticRouter = window.ReactRouterDOM.StaticRouter
    26. var Switch = window.ReactRouterDOM.Switch
    27. var matchPath = window.ReactRouterDOM.matchPath
    28. var withRouter = window.ReactRouterDOM.withRouter
    29. for(var str in window.ReactRouterDOM) {
    30. console.log(str)
    31. }
    32. ReactDOM.render(
    33. <h1>Hello, world!</h1>,
    34. document.getElementById('content')
    35. );
    36. </script>
    37. </html>

    转载自:[react-router和react-router-dom的区别](https://github.com/mrdulin)
    react-router-v4,我称之为“第四代react-router”,react-routerreact-router-dom的区别是什么呢?
    为什么有时候我们看到如下的写法:
    写法1:
    import {Swtich, 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组件的源码
    // Written in this round about way for babel-transform-imports
    import { Switch } from ‘react-router’
    export default Switch
    只是从react-router中导入Switch组件,然后重新导出而已。
    查看其他模块的源码,
    Route组件的源码
    Router组件的源码

    Swtich一样,都是从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就可以了。

    参考链接:
    ReactTraining/react-router#4648
    https://github.com/ReactTraining/react-router/blob/master/packages/react-router/README.md