我有一个复杂的非 SPA(非单页应用程序),一个经典的多页站点,我想在其中使用 Backbone.js。
该应用程序的服务器端由 Django 驱动。
我的问题是:出于SEO的原因,我必须使用 django 模板加载每个 html 内容服务器端,但是为了获得 Backbone 的全部功能,我需要下划线的模板(或把手)来刷新我的主干视图。
所以,我必须用不同的技术和钩子编写两次相同的模板。
我怎样才能避免这种情况?
我有一个复杂的非 SPA(非单页应用程序),一个经典的多页站点,我想在其中使用 Backbone.js。
该应用程序的服务器端由 Django 驱动。
我的问题是:出于SEO的原因,我必须使用 django 模板加载每个 html 内容服务器端,但是为了获得 Backbone 的全部功能,我需要下划线的模板(或把手)来刷新我的主干视图。
所以,我必须用不同的技术和钩子编写两次相同的模板。
我怎样才能避免这种情况?
实际上,您可以编写一个单页应用程序并且仍然支持 SEO。Backbone 的路由器通过为应用程序的每个状态创建一个单独的 URL 来实现这一点。您在整个应用程序中的链接将被抓取。谷歌这些天在抓取 SPA 方面做得很好。我相信您决定不将您的网站创建为 SPA 是受到陈旧意见的影响。
基本上你可以做到这一点,你只需要确保你不会第一次在视图上调用渲染。
说我的页面有这个 html
<ul class="my-list">
<li><a href="#">do something</a></li>
<li><a href="#">do something</a></li>
<li><a href="#">do something</a></li>
</ul>
最初你定义一个视图
var MyView = Backbone.View.extend({
el:'.my-list',
render:function(){
this.collection.each(this.addItem, this);
},
addItem:function(){
//do adding logic here
}
})
实例化使用,但不调用渲染
var myView = new MyView({
collection: myCollection //any collection or model you like here
})
当您想要更新视图时,请调用 myView.render。通过这种方式,您可以获得 SEO 和骨干的好处。我猜像 You Tube 这样的流行网络应用程序确实遵循了类似的方法(可能没有使用 Backbone)。