Trabalhando com arquivos .env no Vue

Uma dúvida interessante que recebi de um leitor foi em como trabalhar de forma correta com configurações distintas entre o servidor de desenvolvimento e o servidor de produção. Por exemplo, quando estamos em desenvolvimento, queremos acessar uma API REST que está também em desenvolvimento, muito possivelmente algo como http://localhost:8080/api, e quando estamos no servidor de produção, a url de acesso a api muda para algo como https://www.seusite.com/api, então é preciso encontrar uma forma correta de manipular estas informações.

Objetivo deste artigo

Criar uma forma de manipular variáveis que mudam de acordo com o servidor de desenvolvimento e produção.

Arquivos .env

No desenvolvimento de sistemas os arquivos “.env” (de environment) são responsáveis em armazenar informações que são sensíveis ao ambiente (desenvolvimento, testes e produção).

Utilizando env no Vue

Minha primeira dica para poder usar arquivos .env no vue é através do o vue-cli, criando uma app básica pronta. Recomendo usar o template webpack com as suas diversas opções de instalação.

Com o Node 8 ou superior instalado, digite no terminal:

npx vue-cli init webpack envtest

Isso irá criar uma aplicação com diversos arquivos prontos para uso. A dificuldade para quem ainda não está habituado com o webpack é saber o que cada arquivo representa. Neste artigo estamos focados apenas na configuração de ambiente.

Para a configuração do seu enviroment, analise o diretório config:

image

Perceba dois arquivos no diretório config: dev.env.js e prod.env.js. Eles são usados no modo desenvolvimento e produção, ou seja, quando você está está executando a aplicação através do comando npm run dev o arquivo dev.env.js é utilizado, e quando você compila o projeto para produção através do comando npm run build o arquivo prod.env.js é utilizado.

Vamos alterar cada arquivo da seguinte forma:

'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')

module.exports = merge(prodEnv, {
  NODE_ENV: '"development"',
  ROOT_API: '"http://localhost/api"'
})

Este é o dev.env.js, com uma informação adicional chamada ROOT_API. Perceba ali um “merge(prodEnv” significando que as variáveis que estão no prod.env.js mas não estão no dev.env.js poderão ser utilizadas.

Vamos agora dar uma olhada no arquivo prod.env.js:

'use strict'
module.exports = {
  NODE_ENV: '"production"',
  ROOT_API: '"http://www.site.com.br/api"'
}

Aqui temos a mesma ROOT_API, mas com o valor apontando para o site real, que deverá ser usada somente em modo de produção.

Acessando as variáveis ENV no seu código

Após criar a variável ROOT_API, podemos usá-la em qualquer lugar do vue através do seguinte caminho:

process.env.ROOT_API

Vamos a um exemplo! Abra o arquivo src/componentes/HelloWorld.vue e no script adicione:

 mounted() {
      console.log(process.env.ROOT_API)
    }

Após executar npm run dev e o navegador abrir, você verá a informação no console do dev tools:

image

Se você executar o comando “npm run build”, o diretório dist será criado com a aplicação pronta para ser enviada ao ambiente de produção, e a variável ROOT_API irá mostrar o valor http://www.site.com.br/api, conforme foi especificado em prod.env.js.

Dessa forma, podemos trabalhar com variáveis diferenciadas pelo ambiente, utilizando a configuração pronta que o template webpack nos fornece. Se você utilizar um outro template, certifique-se de encontrar esta funcionalidade.

E o vue-cli 3 ?

Com o novo cli do Vue, que neste momento está em com status RC (Release Candidate), a forma como acessar as variáveis de ambiente mudaram completamente! Agora, você deve criar dois arquivos na raiz do seu projeto: .env e .env.production. As variáveis que você adiciona no arquivo DEVEM começar com VUE_APP_, por exemplo:

VUE_APP_ROOT_API=http://localhost:3000/api

e forma como você acessa esta variável no seu código vue é:

mounted() {
      console.log(process.env.VUE_APP_ROOT_API)
    }

Por questões de segurança, somente variáveis que começam com VUE_APP_ serão “exportadas” para o vue