Om Next – David Nolen [video]
youtube.com
youtube.com
1. AMD, CommonJS, ES6 module support
2. CLJS in CLJS (yup, that works - including the standalone nodejs based REPL)
Thise in combination are especially huge.With core.typed being an option as well (once your system starts growing and the design solidifies) looks like the clojure ecosystem is really positioned to be one of the technically strongest available for web development.
And of course, replacing that awkward REST mess seems painfully obvious now (except for duplicated data which seems like something that might yet need solving). Hindsight is 20/20
If so, that would resolve what I consider to be one of the biggest barriers for CLJS/JS interop.
Of course, just like the current state of affairs, your library has to not thwart advanced optimizations (using eval, accessing properties by strings, etc).
http://www.infoq.com/presentations/ClojureScript-Optimizatio...
https://github.com/Day8/re-frame-template
Includes Figwheel, and (optionally) Secretary.
Pretty sure Apple won't approve of being able to update iOS apps outside of their regular release cycle. If they don't care, I should be doing that now with my HTML5 app.
3.3.2 An Application may not download or install executable code. Interpreted code may only be used in an Application if all scripts, code and interpreters are packaged in the Application and not downloaded. The only exception to the foregoing is scripts and code downloaded and run by Apple's built-in WebKit framework, provided that such scripts and code do not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store.I really want to try out Om Next. I've been building a bunch of stuff in Om lately and the Falcor/Relay/GraphQL/Om Next stuff is really going to be great to have at my disposal.
The clojurescript compiling clojurescript stuff looks great too.
Seems like going the nosql to sql route once again( nosql is great until you realize query language and schema constraints are actually a good thing).
Having some kind of pipe structure and interface between your db and your GUI that can be used as a contract,or as an intermediate level to do data rearranging, and can be documented, without having to know all the db schema internals really seems like a sound approach. Now of course some people tackling very special problems may reach the limits of such an approach, yet i hope it won't become mainstream too soon.
Every field request in GraphQL [1] maps really well to a method invocation on an object (GraphQL even supports arguments). Its not necessary that those objects in turn map directly to actual database entities... and you can of course do many things with methods, like authentication / authorization, or perhaps even (with async servers) delaying get() requests in order to aggregate them into a single IN query
[1]: https://www.youtube.com/watch?v=WQLzZf34FJ8&feature=youtu.be...
At then end though, you understand why they had to build such a system : dozens of apps, with weekly releases, and mutliple version support.
Now of course, building an API supporting each of those apps needs is almost equivalent to supporting any kind of query. You might as well create a generic implemention, like GraphQL, which they did.
But for the 99.99% of us, i don't think bypassing the API design phase is a really good idea.
All in all its pretty much the same thing as with a classic API. The only difference is you can send multiple (as well as nested) calls in one go, and decide which fields you want to include With this scheme you can even include/exclude fields based on user authorization! For example:
class UserService {
email() {
if (this.context.user.id == this._id)
return this._email
else
throw new CodedError(403, "Cannot request another users email")
}
}
What is necessary now I think is an example open source app implemented with it to demonstrate how the stuff we do with regular APIs would work in GraphQL...I don't think giving frontend a direct path to the db is what the talk is advocating.
You still need a backend in front of the db, even in the special case of using Datomic as the db, to handle things like auth. The difference seems to be that instead of having the backend serve a messy web of REST endpoints for the clients to consume and compose individually, the backend would serve a single endpoint that can speak this new query language. The client can then declaratively request exactly the data it needs in the shape that it needs it in, eliminating an overwhelming majority of network related boilerplate on both the backend and client.
I'm personally extremely excited to see this become mainstream. So much of the front-end code I write on a day-to-day basis involves fetching data from various endpoints and shaping it into a logical structure for my components to display. It's tedious work that provides no intrinsic value. I can't wait to not have to write any more of that and focus my time on solving actual problems.
Sorry if he answers this in his talk. I haven't had a chance to watch it yet.
So I believe you can set the primary backend for the library to a local, in-memory data-structure to serve as the local cache, and have the library handle synchronization between the local cache and a remote backend that can also execute these queries.
(Another question is: "How am I going to use this when my server's database is a blockchain and not a conventional database [1] like datomic?" but I know that's a niche question I'll have to figure out for myself.)
[1] Just kidding (mostly)
I imagine that a scheme based on an UUID and deduplication would work - when constructing the response an object repository is kept and if an object with the same uuid appears twice its replaced with a reference to them.
Going against the "don't extend JSON" best practice, that would be:
{
"friends": [{
"name": "Name",
"events": [#uuid1, #uuid2]
}, {
"name": "Another name",
"events": [#uuid1, #uuid2]
}],
}
#{
"uuid1": {"name": "MyEvent", "description": "..."},
"uuid2": {"name": "OtherEvent", "description": "..."},
}
And it can support cyclic references too, as a bonus. Ignoring best practices is so... liberating.Ultimately this is just compression though. Its possible that gzip will be quite sufficient for most cases.
Now I need a similar thing: in one combo box I choose car brand, and the second combo box is filled with models of that brand. Can I reuse my existing component? If the component knows what data it displays, it can not be used to display different data.
Really excited about building my project in this (and learning clojure and Om Next).