the-tramp
Version:
Chaplin.js on Node.js. Use it for performance boosts, SEO, re-usability.
64 lines (38 loc) • 3.03 kB
Markdown
The Tramp
=========
Chaplin.js on Node.js. Use it for performance boosts, SEO, re-usability.
# Project Status
Pre-Alpha.
It is currently being tested in a Chaplin app. The following work:
- Controllers
- Models (including validation w/ Backbone.validation)
- Views & Sub-views
- Handlebars templates & helpers
- Chaplin routes integrated into Express' router
- Common.js modules using Chaplin's `loader`
Need to implement:
- Tests (that pass on client and server)
- Composition
- Collection View
- Handlebars Partials (they might work, just haven't tested)
- Sub-views that were not marked as DualViews (so they will be rendered on client-side on if they were a part of the initial view)
- Require/AMD support
## Why render on server-side?
A typical single page app will render after the following requests (in descending order) are made:

The problem is the last request can become very large over time, especially as back-ends scale. This can result in up to or even more than one second of delay.
By rendering the *initial* page on the server-side, this can greatly reduce the initial page loading time, as the last call made in the previous diagram is now done on the server-side before the site loads.

## How it works
An express app is created on Node and then the Tramp is required. It's designed to be a drop in plugin, but at the moment there are a few changes that have to be made to the Chaplin app:
### Loader
Internally, Chaplin uses `loader` instead of the word `require` for loading modules. In order to get the modules to load in the browser & Node and not change the app's build process, it is necessary to change all instances of `require` in the app to `loader`. The behavior is the same; it is just a syntax change.
You may or may not agree with this approach; as this project aims to be an addon to Chaplin, it tries as much as possible to not introduce anything different than how Chaplin's source handles things.
### Template Helpers
In `application.coffee` a new property needs to be created: `templateHelpers`. This is an array with the path to each template helper file. Each template helper file now needs to be exported.
module.exports = (Handlebars) ->
The `Handlebars` object is passed in because the Handlebars object that express uses is tied to `hbs.handlebars` and as such needs to be passed into each template when they are required.
### DualViews
The Tramp introduces a new class, `DualView`. It extends Chaplin's View and adds a few pieces of logic to provide support for rendering a view on server-side. If a view is not extended from a DualView, The Tramp will skip it. The same goes for subviews that are not extending from a DualView.
## Example
An example repo has been made to show how to use The Tramp. [View Example](https://github.com/chrisabrams/The-Tramp-example).