Exseed

Build Status npm version

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

  1. Install CLI

    $ npm install -g exseed
  2. Clone the example project

  3. Install dependencies

    $ cd example
    $ npm install
  4. Run it

    $ sd serve --watch --development

Example - Todo List

We are going to show you how to write a todo app with exseed

  1. Register new app

    // <project_root>/app.js
    
    import * as exseed from 'exseed';
    
    exseed.registerApp('core', './exseed.core');
    // ...
    exseed.registerApp('todo', './todoapp');
    // ...
    
    export default exseed;
  2. Create database schema

    // <todo_app>/models/todolist.js
    
    export default {
     identity: 'todolist',
     attributes: {
       content: {
         type: 'string',
         required: true,
       },
     },
    };
  3. 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;
  4. 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

Docs