Syntax Highlighter

2009-12-03

CFJS, one step closer to paradise

I have been obsessed for a long long time about JavaScript and the need for it to be a core factor in bringing ColdFusion out of the niche and into the mainstream. I have a dream, that dream is CFJS a JavaScript specification for CFML. A spec for CFML engines to implement so that they can create the first real consensus of a JavaScript server standard, with potentially three different servers all implementing the same spec that'd be two more than any other implementation! There are plenty of JavaScript servers out there, Rhino hacked into them in one way of form, but none that really offer any real appeal or power behind them. All ColdFusion engines offer superior clustering and database handling with well established power and performance and with integrated JavaScript with mapped functions and classes there's no reason for it not to take off among developers who love both ColdFusion and also the new masses of JavaScript developers who have come into the fold via jQuery.

CFJS is a concept that is almost a reality in one form now thanks to Alan Williamson over at Open Blue Dragon: http://alan.blog-city.com/cfjs_alpha.htm While I really like the work Alan has done there are a few things I would suggest, the first being the JavaScript scope/namespace to be used, currently $cf I would prefer to see one of CFjs, CfJs or preferably cfjs if it is encapsulated by a closure then developers can use whatever shortcut they like just as they do with jQuery becoming $ within a closure when making plugins (when they're done well! ;).

My next desire is to create a clear specification for running frameworks within CFJS, a clear definition within the Application.cfjs file for a framework scope with functions to enable/disable and choose versions of frameworks to use, so cfjs.framework.list() would return an array of framework property objects with their versions and they could be used like:

$ = cfjs.framework('jQuery','1.4');
Fb = cfjs.framework('FuseBox','6.0');  \\(-_o)//
Spry = cfjs.framework('Spry','0.1.6');
CommonJS = cfjs.framework('CommonJS','1.0');
cfjs.application({
    onApplicationStart: function(){}
})

Then the frameworks could be pre-loaded compiled and poentially optimised to hopefully be even faster.

Speaking of compiled and faster, have you seen John Resig's Micro Templating project example?

http://ejohn.org/blog/javascript-micro-templating/



I like the  idea of using something like that only adding
a (potentially jQuery based) compiler so there are no variables in your HTML code AT ALL. I wrote
some code earlier and included three tbody tags in a table one
with a class for no-data-items one for data-items and another called
data-item-template.



The template version looked kind of like:

<tr class="data-items template">


    <input type="hidden" name="temp-id" class="data-item-id" value="temp-value" />



    <td class="data-item-name">User Name</td>



    <td class="data-item-email">User Email</td>


</tr>



I then added a call to:

jQuery(HTML template selector).template(array, function(template, record){


    template.find('data-item-id').val(record.id);


    template.find('data-item-name').text(record.name);


    template.find('data-item-email').text(record.email);

    tbodyData.append(template);


});



Now I haven't actually built it to work yet just throwing ideas around
in my head of just how beautiful templating in server-side JavaScript
can be, but what I intend on checking when I have time is how fast this
performs and whether or not parsing the template first so record.id
would be the text '<cfout>record.id</cfout>' and then using
Mr Resig's templater to do the rest would potentially be faster given
it wouldn't need to continually run a bunch of jQuery calls. Then
there's the option of e4x which I suspect would be faster again. I really wish I had more time each day to play with cfml!