# Getting Started: Hitchy & Vue

Hitchy as a framework is suitable for implementing a server-side business logic. Even though you could have some server-side rendering of views, too, implementing separate client-side applications is rather common nowadays.

In this tutorial you'll learn how to combine Hitchy with Vue to achieve right that.

# Prerequisites

First of all, a local installation of Node.js is required.

In addition, Vue CLI must be installed globally using npm which comes included with Node.js.

npm install -g @vue/cli

Optionally use git for version management.

# Create Project

Create and enter a new folder for containing whole project:

mkdir myapp
cd myapp

Initialize git or any other version control system in project folder:

git init

Create a file .gitignore containing

.idea
.vscode
**/node_modules
**/npm-debug.log
data
server/public

Commit initial version:

git add .
git commit -a -m "initial commit"

# Vue Part

With CLI still residing in project folder myapp, create Vue project in sub-folder frontend:

vue create -n frontend

Pick preferred set of tools. We suggest using vue-router and vuex. Save it for re-using with upcoming projects.

# Hitchy Part

While still residing in project folder myapp it's time to create another sub-folder server containing Hitchy-based server side of application:

mkdir server
cd server
npm init -y
npm install hitchy @hitchy/plugin-static @hitchy/plugin-proxy @hitchy/plugin-odem @hitchy/plugin-odem-rest

Adjust the file myapp/server/package.json by adding start in scripts, adding private property and removing main property:

{
  "name": "server",
  "version": "1.0.0",
  "private": true,
  "description": "",
  "scripts": {
    "start": "hitchy start",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

Optionally use these tools for testing server-side code:

npm install -D eslint eslint-plugin-promise eslint-config-cepharum mocha should @hitchy/server-dev-tools

Integrate them with package.json file modified before:

{
  "name": "server",
  "version": "1.0.0",
  "private": true,
  "description": "",
  "scripts": {
    "start": "hitchy start",
    "lint": "eslint .",
    "test": "mocha --ui tdd 'test/**/*.spec.js'"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "eslintConfig": {
    "extends": ["eslint-config-cepharum"]
  }
}

# Wrap Vue in Hitchy

Using two separate plugins Hitchy is configured to deliver the Vue-based frontend application in development setups as well as in production use. You should always support either scenario.

  • For simplified use during development

    Create a file myapp/server/config/proxy.js containing

    exports.proxy = process.env.NODE_ENV === "production" ? [] : [
      {
        prefix: "/",
        target: "http://127.0.0.1:8080/"
      }
    ];
    

    This enables reverse proxy plugin of Hitchy forwarding all requests not matching any more specific route to the development server of Vue assumed to be running locally as well.

  • For eventual production use

    Create a file myapp/server/config/static.js containing

    exports.static = process.env.NODE_ENV === "production" ? [
      {
        prefix: "/",
        folder: "public",
        fallback: "index.html"
      }
    ] : [];
    

    This causes Hitchy to statically expose all files in the folder myapp/server/public.

    Add option outputDir in file myapp/frontend/vue.config.js:

    module.exports = {
      lintOnSave: false,
      outputDir: "../server/public"
    }
    

    This setting is causing builds of Vue application being written to myapp/server/public accordingly.

# Test Run

Now it's time to start Vue's development server and Hitchy. Invoke

npm run serve

in context of sub-folder frontend for starting Vue and

npm run start

in context of sub-folder server for starting Hitchy. Observe output of the latter for picking URL to open in a browser. This will present home screen of Vue skeleton created before.

# Customize Hitchy

# Use Persistent Data Backend

For Hitchy's ODM persistently saving data you need to set up an adapter. You can go without, but the ODM is using in-memory backend by default, thus loosing all data on restarting server-side of application.

Create a file myapp/server/config/database.js with following content:

const Path = require( "path" );

module.exports = function() {
    return { 
        database: {
            default: new this.runtime.services.OdemAdapterFile( {
                dataSource: Path.resolve( __dirname, "../../data" ),
            } ),
        },
    };
};

This is selecting another ODM backend shipped with ODM plugin itself for storing data in local file system. The configured folder will be myapp/data and that's why it has been listed in .gitignore file created earlier.

Production Use

It's basically okay to use this backend in production setup, as well, unless you are running your application as a single instance in a cluster without reliable access to some "local" filesystem. In addition, you shouldn't ever use it on running multiple instances of your application in a cluster reliably sharing a local filesystem for Hitchy's ODM isn't made for that. Please refer to manual of separate plugin for connecting the ODM with an etcd cluster.