是否有人为开发可在服务器和客户端上使用的backbone.js模板找到了一个很好的解决方案?
这对于backbone.js历史堆栈来说是非常理想的,因为用户可以在浏览器位置栏中共享和链接到真实的URL,而node.js服务器可以在第一页面视图上呈现页面,同时使用相同的模板在客户端中重建后续页面视图中的页面。
这也将为用户和搜索引擎提供理想的输出,这些搜索引擎可以抓取链接,而不必解析或执行javascript来查看完全呈现和工作的页面。
更新了更多信息:
两种可能的方法似乎是:
1)骨头 - https://github.com/developmentseed/bones
Bones有一些安装怪癖,目前需要旧版本的节点和npm。
2)胶囊 - https://github.com/andyet/capsule
我还没试过,但看起来很相似。如果有人对这些项目中的任何一个感兴趣,我会感兴趣。
答案 0 :(得分:4)
我目前正致力于framework named "onecode"做你要求的事情。目前它缺乏文档,但我有一个基于它的工作项目,所以它也可以为你工作。我也在寻找贡献者。
这是它的工作原理。几乎所有代码都在客户端和服务器之间共享,包括模型和视图。
$.ajax
方法),客户端(使用标准的Backbone Ajax调用)和服务器本身都使用此API。这意味着:
该架构强制要求一些理智的要求,这将使您成为更好的开发人员。类似的东西:
可以找到一个非常简单的例子in the source tree。我使用Backbone作为模型和视图的基础,Browserify将js包传递给客户端。
在我的项目中,我使用带有EJS的内联模板作为模板引擎。这有利于在同一个地方保留HTML和代码(我使用CoffeeScript)。但该框架能够使用其他模板引擎(如Jade)从外部文件打包模板。请查看templating example如何完成。
如果您对这种方法感兴趣,请告诉我,也许它会让我开始为它编写文档。
答案 1 :(得分:1)
我没有将它用于节点,但我已经为backbone.js广泛使用了胡子并对结果感到满意,并且它有一个端口可以将它与节点一起使用。
答案 2 :(得分:1)
在选择模板语言方面,你几乎可以选择任何基于js的模板语言,包括Underscore Templates,Mustache或Handlebars - 设置它是微不足道的在服务器端生成内容时,Node.js应用程序也会读取的公共可访问路径中的模板。
我个人最喜欢的是Jade,它是Express开箱即用的 - 它强制执行一种非常简单,富有表现力的编码风格。
您可以找到关于如何将Backbone.js和Express here链接在一起的好文章(使用Jade作为模板语言)。
大多数示例都倾向于如何设置一个完全呈现客户端的RESTful应用程序(而不是你真正想要的那样)。
但是,如果您使用可公开访问的文件夹中的模板在Express中进行Web应用程序渲染(我建议将视图分开 - 预处理模板并将html移交给您的视图,以便保持模板的具体化)然后“我们也可以从Backbone.js加载它们,并使用Backbone.js的历史堆栈处理更改。
答案 3 :(得分:0)
您可以使用JSDOM使用node.js呈现您的网页,如下所示
// specify a catch all route
app.get('/namespace/*', function (req, res, next) {
// load the dom
jsdom.env({
html: html,
src: src,
features: {
FetchExternalResources: false,
ProcessExternalResources: false
},
done: function (err, window) {
// overwrite Backbone's sync method with a server-side one
window.Backbone.sync = sync
window.$(function () {
window.Backbone.history.start({ silent: true })
// load requested url
var matched = window.Backbone.history.loadUrl(req.originalUrl.substr(1))
if (matched) // if matched: return resulting html
res.end(window.document.innerHTML)
else
next()
})
}
})
})
因此,您还必须指定以下变量
var sync = function(method, model, options, error) {
// your server side sync method
}
var html = fs.readFileSync(path.join(__dirname, 'views/index.htm'), 'utf-8')
var src = [
fs.readFileSync(path.join(__dirname, 'public/javascripts/jquery.js'), 'utf-8'),
fs.readFileSync(path.join(__dirname, 'public/javascripts/underscore.js'), 'utf-8'),
fs.readFileSync(path.join(__dirname, 'public/javascripts/backbone.js'), 'utf-8'),
fs.readFileSync(path.join(__dirname, 'public/javascripts/your-backbone-stuff.js'), 'utf-8')
]
不幸的是,我没有找到复制创建的窗口/文档对象以供重用的解决方案。
此解决方案也仅适用于例如搜索引擎因为缺少从Backbone Views到相应DOM节点的客户端映射。
答案 4 :(得分:0)
尝试https://github.com/flatiron/plates
在两种环境中均可正常运行,无需DSL且具有干净的API
答案 5 :(得分:0)
在https://github.com/BorisMoore/jsrender尝试 jsrender 。
它是jQuery tmpl的重写,并不需要jQuery或任何DOM。它是一个独立的文件,作者保持新鲜感。
jsrender是用于模板化的字符串替换引擎。我们将它用于NodeJS中的动态和静态页面。我们还将它用于非HTML模板,例如XML,CSV和基于文本的电子邮件。虽然它尚未处于生产模式,但我们已经使用了几个月,而且到目前为止开发非常稳定。
在http://borismoore.github.com/jsrender/demos/demos.html处查看一些很酷的演示。
最简单的,你可以做foreach循环。但是,如果您正在进行专家路线或冒险,您可以运行JS代码(内联或作为函数传递,a.k.a。帮助程序)。当然,在表示层中包含代码是不好的,但有时用您喜欢的语言进行简单的odd()/ even()或nth + 1计算并不会有什么坏处。只需确保您在层之间有一个很好的理解并承担风险。
答案 6 :(得分:0)
答案 7 :(得分:0)
这是在NodeJS中渲染下划线/骨干模板的一个非常简单的示例。我已经使用NPM安装了Underscore。
var http = require('http'),
_ = require('underscore');
http.createServer(function (req, res) {
var template = "<h1><%=message%></h1>"
res.end(_.template( template, {message: "Hello world"}));
}).listen(8080, 'localhost');
答案 8 :(得分:0)
我尝试了很多解决方案,http://ezeljs.com/绝对是最简单,最容易实现的。这才有意义。
Backbone项目的样板,它共享代码服务器/客户端,渲染服务器/客户端,并通过模块化架构进行扩展。
对服务器和客户端使用Jade模板。 Browserify和使用Jade变换绝对是我在客户端和服务器上共享模板的首选方法。