使用CDN和无需webpack或browserify的React Router

20

简历: 我需要在没有webpack或类似工具的情况下运行React Router。直接从CDN链接运行,但我卡在了一些require.js错误中。


我开始构建我的第一个React应用程序,并且在使用React Router时遇到了困难。

HTML:

<body>
    <div id="container"></div>


    <script src="https://unpkg.com/react@15/dist/react.js"></script>
    <script src="https://unpkg.com/react-dom@15/dist/react-dom.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.js"></script>

    <script src="https://npmcdn.com/react-router@2.4.0/umd/ReactRouter.js"></script>

    <script type="text/babel" src="assets/scripts/03_templates/app.js" charset="utf-8"></script>

</body>

JS:

var { Router, Route, IndexRoute, hashHistory, IndexLink, Link, browserHistory } = ReactRouter;

//some classes 

ReactDOM.render((
    <Router history={hashHistory}>
        <Route path="/" component={Window}>
            <IndexRoute component={InitialPage}/>
            <Route path="register" component={Register} />
            <Route path="search" component={Search} />
        </Route>
    </Router>
), document.getElementById("container"));

一切都运行得很好,但我在控制台上看到了这个:

react.js:3639 警告:您正在手动调用React.PropTypes中的验证函数,用于IndexRoute上的getComponent prop。这已被弃用,并且在下一个主要版本发布后将无法在生产中使用。您可能会因第三方PropTypes库而看到此警告。

所以,我猜我的react Router是旧版本。我改变了链接为

<script src="https://cdnjs.cloudflare.com/ajax/libs/react-router/4.0.0-0/react-router.js"></script> 

警告:React.createElement:类型不应为null、undefined、布尔值或数字。它应该是一个字符串(用于DOM元素)或一个ReactClass(用于复合组件)。

我搜索了一下,看起来问题出在第一行。所以我修改了这个:

var { Router, Route, IndexRoute, hashHistory, IndexLink, Link, browserHistory } = ReactRouter;

变成这样:

import { Router, Route, IndexRoute, hashHistory, IndexLink, Link, browserHistory } from 'react-router';

现在我有这个问题:

app.js:2 抛出 ReferenceError: require 未定义

我搜索了 require.js,并尝试了一些方法,但仍然无法解决我的问题。我漏掉了什么?我需要在没有 webpack 或类似工具的情况下运行它。

谢谢

3个回答

20

如果要使用React Router v4.0,请参阅react-router包。在您的页面中添加两个JavaScript链接:

<script src="https://unpkg.com/react-router/umd/react-router.min.js"></script>
<script src="https://unpkg.com/react-router-dom/umd/react-router-dom.min.js"></script>

在 JavaScript 代码中,你可以使用:

const Router = window.ReactRouterDOM.BrowserRouter;
const Route =  window.ReactRouterDOM.Route;
const Link =  window.ReactRouterDOM.Link;
const Prompt =  window.ReactRouterDOM.Prompt;
const Switch = window.ReactRouterDOM.Switch;
const Redirect = window.ReactRouterDOM.Redirect;

此外,也可以使用。

console.log(window.ReactRouterDOM);

输出所有类似以下对象:

ReactRouteDOM 对象


2
你可能还想添加 const NavLink = window.ReactRouterDOM.NavLink; 用于嵌套路由。 这里有一个React Router V4嵌套路由示例在Codepen上 - Oliver Schafeld
节省了我一个小时的调试和挖掘时间。谢谢! - jweyrich
谢谢,这确实解决了问题,这就是通过CDN正确导入React-Router的方法。 - Frumentius
我们到底需要 <script src="https://unpkg.com/react-router/umd/react-router.min.js"></script> 吗???我尝试删除 'react-router.min.js' cdn,只导入'react-router-dom.min.js' ,但一切仍然正常工作... - Frumentius

12

以下是一个最简单的示例,显示如何实现这一点:

<!DOCTYPE html>
<html>
  <head>
    <meta charset='UTF-8'>
    <script src='https://unpkg.com/react@16.3.1/umd/react.production.min.js'></script>
    <script src='https://unpkg.com/react-dom@16.3.1/umd/react-dom.production.min.js'></script>
    <script src='https://unpkg.com/react-router-dom@5.0.0/umd/react-router-dom.min.js'></script>
    <script src='https://unpkg.com/babel-standalone@6.26.0/babel.js'></script>
  </head>
  <body>
    <div id='root'></div>
    <script type='text/babel'>
      const Link = ReactRouterDOM.Link,
            Route = ReactRouterDOM.Route;

      const App = props => (
        <ReactRouterDOM.HashRouter>
          <ul>
            <li><Link to="/">TO HOME</Link></li>
            <li><Link to="/a">TO A</Link></li>
            <li><Link to="/b">TO B</Link></li>
          </ul>

          <Route path="/" exact component={Home} />
          <Route path="/a" component={A} />
          <Route path="/b" component={B} />
        </ReactRouterDOM.HashRouter>
      )

      const Home = props => <h1>HOME</h1>
      const A = props => <h1>A</h1>
      const B = props => <h1>B</h1>

      ReactDOM.render(<App />, document.querySelector('#root'));
    </script>
  </body>
</html>


4
顺便说一下,您可以跳过在头部添加react-router.min.js脚本的步骤,因为react-router-dom.min.js已经足够自给自足。 - kilogram

9

在您的JavaScript代码之上使用以下内容:

var Router = ReactRouter.Router;
var Route = ReactRouter.Route;
var IndexRoute = ReactRouter.IndexRoute;
var Link = ReactRouter.Link;
var browserHistory = ReactRouter.browserHistory;

并删除 import 语句。

我目前正在使用这个 react-router 包: https://unpkg.com/react-router@3.0.0/umd/ReactRouter.js

编辑:

这里有一个 CodePen 的例子: http://codepen.io/lsmoura/pen/pNPOzp -- 它不使用 import 语句。


1
我尝试过类似的东西,使用4.0.0版本没有成功。所以很容易在3.0.0版本中实现,非常感谢! - sandrina-p

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接