我正在尝试使用前端的backbone.js和node.js / express作为服务器构建单页应用程序,我希望为根提供基本HTML文件,然后当用户导航到任何路径时,例如
mydomain.com/foo/bar
我希望能够通过javascript在客户端处理该路径,而不是往返于服务器.我正在阅读骨干路由和HTML5推送状态.在this article他描述了像这样的推送状态,
实际上,PushState实际上只不过是JavaScript的标准API,它允许我们通过将完整的URL“推送”到浏览器的URL中来操纵浏览器历史记录,而无需往返服务器,并响应URL中的更改使用Javascript – 所有都不使用URL哈希片段.
但是当我使用push状态时,它实际上发出了服务器请求,并期望服务器在/ foo / bar下传递内容.我不明白我怎么能避免这种情况.
现在让我们假设即使使用推送状态,当您直接访问此URL时,您的客户端将在mydomain.com/foo/bar下发出服务器请求.在这种情况下,由于我正在提供默认的HTML文件,并且此默认HTML文件包含指向其中脚本的链接:
<script type="text/javascript" src="/scripts/myscript.js" ></script>
当这个HTML加载时,它开始在/ foo目录而不是root下查找脚本,因为服务器是在/ foo下请求的,这显然不存在.我该如何解决?
我在这一点上真的很困惑.我想知道URL路由通常是如何在单个页面应用程序中完成的.任何帮助将不胜感激.您还可以参考我发布的有关同一问题的其他问题:Backbone Router : Get rid of # in the URL
解决方法:
您尝试实施的解决方案非常有趣,但并非如此简单.当您的服务器收到对mydomain.com/foo/bar的请求时,您应该使用前端(JavaScript)应用程序可以获取的一些参数重定向到您的根目录,以了解原始请求的用途.例如:
>客户端发送GET http://mydomain.com/foo/bar
>服务器重定向(使用Location标头集响应302)到http://mydomain.com/#!/foo/bar
>您的SPA在浏览器中加载,并在启动时检查哈希并找到#!/ foo / bar,因此您删除哈希并触发/ foo / bar路由(这是推送状态).您生成的URL再次是http://mydomain.com/foo/bar:用户浏览的原始网址.
Grooveshark做了类似的事情,虽然它实际上响应了1中发送的请求的页面,它在客户端中进行哈希替换,然后向服务器发送另一个请求.对我来说看起来没必要,也许我忽略了一些东西.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。