我有一个看起来像这样的路由配置(仅显示我认为可能相关的部分):
var React = require('react');
var Router = require('react-router');
var { Route, DefaultRoute, NotFoundRoute } = Router;
var routes = (
<Route handler={AppHandler}>
<DefaultRoute handler={HomeHandler}/>
<Route name='home' path='/home' handler={HomeHandler}/>
<Route name='settings' path='/settings/?:tab?' handler={SettingsHandler}/>
<NotFoundRoute handler={NotFoundHandler}/>
</Route>
);
Router.run(routes, Router.HistoryLocation, function (Handler) {
React.render(<Handler/>, document.getElementById('application'));
});
现在,在我的设置反应文件中,我有以下内容:
var Settings = React.createClass({
mixins: [Router.State],
render: function() { ... }
});
如果我访问host.local/settings
并记录this.getParams()
一切正常,并且文件呈现Object {tab: undefined}
在控制台中显示我。但是一旦我尝试host.local/settings/user
- 我希望控制台返回类似的东西Object {tab: 'user'}
- 整个事情就会在某个地方崩溃并开始抛出Uncaught SyntaxError: Unexpected token <
控制台。
React 还很年轻,因此在许多情况下错误相当模糊。
我遵循了路径匹配指南中提供的规范,它看起来很标准,所以我只能假设这是 react-router 本身的问题,还是我遗漏了什么?
更新
tl; dr:这不是 react-router 的问题。
长版:
显然,事实证明问题不在于 ReactJS 也不在于 React-Router 本身。它主要涉及gulp-webserver上的一个错误(我用于开发使用代理来连接并行运行的单独项目)并在直接在浏览器上键入 URL 而不是通过链接访问时触发错误。
我做了一个测试,它在导航时工作正常,但在直接访问时崩溃,如this github issue所述,这基本上使我的功能性深度链接测试不可行,但在生产中应该可以工作。
更新 2
tl; dr:gulp-webserver 也不是问题。
就我而言,它relative
与absolute
路径有关,与前面提到的 gulp-webserver 没有任何问题。更具体地说,我必须确保您的脚本和 CSS 引用是绝对的,这样它就不会尝试在您输入 URL 的路径中找到它们。
例如:
您有两个 URL:/settings
和/settings/account
. 在这种情况下,如果您将脚本包含在后备文件中,类似于<script src="scripts/main.js"></script>
,服务器将为它返回 404,因为/settings/scripts/main.js
.
我很愚蠢,但万一其他人为此而堕落,我希望这会有所帮助。