# Desenvolva e teste uma function localmente

Você pode rodar uma [function](/pt-br/documentacao/plataforma/functions/) na sua máquina com o [Azion CLI](/pt-br/documentacao/devtools/cli/) e enviar requisições reais antes do deploy. O comando `azion dev` inicia um servidor de desenvolvimento local para o projeto atual. Você lê a resposta que seu código retorna sem fazer o deploy antes.

---

## Pré-requisitos

- [Azion CLI](/pt-br/documentacao/devtools/cli/) instalado e um personal token salvo com `azion -t <seu-token>`.
- Um projeto na sua máquina. Para criar um, rode `azion init` e selecione o preset **Javascript**.

---

## Rode a function localmente

O `azion dev` faz o build do projeto e o serve da sua máquina. Para iniciar o servidor:

```bash
azion dev
```

O comando faz o build do projeto primeiro e então exibe o endereço em que está servindo:

```bash
[Azion Bundler] [Server] › ✔  success   Function running on port http://localhost:3000
```

Use o endereço que o comando exibir. Para escolher a porta, passe `--port`:

```bash
azion dev --port 4000
```

Com o servidor rodando, envie uma requisição para a function de outro terminal:

```bash
curl http://localhost:3000/
```

A resposta que seu handler retorna aparece no terminal. Tudo que o código escreve com `console.log()` aparece no terminal que roda o `azion dev`.

---

## Forneça variáveis de ambiente localmente

Uma function lê uma variável com `Azion.env.get()`, que recebe a chave e retorna o valor:

```js
export default {
  async fetch(request, env, ctx) {
    const message = Azion.env.get('GREETING_MESSAGE') || 'Default value';

    return new Response(message, {
      headers: { 'content-type': 'text/plain' }
    });
  }
};
```

O fallback `|| 'Default value'` importa localmente: `Azion.env.get()` retorna `undefined` para uma chave que não está definida. Um handler que lê a variável direto na resposta retorna a string `undefined` em vez de falhar. Dê um fallback a cada variável, e a function roda antes de qualquer variável existir.

Mantenha os valores locais em um arquivo `.env` junto ao projeto, um par `CHAVE="valor"` por linha:

```bash
GREETING_MESSAGE="Hello from your machine"
```

O `azion deploy` lê `.edge/.env` por padrão. Para apontar para outro arquivo, passe `--env`:

```bash
azion deploy --env .env
```

Nunca versione um arquivo com credenciais reais. Mantenha um `.env.example` com as chaves e valores de exemplo no controle de versão. Deixe o `.env` real fora dele.

---

## Escolha onde testar uma function

Três superfícies rodam uma function antes de ela atender tráfego de produção, e cada uma responde a uma pergunta diferente.

| Superfície                                                                         | Onde roda                        | Use quando                                                                                                                               |
| ---------------------------------------------------------------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Desenvolvimento local                                                              | Na sua máquina, pelo `azion dev` | Você está iterando no código, quer requisições reais com seus próprios headers e corpos, e quer um ciclo rápido de editar e rodar        |
| [Preview deployment](/pt-br/documentacao/plataforma/functions/preview-deployment/) | Azion Console                    | Você está trabalhando no Console e quer ler a resposta de uma requisição simulada, construída pelo `PreviewProvider`, sem sair do editor |
| [Code editor](/pt-br/documentacao/plataforma/functions/code-editor/)               | Azion Console                    | Você está escrevendo ou corrigindo o código e quer syntax highlighting e IntelliSense                                                    |

O desenvolvimento local é a única das três que aceita uma requisição composta por você. É onde se exercita um handler em vários métodos, headers e corpos. O Preview deployment envia uma requisição simulada e renderiza a resposta.

---

## Próximos passos

- [Faça o deploy de uma function com o Azion CLI](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/functions-e-runtime/deploy-function-with-cli.md): Pegue o projeto que você rodou localmente e faça o deploy pelo terminal.
- [Variáveis de ambiente](/pt-br/documentacao/plataforma/functions/environment-variables.md): Os campos, os limites e as interfaces que criam uma variável na conta.
- [Azion CLI dev](/pt-br/documentacao/devtools/cli/dev-comando.md): Todas as flags que o comando dev aceita.
- [Solucione problemas de execução e logs](/pt-br/documentacao/plataforma/functions/solucao-de-problemas.md): Leia a saída de log de uma function depois do deploy.
