Использование React Router с CDN и без webpack или браузера
Резюме. Мне нужно запустить React Router без использования wepback или аналогичных инструментов. Прямо из ссылок CDN, но я застрял с некоторой ошибкой require.js.
Я начинаю строить свое первое приложение с помощью React, и я борюсь с React Router.
HTML:
<body>
<div id="container"></div>
<script src="https://unpkg.com/[email protected]/dist/react.js"></script>
<script src="https://unpkg.com/[email protected]/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/[email protected]/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 функция проверки для getComponent
prop на IndexRoute
. Эта устарела и не будет работать в производстве со следующей крупной версия. Возможно, вы видите это предупреждение из-за сторонних PropTypes библиотека.
Итак, я полагаю, что мой Router - это старая версия. Я изменил ссылку на
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-router/4.0.0-0/react-router.js"></script>
Предупреждение: React.createElement: тип не должен быть нулевым, undefined, boolean или number. Он должен быть строкой (для элементов 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 не определен
Я искал require.js, пробовал некоторые вещи, но ничего не исправил мою проблему. Что мне не хватает? Мне нужно запустить это без инструментов webpack или similars.
Спасибо
Ответы
Ответ 1
Используйте это поверх вашего javascript:
var Router = ReactRouter.Router;
var Route = ReactRouter.Route;
var IndexRoute = ReactRouter.IndexRoute;
var Link = ReactRouter.Link;
var browserHistory = ReactRouter.browserHistory;
и удалите инструкции import
.
В настоящее время я использую этот пакет реактивного маршрутизатора: https://unpkg.com/[email protected]/umd/ReactRouter.js
EDIT:
Вот пример в CodePen: http://codepen.io/lsmoura/pen/pNPOzp - он не использует никаких операторов импорта.
Ответ 2
для реакции на маршрут v4.0, пожалуйста, прочитайте пакет реагировать на маршрутизатор и добавьте две ссылки 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
Ответ 3
Вот минимальный пример того, как это можно сделать:
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<script src='https://unpkg.com/[email protected]/umd/react.production.min.js'></script>
<script src='https://unpkg.com/[email protected]/umd/react-dom.production.min.js'></script>
<script src='https://unpkg.com/[email protected]/umd/react-router.min.js'></script>
<script src='https://unpkg.com/[email protected]/umd/react-router-dom.min.js'></script>
<script src='https://unpkg.com/[email protected]/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>