piercey4
eBay Launches Marko 5
Sending a wasteful amount of code to the browser? Maybe there's a better way
Show HN: Isomorphic, framework agnostic document (html/head/body) renderer
Show HN: JSize – Easily compare npm package size
'the' best validation library in JavaScript
How to make universal JavaScript applications – Part 1
How to make universal JavaScript applications – Part 1
Show HN: Rill – The Express style router for the browser
Show HN: Rill – The universal/isomorphic router for modern JavaScript
Rill: lets you pretend that your browser is a fully capable Node.js server
Rill: lets you pretend that your browser is a fully capable Node.js server
Universal middleware framework for JavaScript
Everything you mentioned is achievable with Rill. I have found two simple ways to Isolate server only code in Rill.
1) Have two Rill servers, one with shared code and one without. Where the shared code server interacts with the isolated secure api from the other server.
2) Have one server that calls itself through http(s) requests where the api bits of the server and everything else you mention is hidden behind a "if (!process.browser)" statement. With browserify and other build tools you can have it automatically parse out any server side code. This is my preferred approach because I get to bundle all of the important parts of my app together while still having granular control over where things run.
There are some other interesting frameworks that have come up while I was developing Rill such as https://github.com/catberry/catberry but I think (like many have said in this thread) that there is a fine balance to be had with isomorphic JavaScript. For example I really dislike meteor because I feel like I have little control. I like Rill because it is a perfectly capable backend framework, a perfectly capable front end framework and it all meshes together pretty well.
Ultimately I found that when writing isomorphic SPA's the amount of code you "CAN" share is much more than what is unsharable, personally I am often able to share 90% or more of the front end code and just have to throw in a few "if (!process.browser)"'s to hide some mission critical stuff from the client.
With many isomorphic examples you will find you end up jumping through hoops to share code. Rill makes this part easy but that doesn't mean that absolutely everything can or should be shared.
``` if (!process.browser) app.use(require('./api')) ```
Where the api is your typical REST based api with JWT auth tokens. Then the shared client side part of the api communicates with the secure part through "fetch" which works isomorphically (in the browser it is an ajax request, in the server it is a local http request to itself) you should checkout @rill/fetcher for what I currently use. In Rill there is no issue with having "client only" or "server only" routes, the main benefit is that the api is the same no matter where you are working. Take for example "@rill/progress" which is a progress bar that only does work in the browser, or "@rill/compress" which only does anything on the server or "@rill/logger" which works on both (although with completely different implementations). The goal is certainly to encourage code sharing where possible but to also not get in the way. You can use Rill as a standalone server only app if you want, or even just as an in browser framework, it doesn't really matter.
As for my example with emails it is certainly not real world and I don't recommend having public access to an email api but the point was merely to demonstrate that all of the code could be abstracted to work in either place (even without rill).
My personal setup has been to still separate my api (although still written in Rill) from all of this) which runs as an independent server. Then I have an isomorphic Rill instance communicate with that API. This way I still keep the important things separate.
If there is one thing you can do to annoy programmers though is to use the wrong terminology :p.