7 min read

Aplicação Restful VueJS com Loopback.io. Part I

Este artigo/projeto é um pequeno exemplo de como criar incriveis aplicações com VueJS no front-end e loopback.io no back-end com uma API Restful. Mas você pode utilizar qualquer framework para SPA. Nesta serie nos vamos ver:

  • Instalando e configurando Loopback.
  • Instalando e configurando VueJS.
  • Como rodar VueJS e Loopbback juntos utilizando a mesma porta.
  • Back-end:

    • Loopback modelos e relacionamentos.
    • Como criar uma carga de dados inicial.
    • Customização de erros.
    • Como utilizar filtros e parametros de url.
    • Autenticação e autorização.
  • Front-end:

    • Como organizar uma aplicaçao em VueJS.
    • Como adicionar bibliotecas de terceiros.
    • Utilizar o Element-ui para construir a interface.
    • Validação de formulários com Vee-validation.
    • XmlHttpRequest com Axios.
  • Build and Deploy.
  • Integração continua com Codeship e Heroku.

Lembrece você pode utilizar a lista de front-end com qualquer um desses frameworks: Angular, React, Ember, jQuery etc...

Você encontra mais informações sobre os frameworks utilizados neste artigo aqui: VueJS, e aqui: LoopBack.io.

Iniciando

Como primeiro passo, se você ainda não tem instalado, vamos instalar nossas ferramentas. Este artigo assume que você já tem instalado o NodeJS em sua maquina e um bom entendimento sobre SPA, e desenvolvimento web em geral, além é claro de JavaScript, HTML

Instalando o loopback e o VueJS em sua maquina.

1- Esse projeto foi criado utilizando o loopback-cli, então instale com o seguinte comando:

npm install -g loopback-cli

O comando executado acima vai instalar o LoopBack v3 em sua maquina.

2- O próximo passo é instalar o vue-cli, utilise o seguinte comando:

npm install -g @vue/cli

O comando executado acima vai instalar o VueJS v3 em sua maquina.

Notas importantes sobre VueJS.

O nome do pacote mudou de vue-cli* para @vue-cli. Se você tem a versão anteriror vue-cli (1.x or 2.x) instalado globalmente, você previsa desinstalar com: npm uninstall vue-cli -g ou yarn global remove vue-cli.

Requerimentos para versão do NodeJS.

Vue-cli* requer Node.JS versão 8.9 ou superior (8.11.0+ recomendado). Você pode gerenciar mutiplas versões do NodeJS na mesma maquina com nvm ou nvm-windows.

Criando uma nova aplicação back-end

Neste passo nos vamos criar uma simples API utilizando o loopback-cli. Então vamos ver como fazemos.

3- Para criar uma aplicação do zero com LoopBack cli utilise o seguinte comando em seu Terminal:

lb

4- Siga as questões com as seguintes respostas:

App name: example
Project directory: example
Loopback version: 3.x (Current)
Kind of application do you have in mind: api-server

No final do Terminal, você deverá ver algo assim:

create .editorconfig
   create .eslintignore
   create .eslintrc
   create server/boot/root.js
   create server/middleware.development.json
   create server/middleware.json
   create server/server.js
   create README.md
   create server/boot/authentication.js
   create .gitignore
   create client/README.md

Note a criação do diretório client, é ai que vamos colocar nosso código front-end.

Criando uma aplicação front-end dentro do loopback

Existem várias maneiras de adicionar código front-end em uma aplicação loopback, entretanto algumas maneiras sugerem a utilização de builds e servidores/portas separadas até mesmo em outro diretório.

Eu prefiro utilizar o mesmo servidor e porta, neste caso a default do loopback 3000, até mesmo porque depois para separar o código não é tão complicado e como essa é uma aplicação simples vamos manter assim.

Vejamos como manter a mesma porta para ambas aplicações. Mãos a obra.

5- Dentro do diretório example, use o seguinte comando:

vue create client

Sim, nos já temos um diretório chamado client na raiz da pasta example, então vejamos o que fazer:

Utilize a opção merge:

Vue CLI v3.5.5
? Target directory /example/client already exists. Pick an action:
  Overwrite
❯ Merge
  Cancel

Selecione manualmente as seguintes opções:

? Please pick a preset: Manually select features
? Check the features needed for your project:
❯◉ Babel
 ◯ TypeScript
 ◉ Progressive Web App (PWA) Support
 ◉ Router
 ◯ Vuex
 ◉ CSS Pre-processors
 ◉ Linter / Formatter
 ◯ Unit Testing
 ◯ E2E Testing
? Use history mode for router? (Requires proper server setup for index fallback in production) Yes
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default): Sass/SCSS (with node-sass)
? Pick a linter / formatter config: Basic
? Pick additional lint features: (Press <space> to select, <a> to toggle all, <i> to invert selection)Lint on save
? Where do you prefer placing config for Babel, PostCSS, ESLint, etc.? In package.json
? Save this as a preset for future projects? (y/N) n

Note que escolhemos YES para primeira questão: Use history mode for router? (Requires proper server setup for index fallback in production) Yes. Mais a frente nesse tutorial veremos como utilizar o fallback para history API dentro de uma aplicação loopback.

No final do comando você vai ver algo similar a menssagem:

🎉  Successfully created project client.
👉  Get started with the following commands:

 $ cd client
 $ npm run serve

Bem, parabéns nos temos uma aplicaçao VueJS criada com sucesso.

Configurando o loopback para servir arquivos estáticos.

Agora vamos ajustar nosso back-end para servir a aplicação VueJS, mas antes de seguirmos em frente, vamos ver umas notas importantes sobre o processo de build.

Nota importante sobre o processo de build:

Neste momento se executarmos o comando sugerido pelo Vue-cli e rodarmos o comando npm run serve dentro do diretório client nossa aplicação vai rodar na porta 8080 padrão do VueJS. Mas lembre-se nos não queremos isso.

Como nos todos sabemos toda aplicaçõe VueJS vem por padrão com alguns scripts de comando para iniciar o servidor, linting e buid da aplicação, como nos podemos ver na tag scripts do arquivo package.json:

  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  }

Mas no nosso caso nos vamos mover os scripts para o arquivo package.json do loopback.

Editado o arquivo middleware.json.

Agora vamos fazer uns ajustes no arquivo middleware.json para configurar a pasta client e servir nossa aplicação VueJS.

6- Dentro da pasta server, abra o arquivo: middleware.json e adicione as seguintes linhas de código dentro da tag files:

  "files": {
    "loopback#static": [{
        "name": "publicPath",
        "paths": ["/"],
        "params": "$!../client/dist"
      },
      {
        "name": "vueRouter",
        "paths": ["*"],
        "params": "$!../client/dist/index.html",
        "optional": true
      }
    ]
  }

Note que a segunda rota é o fallback para o arquivo index.html, esse é o truque para podermos utilizar o History Browser API sugerido pelo VueJS na criação das rotas.

Você provavelmente notou que nos adicionamos um novo diretório dentro da pasta client certo? A pasta dist é onde o VueJS coloca os arquivos de build e nos vamos trabalhar diretemente nessa pasta.

7- Agora remova o arquivo root.js dentro da pasta server/boot. Não tenha medo, não vamos utiliza-lo.

O próximo passo é adicionar as alterações no arquivo package.json dentro da pasta server, sim nos vamos utilizar apenas um package.json, conforme já comentamos anteriormente.

8- Substitua o conteúdo do arquivo server/package.json pelo seguinte código:

{
  "name": "example",
  "version": "1.0.0",
  "main": "server/server.js",
  "engines": {
    "node": ">=4"
  },
  "scripts": {
    "lint-server": "eslint .",
    "start-backend": "node .",
    "posttest": "npm run lint",
    "serve-client": "cd client && vue-cli-service serve",
    "build-client": "cd client && vue-cli-service build --watch",
    "lint-client": "cd client && vue-cli-service lint",
    "nodemon-start": "nodemon",
    "start": "parallelshell 'npm run build-client' 'npm run nodemon-start'"
  },
  "dependencies": {
    "compression": "^1.0.3",
    "cors": "^2.5.2",
    "helmet": "^3.10.0",
    "loopback": "^3.19.0",
    "loopback-boot": "^2.6.5",
    "loopback-component-explorer": "^6.0.0",
    "loopback-connector-mongodb": "^1.18.1",
    "nodemon": "^1.18.11",
    "parallelshell": "^3.0.2",
    "serve-favicon": "^2.0.1",
    "strong-error-handler": "^3.0.0"
  },
  "devDependencies": {
    "eslint": "^5.16.0",
    "eslint-config-loopback": "^8.0.0",
    "@vue/cli-plugin-babel": "^3.6.0",
    "@vue/cli-plugin-eslint": "^3.6.0",
    "@vue/cli-plugin-pwa": "^3.6.0",
    "@vue/cli-service": "^3.6.0",
    "babel-eslint": "^10.0.1",
    "eslint-plugin-vue": "^5.0.0",
    "node-sass": "^4.9.0",
    "sass-loader": "^7.1.0",
    "vue-template-compiler": "^2.5.21"
  },
  "nodemonConfig": {
    "ignore": [
      "client/*"
    ],
    "delay": "2500"
  },
  "repository": {
    "type": "",
    "url": ""
  },
  "license": "MIT LICENSED",
  "description": "example app"
}

Não esqueça de executar o comando npm install na raiz do projeto para instalar as novas dependências do arquivo package.json.

Esta linha de código é onde acontece a mágica:

"start": "parallelshell 'npm run build-client' 'npm run nodemon-start'"

Nos estamos utilizando duas tarefas ao mesmo tempo, uma para fazer o build da aplicação VueJS e com a flag --watch ativada, para sempre que algum arquivo for alterado, o projeto será recompilado e atualizado dentro do diretório dist.

"build-client": "cd client && vue-cli-service build --watch"

A outra tarefa é para rodar o servido utilizando o nodemon.

"nodemon-start": "nodemon"

Mais uma alteração importante é adicionar a seguinte configuração:

  "nodemonConfig": {
    "ignore": [
      "client/*"
    ],
    "delay": "2500"
  }

Isto faz com que o nodemon seja ativado apenas no diretório server, trabalhando apenas em cima dos arquivos do LoopBack.

A última alteração que vamos adicionar é no arquivo .eslintrc na raiz do diretório do projeto:

{
  "extends": "loopback",
  "parserOptions": {
    "parser": "babel-eslint",
    "ecmaVersion": 2017,
    "sourceType": "module"
  }
}

E graças ao pacote parallelshell. Nos podemos rodar mais de uma tarefa ao mesmo tempo: "start": "parallelshell 'npm run build-client' 'npm run nodemon-start'".

Bem, nos vimos uma grande quantidade de código até aqui, agora vamos fazer uma pausa e em breve partimos para o segundo artigo, onde mergulhamos mais a fundo no loopback.

Esse post tem uma versão em Inglês aqui.