To be able to cache webpage content as much as possible then it is important to delay merging data with the HTML markup until the last possible moment (which is in the browser). The moment you merge data with HTML then the page is always specific to the context in which it was retrieved. If this context happens to be a user context (which is almost always the case), then you cannot use this cached page for another user, which is bad for cacheability.
Achieving this "late-merging" of data and markup can be achieved by building the skeleton of the site in very few html pages. Most normal sites could potentially be built using the following skeleton pages:
frontpage/landingpage login content
Of course the more the pages differ from each other the more of these skeleton pages you will have. The point is to isolate the common things between the pages and boil it down to the minimum amount of pages.
dust.js handlebars.js mustache.js
(LinkedIn’s review of quite a few of these template engines The client-side templating throwdown: mustache, handlebars, dust.js, and more).
I am new to the Yii framework, but needed to build a web 2.0 site that should support caching of as much of the content as possible to avoid overloading the webserver re-sending the same markup over and over again just with different data embedded. As far as I could see there was not really any built-in support in Yii to do this (apart from doing it all manually). The exising Mustache extention seemed to be related to server side templating rather than clientside templating. For this reason I created my own extension.
The goals were:
Creating views in Yii clientside should be as similar as possible as creating server side views Templates should be accessible on the clientside without a lot of plumbing code Rendering templates should be clean.
In the following I will try to argue for my decisions on how to solve the above.
- Creating views in Yii clientside should be as similar as possible as creating server side views
-Templates should be accessible on the clientside without a lot of plumbing code
I wanted to be able to put my clientside views in what folder I though made the most sense, and since the clientside templates very much are related to the controller actions that are delivering the data (just like server side views) I wanted to be able to put them for instance in the view folders.
I wanted it to be easy to edit the templates in an IDE and one template should be self contained and not mixed up with the other templates
The templates should not incur a significant serverside overhead (currently I am still working on a better solution than the one I have found - mentioned at the end of the posting).
To achieve the above I decided that in the IDE the client side templates should be seperate files, and to be able to distinguish them from the server side templates then needed another name that supported the js templating engine that I choose (mustache.js), so the file extension ended up being .tpl (since Smarty templates are supported in my IDE).
So the challenge is how to convert disparate files on the filesystem into a single js file that is read and initialized by the browser automatically.
Please read the remaining information about this extension at the full blog posting
I have created a github repository that is available at Yii ClientsideViews extension. I have attempted to create a new extension on the YiiFramework website, but was not able to since I am "too new" on the site.