reddit-mobile
reddit-mobile is a web server and build system for building polymorphic React applications in node or io.js. It is part of a larger series of plugins that, together, form frontend applications for reddit.
A Brief Overview
This application provides the core to set up an Express web server and html5 history api, and have these send a request object (containing path, data, etc) and a callback (a promise interface) to the App.
This application also provides a build system and a base css framework, shared across plugins.
+---------+ +---------------+
| express | | html5 history |
+---------+ | api |
| +---------------+
req, cb req, cb
| |
\ /
------------------------
|
v
+--------+
| App.js |
+--------+
|
(router)
|
v
+--------+
| plugin | -> cb.resolve({ body: reactElement })
| | -> cb.reject({ status: 401 })
+--------+
The App has an instance of an Express-like request router that it uses to map requests to the appropriate handling function, and is run on both the client- and server- side. The React lifecycle can be used to control client-specific code.
Plugins register themselves via two interfaces:
- Route handlers that take two paramaters,
req
andres
.res
is a promise interface that should be called usingres.resolve({ body: reactElement, status: 200})
orres.reject({ body: error, status: 400})
. (Body and status are optional in both cases, but should generally be added.) A complete example of route handling can be seen at routes.jsx. - Mutators that modify the rendering of react components. An element query syntax is provided, documentation forthcoming.
Getting Up and Running
- Install node.js v4.1+ or iojs 3.0+
- Fork and clone this project.
- Run
npm install
to install other dependencies. - Run
git submodule update --init
to download this project's submodules. - Run
gulp
to build the assets (gulp watch
to set up a filesystem watcher.) - Register a new oauth application and
set up your environment variables. Redirect URI should be
http://localhost:4444/oauth2/token
. - Run
npm start
to start the web server. Optionally, create a startup script atstart.sh
that sets environment variables and starts the server;start.sh
has been added to the.gitignore
and will not get checked in. - If you need to work on dependencies (snoode, horse-react, etc):
- Delete the dependencies you installed from ./node_modules
- Fork and clone the dependencies somewhere
- Run
npm link
within the dependency that you cloned - Repeat recursively if you need to work on a dependency's dependency
- Re-run the build and restart your server (
gulp watch
will watch linked files)