Exseed
A highly extensible nodejs framework
Features
- Highly Extensible
- Easy to Use
- Full Stack
- ORM Integrated
- ES6/ES7 Syntax
- Isomorphic
Workflow & Implementation Details
Item | Choice |
---|---|
Build Tool | Webpack |
Automation | Gulp |
Backend | Node, Express(>=4.0.0) |
ORM | Waterline |
Frontend | React, Redux/Alt, React-Router |
Testing | Mocha |
CI | Travis CI |
Compare to Other Frameworks
Exseed | Express | Koa | Sails | Hapi | |
---|---|---|---|---|---|
Extensibility | ★★★★★ | ★★★★★ | ★★★★☆ | ★★★★☆ | ★★★★☆ |
Threshold | ★★★☆☆ | ★★☆☆☆ | ★★★☆☆ | ★★★★☆ | ★★☆☆☆ |
Build Speed | ★★★★★ | ★☆☆☆☆ | ★☆☆☆☆ | ★★★★☆ | ★☆☆☆☆ |
Full Stack | ✔ | ✔ | |||
ORM | ✔ | ✔ | |||
Modern Syntax | ✔ | ✔ | |||
Isomorphic | ✔ |
Usage
Install CLI
$ npm install -g exseed
Clone the example project
Install dependencies
$ cd example $ npm install
Run it
$ sd serve --watch --development
Example - Todo List
We are going to show you how to write a todo app with exseed
Register new app
// <project_root>/app.js import * as exseed from 'exseed'; exseed.registerApp('core', './exseed.core'); // ... exseed.registerApp('todo', './todoapp'); // ... export default exseed;
Create database schema
// <todo_app>/models/todolist.js export default { identity: 'todolist', attributes: { content: { type: 'string', required: true, }, }, };
The server side
// <todo_app>/settings.js export default { name: 'todo', };
// <todo_app>/index.js import { App, registerModel } from 'exseed'; class TodoApp extends App { constructor(app, name, dir) { super(app, name, dir); registerModel(require('./models/todolist').default); } routing(app, models) { app.get('/api/todolist', (req, res) => { models.todolist .find() .then((todolist) => { res.json(todolist); }); }); app.post('/api/todolist', (req, res) => { models.todolist .create(req.body.todo) .then((todo) => { res.json(todo); }); }); } }; export default TodoApp;
The client side
// <todo_app>/routes.js import React from 'react'; import { Route, IndexRoute } from 'react-router'; import settings from './settings'; import MainPage from './flux/views/pages/MainPage'; export default ( <Route path="/todo" component={MainPage} EXSEED_APP_NAME={settings.name} /> );
// <todo_app>/flux/views/pages/MainPage.js import React from 'react'; import BaseLayout from '../../../../exseed.core/flux/views/layouts/BaseLayout'; export default class MainPage extends React.Component { ... render() { const scripts = [ 'https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js', '/todo/js/bundle.js', ]; return ( <BaseLayout title="Exseed - Todo" scripts={scripts}> <h1>Todo</h1> <input type="text" onKeyDown={this.handleKeyDown.bind(this)} onChange={this.handleChange.bind(this)} value={this.state.content} /> <ul> {this.state.todos.map(todo => ( <li key={todo.id}> {todo.content} </li> ))} </ul> </BaseLayout> ); } };
See the complete todo app