Introdução ao AJAX: Fundamentos, Exemplos e Cuidados

O AJAX, sigla para Asynchronous JavaScript and XML, é uma tecnologia fundamental na criação de páginas web interativas e dinâmicas. Ele permite que as páginas da web se comuniquem com o servidor em segundo plano, sem a necessidade de recarregar a página inteira. Isso proporciona uma experiência mais fluida e responsiva aos usuários, uma vez que apenas partes específicas da página são atualizadas conforme necessário. Neste artigo, exploraremos os fundamentos do AJAX, forneceremos exemplos práticos e discutiremos os cuidados ao usá-lo.

Fundamentos do AJAX

O AJAX é baseado em três tecnologias fundamentais:

  1. JavaScript: O JavaScript é a linguagem de programação que permite adicionar interatividade e funcionalidade às páginas da web. No contexto do AJAX, o JavaScript é usado para iniciar solicitações assíncronas ao servidor e manipular os dados retornados.
  2. XMLHttpRequest: O objeto XMLHttpRequest é o pilar do AJAX. Ele permite que o JavaScript faça solicitações HTTP assíncronas ao servidor. Com esse objeto, você pode enviar dados para o servidor, receber respostas e atualizar partes da página com base nas respostas.
  3. XML ou JSON: Inicialmente, o AJAX foi projetado para trabalhar com dados em formato XML. No entanto, o uso de JSON se tornou mais comum devido à sua simplicidade e eficiência. XML e JSON são usados para estruturar os dados transmitidos entre o servidor e o cliente.

Exemplos de Uso do AJAX

Agora, vamos explorar dois exemplos simples de uso do AJAX:

Exemplo 1: Carregamento de Conteúdo Assíncrono

Imagine um site de notícias que deseja carregar artigos adicionais quando o usuário rolar até o final da página, sem recarregar a página inteira. O AJAX torna isso possível. Aqui está um exemplo básico:

// Função para carregar mais artigos
function carregarMaisArtigos() {
  fetch("servidor.php?pagina=2")
    .then(response => {
      if (!response.ok) {
        throw new Error("Erro ao carregar os artigos.");
      }
      return response.text();
    })
    .then(novoConteudo => {
      // Atualizar a página com o novo conteúdo
      document.getElementById("conteúdo").innerHTML += novoConteúdo;
    })
    .catch(error => {
      console.error(error);
    });
}

Neste exemplo, utilizamos a função fetch para fazer uma solicitação GET assíncrona ao servidor. Quando a resposta é recebida com sucesso, o conteúdo é atualizado na página. Qualquer erro durante o processo é tratado e exibido no console.

Exemplo 2: Autenticação de Usuário

// Função para autenticar o usuário
function autenticarUsuario() {
  var username = document.getElementById("username").value;
  var password = document.getElementById("password").value;

  fetch("autenticacao.php", {
    method: "POST",
    headers: {
      "Content-Type": "application/x-www-form-urlencoded"
    },
    body: "username=" + username + "&password=" + password
  })
    .then(response => {
      if (response.ok) {
        // Usuário autenticado com sucesso
        alert("Autenticação bem-sucedida!");
      } else {
        // Falha na autenticação
        alert("Falha na autenticação. Verifique suas credenciais.");
      }
    })
    .catch(error => {
      console.error(error);
    });
}

Neste exemplo, utilizamos o fetch com um método POST para enviar os dados de autenticação para o servidor. Dependendo da resposta do servidor, uma mensagem de autenticação bem-sucedida ou uma mensagem de falha é exibida.

Lembre-se de que o código acima é apenas uma introdução ao uso do fetch para fazer solicitações AJAX. É importante continuar seguindo as melhores práticas, como tratamento de erros, segurança e considerações de desempenho, ao usar o fetch em projetos mais complexos.

Cuidados ao Usar o AJAX

Embora o AJAX seja uma ferramenta poderosa, é importante usá-lo com cuidado e considerar algumas práticas recomendadas:

  1. Progressive Enhancement: Certifique-se de que seu site ou aplicativo funcione mesmo quando o JavaScript estiver desativado. Use o AJAX para melhorar a experiência, não para torná-la essencial.
  2. Tratamento de Erros: Sempre trate erros adequadamente ao fazer solicitações AJAX. Isso inclui lidar com timeouts, respostas inesperadas e falhas de rede.
  3. Segurança: Proteja suas solicitações AJAX contra ataques de segurança, como Cross-Site Scripting (XSS) e Cross-Site Request Forgery (CSRF). Valide e sanitize os dados antes de enviá-los para o servidor.
  4. SEO: Lembre-se de que os mecanismos de busca podem ter dificuldade em indexar conteúdo carregado via AJAX. Certifique-se de que o conteúdo crítico seja acessível diretamente no HTML.
  5. Performance: Evite fazer muitas solicitações AJAX desnecessárias, pois isso pode afetar o desempenho do seu site. Agrupe solicitações sempre que possível e use o cache quando apropriado.

Em resumo, o AJAX é uma tecnologia essencial para criar páginas da web interativas e dinâmicas. Com a capacidade de enviar e receber dados do servidor de forma assíncrona, ele melhora significativamente a experiência do usuário. No entanto, é importante usá-lo com responsabilidade, seguindo as práticas recomendadas e considerando os aspectos de segurança e desempenho ao incorporá-lo em seus projetos web.

Gostaria de saber mais? De ujma olhada nas referencias e bons estudos

  1. Documentação Mozilla para Fetch:
  2. Livro online “You Don’t Know JS” (Capítulo sobre Fetch):
  3. Livro online “Eloquent JavaScript” (Capítulo sobre Fetch):
  4. W3Schools – Tutorial AJAX:
  5. SitePoint – A Guide to Fetch API:
  6. Artigo sobre Boas Práticas de AJAX:
  7. Artigo sobre Segurança em AJAX:

Esses recursos fornecem uma base sólida para entender e trabalhar com a API Fetch e o AJAX em JavaScript, bem como as melhores práticas associadas a essas tecnologias. Certifique-se de explorar esses materiais para aprofundar seus conhecimentos.

Como fazer um elemento ter o tamanho do elemento filho que tenha position : absolute?

Em projetos de desenvolvimento web, é comum precisarmos posicionar um elemento filho dentro de um container usando position: absolute. O problema é que, quando fazemos isso, o container perde a sua altura e largura, pois os elementos filhos posicionados absolutamente são retirados do fluxo do documento. Isso pode ser um problema quando queremos que o container tenha o tamanho do elemento filho.

Felizmente, há uma solução simples para este problema, que envolve o uso de JavaScript para definir o tamanho do container com base no tamanho do elemento filho. Neste artigo, vou mostrar como fazer um container ter o tamanho do elemento filho quando este filho tem position: absolute usando JavaScript.

Usando JavaScript para definir o tamanho do container

A maneira de fazer um container ter o tamanho do elemento filho quando este filho tem position: absolute usando JavaScript envolve calcular a largura e altura do elemento filho e definir essas dimensões para o container. Veja o código abaixo:

<div class="container" id="container">
  <div class="child">Elemento filho</div>
</div>

<script>
  const container = document.getElementById('container');
  const child = container.querySelector('.child');
  const width = child.offsetWidth;
  const height = child.offsetHeight;
  container.style.width = `${width}px`;
  container.style.height = `${height}px`;
</script>

<style>
  .container {
    position: relative;
  }
  .child {
    position: absolute;
    top: 0;
    left: 0;
  }
</style>

Neste exemplo, a classe .container é definida como position: relative, o que significa que ela será posicionada em relação ao seu pai. A classe .child é definida como position: absolute, o que permite que o filho seja posicionado em relação ao container. As propriedades top: 0 e left: 0 garantem que o filho comece a ser posicionado a partir do canto superior esquerdo do container.

O JavaScript começa selecionando o container e o elemento filho usando document.getElementById e Element.querySelector. Em seguida, o código calcula a largura e altura do elemento filho usando offsetWidth e offsetHeight. Finalmente, as dimensões são definidas para o container usando style.width e style.height.

Conclusão

Neste artigo, vimos como fazer um container ter o tamanho do elemento filho quando este filho tem position: absolute usando JavaScript. Essa solução envolve calcular a largura e altura do elemento filho e definir essas dimensões para o container usando JavaScript. Embora seja um pouco mais complexa do que as soluções CSS, esta técnica é muito útil quando precisamos definir o tamanho do container dinamicamente com base no tamanho do elemento filho.

Entendendo o Prototype do JavaScript

Uma das características mais poderosas do JavaScript é a sua capacidade de trabalhar com objetos, que são instâncias de classes ou protótipos. O sistema de protótipos do JavaScript permite que os desenvolvedores criem objetos de forma flexível e eficiente. Neste artigo, vamos explorar o conceito de prototype no JavaScript e entender como ele funciona.

O que é o Prototype / Protótipo?

O prototype é um mecanismo interno do JavaScript que permite aos objetos herdar propriedades e métodos de outros objetos. Essa herança é diferente da herança de classe tradicional encontrada em linguagens orientadas a objetos, como Java e C#. No JavaScript, a herança ocorre através da chamada “herança prototípica” e é baseada em objetos, em vez de classes.

Herança Prototípica

A herança prototípica é a base do sistema de objetos do JavaScript. Cada objeto em JavaScript tem uma referência interna a outro objeto, chamado de “protótipo”. Quando uma propriedade ou método é acessado em um objeto, o JavaScript primeiro verifica se essa propriedade ou método existe no próprio objeto. Se não for encontrado, o JavaScript procurará no protótipo do objeto. Esse processo continua até que a propriedade ou método seja encontrado ou até que a cadeia de protótipos termine.

Essa cadeia de protótipos é a principal característica que permite a herança no JavaScript. Quando um objeto herda de outro objeto, na verdade está herdeiro do protótipo desse objeto.

Funções Construtoras e o Prototype

No JavaScript, funções construtoras são usadas para criar objetos com propriedades e métodos específicos. Quando uma função é chamada com a palavra-chave “new”, um novo objeto é criado e sua referência de protótipo é atribuída ao protótipo da função construtora.

function Pessoa(nome, idade) {
    this.nome = nome;
    this.idade = idade;
}
const pessoa1 = new Pessoa("João", 30);

Neste exemplo, a função Pessoa é uma função construtora e cria objetos com as propriedades nome e idade. Quando criamos um objeto pessoa1 usando a palavra-chave “new”, o protótipo do objeto pessoa1 é configurado para ser o objeto Pessoa.prototype.

Adicionando Propriedades e Métodos ao Prototype

O prototype é um objeto comum e, como tal, você pode adicionar propriedades e métodos a ele. Isso é útil quando você deseja que todos os objetos criados por uma função construtora compartilhem propriedades e métodos sem precisar redefini-los em cada instância.

Pessoa.prototype.apresentar = function() {
    return `Olá, meu nome é ${this.nome} e tenho ${this.idade} anos.`;
};

console.log(pessoa1.apresentar()); // Olá, meu nome é João e tenho 30 anos.

Ao adicionar o método apresentar ao prototype da função construtora Pessoa, todos os objetos criados a partir dela terão acesso a esse método.

Qual a diferença entre herança de classes e herança herança Prototípica no JavaScript?

Bom, esse é um tópico que merece sua própria postagem. E você pode ver detalhes no post Qual a diferença entre Herança de classes e herança Herança Prototípica no JavaScript?

Mas resumidamente, a herança de classes é baseada em classes, enquanto a herança prototípica é baseada em objetos. Essa diferença fundamental afeta a forma como a herança e a reutilização de código são alcançadas em cada paradigma.

Conclusão

Isso ai, o sistema de protótipos do JavaScript é uma característica poderosa e flexível que permite a herança e o compartilhamento. Espero que tenha gostado e aproveita para conferir nossas outras postagens

Como criar eventos JavaScript customizados

Criar eventos customizados no JavaScript é bem simples e pode ser feito em poucas linhas. O importante é termos os seguintes passos:

  • Criação de um objeto usando new Event
  • Atribuição de um listener a um elemento
  • Chamada ao método que disparará o evento criado e vinculado a aquele elemento.
// Criando o nosso evento
const meuEvento = new Event("meuNovoEvento");

// Atruibuindo o listener ao document mesmo para o exemplo ficar pequeno
document.addEventListener("meuNovoEvento", e => console.log(e))

// executando o evento para o elemento document.
document.dispatchEvent(meuEvento);

Basicamente é isso, abaixo eu gostaria de falar sobre alguns pontos importantes para você entender o que aconte por baixo do panos.

Sincrono ou Assincrono?

Segundo site do mozilla “Ao contrário dos eventos “nativos”, que são disparados pelo navegador e invocam manipuladores de eventos de forma assíncrona por meio do loop de eventos, dispatchEvent() invoca manipuladores de eventos de forma síncrona. Todos os manipuladores de eventos aplicáveis ​​são chamados e retornados antes do retorno de dispatchEvent().”

Modificando as propriedades do Evento

Se você executou o evento acima você deve ter visto no console que aparecem várias propriedades para o evento. Algumas uteis, outras apenas se você está querendo criar algo extremamente complexo.

Vamos falar de algumas delas

  • isTrusted: Será true quando o evento foi disparado por uma interação do usuário e false quando algum código JavaScript o fez.
  • bubbles: Determina se a aplicação fará o bubbling pelo DOM
  • cancelable: Informa se o elemento pode ser cancelado pelo comando e.preventDefault()
  • target: O elemento que sofreu a ação.
  • currentTarget: Normalmente é o mesmo que objeto que o target a não ser que tenha ocorrido algum redirecionamento.
  • type: O tipo, o nome do nosso elemento.

Então era isso, caso você tenha interesse em aprofundar os seus conheicmentos eu recomendo dar uma lida na documentação oficial que você pode acessar por este link https://developer.mozilla.org/en-US/docs/Web/API/Event

Microsoft cria proposta de tipagem para o JavaScript

A proposta planejada pela Microsoft e outros, incluindo desenvolvedores do programa Igalia Coding Experience e da Bloomberg, trata de adicionar “tipos como comentários” à linguagem.

A teoria é que seria possível ter uma sintaxe para tipos que poderiam ser usados ​​por ferramentas que precisam desses ganchos (como o próprio TypeScript da Microsoft) e ignorados por aqueles que não precisam.

Para ver a proposta orgina, clique aqui: https://devblogs.microsoft.com/typescript/a-proposal-for-type-syntax-in-javascript/

Em Resumo

“A ideia desta proposta”, disse Rosenwasser, “é que o JavaScript poderia criar um conjunto de sintaxe para tipos que os mecanismos ignorariam completamente, mas que ferramentas como TypeScript, Flow e outras poderiam usar”.

Rosenwasser foi rápido em enfatizar que a proposta não é colocar a verificação de tipo TypeScript em cada runtime JavaScript (certamente, pode-se imaginar todos os tipos de problemas de compatibilidade no futuro), em vez disso, o plano é que a abordagem seja escolhida por qualquer tipo verificador, não apenas os gostos de TypeScript.

Também ainda é apenas uma proposta no momento, prevista para a Etapa 1 do processo ECMA TC39. Há, portanto, muitos obstáculos pela frente antes que o conceito (se aceito) chegue à forma ECMAScript e muitas oportunidades para debate.

No entanto, a julgar pelas respostas de pouco mais de 16.000 desenvolvedores que responderam a perguntas na pesquisa State of JavaScript de 2021, há apetite por algum tipo de funcionalidade de tipo. A proposta dos desenvolvedores é um primeiro passo no caminho.

Como funciona o Intl.NumberFormat?

Neste breve post veremos como funciona o Intl.NumberFormat em partes para entendê-lo melhor e podermos gerar várias strings com valores numéricos formatados corretamente.

Sintaxe

A sintaxe básica é bem simples, instanciamos um objeto que precisa de dois parametros, locales e options. Ambos são opcionais

new Intl.NumberFormat([locales[, options]])

locales: em 99% dos casos nós usaremos as strings com representação do local/país/região representada no nosso objeto. Você provavelmente usará os valores ‘pt-BR’, ‘en’ ou alguma variação parecida. Para um guia completo, confira aqui: https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry

const valor = 1999.99;
console.log(new Intl.NumberFormat('pt-BR').format(valor));
// saida: 1.999,99
console.log(new Intl.NumberFormat('ar-EG').format(valor));
// saida: ١٬٩٩٩٫٩٩

options: O segundo parâmentro é um pouco mais complicado pois as opções tem várias opções… kkkk… mas faz parte Vejamos um modelo e depois explicarei o que cada coisa faz

const valor = 1999.99;

const options = {
    style : "currency",
    currency : "BRL",
    minimumIntegerDigits : 10,
    minimumFractionDigits : 2,
    maximumFractionDigits: 5,
}

console.log(new Intl.NumberFormat('pt-BR', options).format(valor));
// saida: R$ 0.000.001.999,99

style:

Definição: O estilo do formato a ser utilizado.

Valor Padrão: “decimal”

Valores Permitidos: “decimal" para formato de número simples, "currency" para formato monetário e "percent" para formato percentual;

currency:

Definição: A moeda para usar na formatação monetária.

Valor Padrão: Não existe. Se o style for “currency”, então o esta propriedade precisa ser informada

Valores Permitidos: Os valores permitidos são os códigos de moedas da ISO 4217, como "USD" para dólar estadunidense, "EUR" para euro, ou "CNY" para RMB chinês — veja a Lista de códigos de moedas e fundos atuais.

minimumIntegerDigits

Definição: A quantidade mínima de dígitos inteiros para utilizar.

Valor Padrão: 1

Valores Permitidos: de 1 a 21

minimumFractionDigits

Definição: A quantidade mínima de dígitos fracionados para utilizar.

Valor Padrão: o padrão para formatos monetários é a menor unidade de dígitos fornecidos pela lista de códigos de moedas ISO 4217 (2 se a lista não fornecer a informação).

Valores Permitidos: de 0 a 20.

maximumFractionDigits

Definição: O número máximo de dígitos fracionados para utilizar

Valor Padrão: o padrão para a formatação de número simples é o maior entre minimumFractionDigits e 3.

Valores Permitidos: de 0 a 20.

CONCLUSÃO

Isso pessoal, esse foi um tutorial bem simples de como usar uma classe extremamente útil. Para mais detalhes, vejam também a documentação oficial https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat

Como usar o forEach no JavaScript

forEach

Neste breve artigo, estarei mostrando como usar o forEach no JavaScript usando todas as possibilidades de passagem de valores no exemplos. Estarei presumindo que você entende como funcionam Arrays e Arrow Functions.

Descrição e uso do forEach

O forEach é um método acessado dos objetos array (vetores) que itera entre todos os itens da lista executando uma função que informamos passada por parâmetro. Sendo assim, quando você possui uma coleção que precisa ser iterada ele é um ótimo candidato por ser sucinto e fácil de entender.

Quando não usar o forEach

Se você precisa parar a iteração, o forEach não é o melhor candidato. Ele não é um loop que podemo encerrar com ‘break’ e se na função de callback colocarmos um ‘return’, ele simplesmente seguirá para o próximo item. Neste tipo de situação, de preferencia para os loops tradicionais.

Array.forEach simples

a forma mais simples é chamando o método e passando uma função de callback que possui apenas um parâmetro

// Uma lista simples
const dados = [1,2,3,4,5,6,7,8];
// uma função de callback com apenas 1 item passado de parametro
const callback = item => console.log(item)
// a chamada
dados.forEach(callback);

Poderíamos colocar a função diretamente dentro da chamada

dados.forEach(item => console.log(item));

Ou chamar todo o primeiro exemplo em apenas 1 linha

[1,2,3,4,5,6,7,8].forEach(item => console.log(item));

Mas é importante tentar manter o seu código o mais fácil de entender possível.

Array.forEach com 2 parâmetros no callback

Digamos que você precise saber o índice do item por algum motivo, neste caso, precisamos informar mais um parâmetro em nossa callback. Vamos fazer um exemplo um pouco diferente

// Uma lista com strings para não confundir com o valor do indice
const dados2 = ['caixa', 'pallet', 'caixote', 'sacola', 'avulo'];
// A callback agora precisa de um segundo parametro 
const callback2 = (item, indice) => console.log(`${indice}: ${item}`)
// mesma chamada
dados2.forEach(callback2);

Ao executar o código você verá que teremos a posição dos items e seus valores. Para comparação, o For tradicional geraria este Loop da seguinte maneira:

for(let indice; indice < dados2.length; indice++) console.log(`${indice}: ${item}`)

Array.forEach com 2 parâmetros

Para este exemplo, manteremos o nosso segundo vetor

const dados2 = ['caixa', 'pallet', 'caixote', 'sacola', 'avulo'];

e vamos criar um objeto bem simples com apenas 1 função que executa um console log no valor passado por parametro, no mundo real seria somente uma função, mas para nosso exemplo ele ele vale.

let obj = { log : (umItem) =&gt; console.log(umItem)}

Agora, se você quisesse executar o obj.log para cada item do dados2, você poderia fazer algo assim:

dados2.forEach(item =&gt; obj.log(item));

e vai funcionar. Agora digamos que você tenha uma ambiente dinamico no qual você não sabe o qual objeto está executando o método log e dentro deste método poderiam acontecer coisas diferentes ou até que você está montando uma biblioteca que receberá o objeto e executará alguma coisa. Como você faria? Com o forEach, é possível fazer o seguinte

dados2.forEach(item =&gt; this.log(item), obj);

Deu erro? Isso é porque arrow function não podem receber escopo, se não entendeu, veja novamente o link Arrow Functions. Entendeu, então a parte abaixo é simples. A solução mais simples, use a função normal.

dados2.forEach(function(item){ this.log(item)}, obj);

Era isso, espero que tenham gostado, qualquer duvida deixem nos comentários.

Smart Mask – Máscara de Dados

Precisando de uma máscara de CPF, CNPJ ou entre outras?

Smart Mask (https://github.com/pkunzel/smart_mask) é uma biblioteca de máscara de dados bem simples com o intuito de fornecer múltiplas mascaras que com frequencia com frequência em um sistema ou app. O Projeto é constituído por duas classes, uma que aplica as máscaras e outra que monitora elementos HTML para manter a máscara aplicada. 

Como funcionam as classes? 

ApplyMask 

A Classe apply mask possui apenas métodos estáticos que estão prontos para serem chamados mediante passagem de parâmetros conforme exemplo abaixo 

ApplyMask.toCPF('88888888888') 
// output '888.888.888-88' 

ApplyMask.toPhone('51999999998') 
// output '(51) 999999998'

ApplyMask.charactersOnly('qwerty12345') 
// output 'qwerty' 

CustomMask

Gera eventos para os elementos com o atributos data-custom-mask=”mascara”, onde máscara é o nome do tipo de máscara a ser implementada. As opções são 

• cpf: um CPF 

• cnpj: um CNPJ 

• phone: um telefone com DDD incluso 

• cep: um CEP 

• date: uma data seguindo o formato DD/MM/YYYY 

• numbers: extrai apenas os valores numéricos 

• characters: extrai apenas os caracteres 

• non-special-characters: Extrai apenas os caracteres não especiais 

Exemplo 

HTML 

<input type="text" data-custom-mask="cpf" value="11122233344" /> 

JS 

// Ao iniciar a página 

window.addEventListener('load', (e) => new CustomMask()); 

// Obs.: Pode ser feito inicializado em qualquer outro momento. 

Importante: Qualquer valore que seja maior que o tamanho da máscara terá os últimos caracteres removidos. ou seja, um CPF que venha com 15 caracteres devido a algum erro terá os últimos 4 caracteres removidos.

Conheça SvelteJS, um framework Frontend JavaScript

O Svelte é um framework com uma nova maneira de desenvolver interfaces de usuário. Frameworks tradicionais como React e Vue fazem a maior parte do trabalho no browser, o Svelte realiza esse trabalha em uma etapa de compilação que acontece quando você constrói a sua aplicação.

Sem utilizar técnicas como virtualização do DOM, o Svelte escreve código que cirurgicamente atualiza o DOM quando o estado do seu app muda. A diferença crucial entre o Svelte e outros frameworks JavaScript é que o Svelte converte o seu app para JavaScript ideal em tempo de construção, ao invés de interpretar seu código em tempo de execução. Isso significa que você não terá que considerar custo de performance das abstrações do framework, e você não terá penalidades quando seu app carregar pela primeira vez.

Você pode escrever o seu aplicativo do zero utilizando o Svelte, ou pode adicioná-lo de forma incremental à uma base de código já existente. Você também pode utilizar componentes como pacotes independentes, que funcionam em qualquer lugar, sem a sobrecarga de dependências de um framework convencional.

Componentes

No Svelte, uma aplicação é composta de um ou mais componentes. Um componente é um bloco de código reutilizável que encapsula HTML, CSS e JavaScript juntos em um arquivo .svelte.

Por exemplo:

<script>
    let nome = "mundo";
</script>

<h1> Olá Mundo!</h1>

E podemos utilizar uma referência à variável nome, criada acima!

<h1>Olá {nome}!</h1>

E isso nos trará o resultado:

Olá mundo!

Também podemos armazenar caminhos de url e pastas de armazenamento em variáveis, e utilizá-las em atributos de nossos elementos HTML, como:

<script>
    let caminhoOrigem = "imagem/foto.png";
</script>

<img src={caminhoOrigem}>

E isso funcionará. Mas o Svelte nos trará uma mensagem:

A11y: <img> element should have an alt attribute

Quando estamos criando web apps, é importante ter certeza que ele será acessível para todos os usuários, e isso inclui pessoas com dificuldades de visão ou movimento, ou até mesmo pessoas com boa conexão à internet e com bom hardware. A acessibilidade é de extrema importância no desenvolvimento e o Svelte auxilia avisando-o se você não escreveu elementos de marcação acessíveis.

Nesse caso, teremos:
<img src={caminhoOrigem} alt="Seu texto acessível aqui.">

Você pode fazer o download do Svelte diretamente no site em um arquivo .zip ou utilizando o npm e npx:

npx degit sveltejs/template my-svelte-project

cd my-svelte-project

npm install

npm run dev

Você pode verificar a documentação em: https://svelte.dev/tutorial/basics

Gostou deste artigo? Comente abaixo!

Referência: https://svelte.dev/

Exercício – Atravessar a Rua

Neste exercício, criaremos uma função que calcula a quantidade mínima de passos que uma pessoa precisa dar para atravessar a rua.

A nossa pessoa deseja atravessar a rua. Inicialmente, a pessoa está localizada em uma posição X, e deseja chegar a uma posição maior ou igual a Y. A cada passo que a nossa pessoa dá, ela percorre uma distância fixa que denominaremos Z. Na nossa função, precisaremos:

  • Contar a quantidade mínima de passos que a nossa pessoa precisa dar para atravessar a rua, ou seja, sair da posição X e chegar ou ultrapassar a posição Y.

Em nossa função, precisamos passar os parâmetros. Por exemplo, daremos 3 números inteiros, X, Y e Z, e a função deverá retornar um número mínimo de passos que inicie da posição X e vá para uma posição maior ou igual a Y.

Dando como exemplo os números de entrada:

  • X = 5;
  • Y = 40;
  • D = 1;

Ao dar um passo, deve ser somada a distância inicial + a distância do passo dado, ou seja:

Ao dar um passo = 5 + 1;

Dois passos: 5 + 1 + 1.

E assim, sucessivamente, até chegar ou passar a distância final de 40.

Para realizar esse exercício, você precisará:

  • Criar uma função chamada atravessaRua;
  • Essa função deverá receber três parâmetros: X, Y e Z;
  • Calcular a distância necessária;

Você pode fazer o download da solução aqui: [download id=”4210″]