indexpost archiveatom feed syndication feed icon

Layers, like an Onion

2015-03-24

I've been working on improving my knowledge of plain-old, vanilla, JavaScript recently. Avoiding frameworks and libraries (yes, that means jQuery) so that I might better appreciate what they provide and the rough edges they mask.

I've decided to give Clojure, specifically ClojureScript, a rest for a while. Not only do I find that I don't enjoy the language much, but all of the problems it purports to solve are problems that I haven't yet faced. It's no use reading about the virtues of immutability and a language-level focus on coherent data structures when there's no context in which to frame it. I've been tepidly working on and off with a single page application for months now and failed to make much progress, I think because I am only making tentative stabs at the thing, rather than putting in the time necessary to really grok the whole system. Any thorough understanding of web development seems to require a thorough understanding of the peculiarities of JavaScript.

So in rethinking my approach, I'm working on the absolute minimum system for templating, routing and AJAX for what will hopefully be a bare-bones basic single page application. Rather than calling $.ajax I'm trying to work through what exactly an XMLHttpRequest entails. Instead of pulling in a library like Secretary for routing, I'm reading up on implementing client side routers.

Once again I've found the particulars of the language or implementing a certain feature isn't quite so difficult as the rest of the ceremony around them. In this case, actually testing that I was making requests properly was more difficult than framing the requests themselves. Launching a local development server had me facing issues with the same-origin policy. Which is surely solvable, but at the moment is just one more thing in the way of what I was trying to do. In looking for a solution I came across an interesting service that proved helpful: RequestBin. It generates a temporary URL that logs all requests made to it, as such:

        http://requestb.in        application/json; charset=UTF-8        12m ago
        POST /14vi7vs1            13 bytes                    From _____________

        FORM/POST PARAMETERS
        None
        HEADERS

        Via: 1.1 vegur
        Pragma: no-cache
        User-Agent: Mozilla/5.0 Gecko/20100101 Firefox/36.0
        Connection: close
        Connect-Time: 1
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
        X-Request-Id:
        Cache-Control: no-cache
        Content-Type: application/json; charset=UTF-8
        Total-Route-Time: 0
        Host: requestb.in
        Content-Length: 13
        Accept-Language: en-US,en;q=0.5
        Accept-Encoding: gzip, deflate

        RAW BODY

        {"a":1,"b":2}

It's such a simple idea for a service I'm surprised I haven't come across more of the same sort. It's a nice reprieve to fire off a request and if (or more appropriately when) it fails, I can focus on the JavaScript, client-side rather than the development server and everything in between.

I haven't wrapped up the JavaScript work, but I have made progress on a set of minimal AJAX functions now that I have the means to test them. As I work through these things I have to wonder at how homogenized web browsers have become, relative to even a few years ago. There's a disparity in the most modern features, but core functionality like XMLHttpRequest seem pretty well supported. I'm not sorry I don't need to develop my own shims for IE 6, but I do wonder about the future for libraries like jQuery, which has stood the test of time better than most already.