Easily share data between Browserify modules meant to run on the server and client.
Example
The following example shares a Backbone Model between the server and browser. However, this could be applied to any module shared server/client.
Inject some constant data on the server and mount sharify
var sharify = require('sharify'); sharify.data = { API_URL: 'http://artsy.net/api/v1', NODE_ENV: process.env.NODE_ENV }; app.use(sharify);
Use in a module that can run on the server or client
var Backbone = require('backbone'), API_URL = require('sharify').data.API_URL; var Artwork = module.exports = Backbone.Model.extend({ urlRoot: API_URL + '/artwork/' };
Inject sharify script in the view
html body if sharify.data.NODE_ENV == 'development' #debug-modal #scripts //- Make sure this is above your other scripts != sharify.script() script( src='/bundle.js' )
Use the shared module server/client
// server.js var Artwork = require('../models/artwork'); app.get('/artwork/:id', function(req, res) { new Artwork({ id: req.params.id }).fetch(//...); });
// client.js var Artwork = require('../models/artwork'), View = require('view.js'); new View({ model: new Artwork() });
Bootstrapping Request-level Data to the Client
You can use sharify to bootstrap dynamic data as well.
Inject data into the sharify.data local
var Artwork = require('../models/artwork'); app.get('artwork/:id', function(req, res, next) { new Artwork({ id: req.params.id }).fetch({ success: function(artwork) { res.locals.sharify.data.ARTWORK_JWEIN = artwork.toJWEIN(); res.render('artwork'); } }); });
Require the data on the client
var Artwork = require('../models/artwork'), ARTWORK_JWEIN = require('sharify').data.ARTWORK_JWEIN, View = require('view.js'); new View({ model: new Artwork(ARTWORK_JWEIN) });
Contributing
Please fork the project and submit a pull request with tests. Install node modules npm install and run tests with make test.
License
MIT