【问题标题】:Using React Router with CDN and without webpack or browserify将 React Router 与 CDN 一起使用,而无需 webpack 或 browserify
【发布时间】:2017-04-07 11:17:27
【问题描述】:

Resume:我需要在没有 wepback 或类似工具的情况下运行 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 属性的验证函数。这 已弃用,将无法在下一个主要产品中使用 版本。由于第三方 PropTypes,您可能会看到此警告 图书馆。

所以,我想我的 react 路由器是旧版本。我把链接改成了

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

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

我搜索了一下,似乎问题出在第 1 行。所以我改变了这个:

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

到这里:

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

现在我遇到了这个问题:

app.js:2 Uncaught ReferenceError: require is not defined

我搜索了 require.js,尝试了一些东西,但没有解决我的问题。我错过了什么?我需要在没有 webpack 或类似工具的情况下运行它。

谢谢

【问题讨论】:

    标签: javascript reactjs requirejs react-router cdn


    【解决方案1】:

    react route v4.0,请阅读react-router package 在你的页面上添加两个js链接:

    <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>
    

    你可以在js代码中使用:

    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 Objects

    【讨论】:

    • 您可能还想为嵌套路由添加const NavLink = window.ReactRouterDOM.NavLink;。这是React Router V4 Nested Routing example on Codepen
    • 为我节省了一个小时的调试和挖掘时间。谢谢!
    • 谢谢你这实际上解决了它,以便你如何通过CDN正确导入react-router
    • 我们甚至需要
    【解决方案2】:

    这是一个如何实现的最小示例:

    <!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>

    【讨论】:

    • 顺便说一句,你可以跳过在 head 部分添加 react-router.min.js 脚本,因为 react-router-dom.min.js 是自给自足的
    【解决方案3】:

    在你的 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 -- 它不使用导入语句。

    【讨论】:

    • 我尝试了与 4.0.0 类似的方法,但没有成功。 3.0.0 太容易了,非常感谢!
    最近更新 更多