可重用性和抽象性正在扼杀我;我显然一直在做很多客户端开发。CoffeeScript、Backbone 和 Marionette 提供了帮助。尽管如此,构建完全可重用、模块化的“模板”——从服务器端到更高——仍然是不可能的。让我从上到下描述一个问题,然后也许你可以帮助描述最好的堆栈。
我想构建一个登录小部件,可以使用相同的框架在多个应用程序中进行版本控制和重用(这是一个基本的异想天开的例子,用一些盐来处理)。一个大型应用程序是个坏主意,无论如何它们都是单独托管的。所有单独的应用程序都使用相同的 API,托管在其他地方,并且不接受 JSONP。
客户端
登录表单将由 Marionette ItemView、一些处理所有花哨交互的 jQuery 函数、一个处理 POST、GET、DELETE 各个方面的 Backbone “Account”模型以及一些带有 View 的基本 html 组成. 通常,我必须为 AJAX 交互显式设置 urlRoot(见下文),但我只想说 '/' + @attributes.email,因为 ROUTE 是什么并不重要,因为一切都捆绑在一起。
class Account extends Backbone.Model
# Normal
create: () ->
@urlRoot = () ->
'/account/' + @attributes.email
@save()
# Ideal
create: () ->
@urlRoot = () ->
'/' + @attributes.email
@save()
服务器端
这是根据客户端(希望在 Scala 中)构建的,而不是在某处显式定义 ROUTE:
POST /account/:email controllers.Account.create(password: String) # Play 2.0 syntax
我只能说:
@POST(/:email?password=[String]) # Made up syntax
create(email, password) = {
# Hit external API
val json = WS.url('https://someapi/v1/account').withQueryParams('email=' + email + '&password=' + password).get()
# Return some response
Ok(json)
}
应用程序框架可能会知道这个模块或模板,@account()
如果我想构建一个具有登录功能的主页,我只需执行以下操作:
<html>
Oh hey cool stuffz, sign up or login please
<right column>
@account()
<end right column>
@social() <!-- perhaps another template -->
<html>
我的设想是应用层将客户端到服务器的调用从模块抽象为 GUID,也许,因此进行“创建帐户”调用实际上会执行以下操作:
POST /35395235/:email account.create(password: String)
虽然我知道这不一定存在,但我偶然发现了 Lift,它似乎相对有前途,但仍然不像我希望的那样抽象。想法?