可重用性和抽象性正在扼杀我;我显然已经做了很多客户端开发。 CoffeeScript,Backbone和Marionette都有所帮助。尽管如此,从服务器端向上构建完全可重用的模块化“模板”仍然是不可能的。让我从上到下描述一个问题,然后你可以帮助描述最好的堆栈。
我想构建一个可以使用相同的框架在多个应用程序中进行版本化和重用的登录窗口小部件(这是一个基本的异想天开的例子,带上几粒盐)。一个大型应用程序是一个坏主意,它们无论如何都是单独托管的。所有单独的应用程序都使用相同的API,在其他地方托管,并且不接受任何JSONP。
客户端
一个登录表单将包含一个Marionette ItemView,一些jQuery函数来处理所有花哨的dancy交互,一个Backbone“Account”模型处理POST,GET,DELETE的各个方面,以及一些基本的html与View一定会。 通常情况下,我必须明确为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,看起来相对有希望,但仍然没有像我希望的那样抽象。想法?