A capacidade de levar experiências nativas móveis e de desktop aos usuários na web está mais perto de se tornar realidade graças a esforços como Projeto Fugu , uma iniciativa ambiciosa que tornaria o desenvolvimento de aplicações web com funcionalidade nativa mais fácil para os desenvolvedores. Neste artigo, vamos explorar algumas das adições mais recentes a este projeto e criar vários exemplos simples para entender melhor como eles funcionam.

O que é Projeto Fugu?

Projeto Fugu é um esforço entre empresas da Microsoft, Intel e Google. Seu foco é trazer funcionalidades que são nativas de plataformas móveis e de desktop para a web, garantindo que seus princípios básicos como segurança, privacidade, confiança, etc. sejam mantidos.

Por exemplo, em dispositivos móveis, um aplicativo nativo como o WhatsApp pode ter acesso à sua lista de contatos e permitir que você compartilhe um contato com outras pessoas. No entanto, esse recurso não é nativo da web e pode exigir que um desenvolvedor crie um aplicativo móvel para acessar essa funcionalidade. O Projeto Fugu visa resolver problemas como esse com um conjunto de novas APIs da web.

De acordo com o Google :

“Queremos fechar a lacuna de capacidade entre a web e a nativa e tornar mais fácil para os desenvolvedores criarem ótimas experiências na web aberta. Acreditamos fortemente que todo desenvolvedor deve ter acesso aos recursos de que precisa para ter uma ótima experiência na web e estamos comprometidos com uma web mais capaz. ”

Curiosamente, o nome Fugu é derivado do peixe japonês que é considerado delicioso quando preparado corretamente, mas mortal quando não. A equipe do Chromium escolheu esse nome como uma metáfora de quão poderosas essas APIs de recursos da web podem ser desenvolvidas corretamente, mas como uma falha pode ser mortal, pois podem comprometer alguns ou todos os princípios básicos da web.

Anteriormente, os desenvolvedores precisariam desenvolver aplicativos móveis e de desktop para acessar APIs nativas, mas o Project Fugu traz várias dessas funcionalidades nativas para a web. Ele funciona servindo como uma camada adicional de abstração sobre APIs nativas que permitem o acesso independentemente do dispositivo ou sistema operacional do usuário.

Embora algumas das APIs ainda estejam em fase experimental ou ainda não sejam totalmente suportadas pelos navegadores, atualmente existem muitas APIs disponíveis para brincarmos e explorarmos. É importante dar uma olhada na lista atualizada de dispositivos e sistemas operacionais suportados antes de usar as APIs em seu aplicativo de produção.

Vamos começar a explorar algumas das APIs e construir algumas demonstrações com elas.

Pré-requisitos

Para acompanhar os exemplos de código, você precisará de algum conhecimento básico de HTML, JavaScript e Progressive Web Apps (PWA) . Os exemplos neste artigo foram executados no Chrome 89.

As APIs que demonstraremos neste artigo foram graduadas de teste de origem e agora são totalmente suportadas no versões mais recentes de navegadores baseados em Chrome/Chromium.

Configuração inicial

Para demonstrar as APIs, precisaremos criar um Progressive Web App (PWA) que os usuários possam instalar em seus navegadores.

Usaremos a extensão de servidor ativa no VS Code para executar nosso aplicativo em localhost: 5500 .

Primeiro, crie um novo diretório. Chamaremos nosso gwc-demo . Crie um arquivo index.html e um manifest.webmanifest na raiz deste diretório.

No arquivo manifest.webmanifest , precisamos fornecer algumas informações sobre nosso aplicativo e como queremos que ele seja exibido no navegador. Você pode ler mais sobre manifestos da web aqui .

 { "name":"Demonstração de recursos da web do Google", "short_name":"GWC Demo", "descrição":"Este aplicativo demonstra alguns dos recursos mais legais do Projeto Fugu!", "alcance":"/", "display":"autônomo", "background_color":"#ffff", "theme_color":"# 3367D6", "start_url":"/", "ícones": [ { "src":"/images/icon-192x192.png", "tamanhos":"192x192", "tipo":"imagem/png" }, { "src":"/images/icon-512x512.png", "tamanhos":"512x512", "tipo":"imagem/png" } ]
}

Também precisaremos de um ícone de imagem para nosso aplicativo que aparecerá na barra de status do sistema operacional do usuário. Eu criei um ícone simples abaixo. Crie uma pasta images no diretório raiz do seu projeto e copie esta imagem para ele. Certifique-se de criar duas cópias da imagem e renomeá-las icon-192x192.png e icon-512x512.png , respectivamente.

Ícone da imagem Goog le Web Capabilities

Com isso resolvido, precisaremos criar um service worker . Os service workers são usados ​​para informar a um navegador como um aplicativo deve ser executado durante eventos específicos. Isso pode ser quando o aplicativo é instalado, ativado ou off-line.

Crie um arquivo sw.js em seu diretório raiz. Este arquivo hospedará o código que executa nosso service worker. Adicione o seguinte trecho de código:

 const urlsToCache=[ "/images/icon-192x192.png", "/images/icon-512x512.png", "/index.html", "/offline.html",
]; //armazena em cache todos os nossos arquivos quando o aplicativo é instalado pela primeira vez
self.addEventListener ("instalar", função (evento) { event.waitUntil ( caches.open ("gwc"). then (function (cache) { console.log ("Cache aberto"); return cache.addAll (urlsToCache); }) );
}); self.addEventListener ("fetch", function (event) { event.respondWith ( caches.match (event.request).then (function (response) { se (resposta) retornar resposta; return fetch (event.request).catch ((err)=> {
//exibe um arquivo offline.html se o aplicativo estiver offline return caches.match ("offline.html"); }); }) );
}); self.addEventListener ("ativar", (evento)=> {});

O Chrome 89 adicionou a capacidade de executar solicitações off-line simuladas por meio do service worker. Usaremos este recurso para servir um recurso para o navegador que informa um usuário quando ele está offline. Uma maneira de conseguir isso é armazenando em cache um arquivo que será servido quando o usuário estiver offline e, em seguida, disponibilizando esse arquivo assim que nosso aplicativo detectar que o usuário está realmente offline.

Para começar, crie um arquivo offline.html em seu diretório raiz. Agora, adicione o seguinte código ao arquivo offline.html :

 
   Aplicativo de demonstração GWC            

Olá & # x1f44b ;, você está offline.

Em seguida, vá para o arquivo index.html e inclua o seguinte trecho de código:

 
   Aplicativo de demonstração GWC            

Demonstração de recursos da web do Google

Agora que configuramos tudo, vamos instalar nosso aplicativo para verificar se tudo funciona corretamente.

No canto superior direito do seu navegador, você deve ver agora um ícone Instalar na barra de endereço. Clique para instalar nosso aplicativo de demonstração de recursos da Web do Google (GWC).

Exibição do aplicativo de demonstração de recursos da Web do Google

Agora, se você olhar no seu banco dos réus, verá nosso aplicativo Google Web Capabilities instalado.

Gwc Installed Dock

A Badging API

A primeira API que exploraremos é a API de emblemas . Os emblemas nos permitem notificar os usuários de nosso aplicativo sobre atividades que podem exigir sua atenção. Podemos exibir uma pequena quantidade de informações não interruptivas que informam um usuário sobre eventos dentro do aplicativo de uma forma que seja específica para o sistema operacional.

Por exemplo, o selo pode mostrar aos usuários uma contagem de quantas mensagens novas eles receberam em um bate-papo ou aplicativo de e-mail. Os crachás também podem ser usados ​​para notificar sutilmente um usuário quando for sua vez em um aplicativo de jogo.

Os estilos nos exemplos de código a seguir serão escritos usando Tailwind CSS , mas você pode visitar o repo para ver as classes de estilo.

Crie uma nova pasta chamada scripts e inclua um arquivo badging.js . Adicione o seguinte código ao arquivo badging.js :

 deixe contar=0;
document.getElementById ("new-message"). addEventListener ("click", ()=> { navigator.setAppBadge (++ contagem);
});
document.getElementById ("clear-messages"). addEventListener ("click", ()=> { navigator.clearAppBadge ();
});

A seguir, em seu arquivo index.html , adicione o seguinte código para a Badging API dentro da tag

:

   

Agora, quando clicamos no botão Nova mensagem , receberemos uma nova notificação no ícone do nosso aplicativo.

Badging API Google Web Capabilities Demo

Como você pode ver, cada vez que clicamos no botão Nova mensagem , a contagem em nosso emblema GWC (no banco dos réus) aumenta. Quando clicamos no botão Limpar mensagens! , ele é redefinido.

API de acesso ao sistema de arquivos

A API de acesso ao sistema de arquivos permite que os usuários interajam com os arquivos em seus dispositivos locais. Podemos ler e gravar arquivos diretamente no dispositivo de um usuário da mesma forma que editores de texto, IDEs e editores de vídeo fazem. Vamos explorar essa API com mais detalhes.

Em nosso primeiro exemplo, leremos um arquivo do diretório de um usuário e exibiremos o conteúdo dentro de uma tag textarea .

Lendo arquivos

Atualize seu arquivo index.html com o seguinte bloco de código:

  

API de acesso ao sistema de arquivos

Um editor de texto simples que pode ler e salvar conteúdo em um arquivo.

A seguir, na pasta scripts , crie um arquivo file-system.js e adicione o seguinte código:

 let fileHandle;
const textarea=document.getElementById ('textarea');
document.getElementById ('open-file-picker'). addEventListener ('click', async ()=> { [fileHandle]=await window.showOpenFilePicker (); //ler um arquivo do sistema de arquivos const file=await fileHandle.getFile (); //lê o conteúdo do texto no arquivo conteúdo const=await file.text (); //atualiza a área de texto com o conteúdo do texto textarea.value=conteúdo;
});

Precisamos manter uma referência ao arquivo selecionado usando a variável fileHandle . Isso nos permitirá salvar as alterações ou realizar outras operações no arquivo.

O método showOpenFilePicker retorna uma matriz de alças que têm todas as propriedades e métodos de que precisamos ao interagir com um arquivo.

Agora podemos testar se nosso arquivo foi lido e exibido corretamente. Vamos criar um arquivo .txt e adicionar algum texto a ele. Faremos isso usando o terminal:

 touch test.txt
echo"Hello World">> test.txt

Agora, volte ao aplicativo GWC para verificar se nosso aplicativo pode carregar o conteúdo do arquivo de texto.

Gravando em arquivos

Outro recurso poderoso da API de acesso ao sistema de arquivos é a capacidade de gravar arquivos em nosso sistema de arquivos. O método createWritable () da API File System Access cria um fluxo que você pode usar para enviar texto, seja Blobs ou um BufferSource . O método createWritable () também solicitará permissão de um usuário antes de gravar no disco.

Em um editor de texto comum, os usuários geralmente têm as opções salvar e salvar como . Enquanto a opção salvar grava alterações no mesmo arquivo, a opção salvar como permite que você grave alterações em um novo arquivo.

Primeiro, exploraremos a funcionalidade salvar como. Quando um usuário clica no botão S ave como , abriremos o seletor de arquivos e permitiremos que o usuário crie um novo arquivo ou documento para salvar suas alterações. Em seguida, escreveremos o conteúdo da área de texto neste arquivo.

Atualizaremos nossos scripts/file-system.js com o seguinte bloco de código:

 const getNewFileHandle=async ()=> { //opções adicionais para o seletor de arquivos usar opções const={ tipos: [ { descrição:"Arquivos de texto", aceitar: { "text/plain": [".txt"], }, }, ], }; const handle=await window.showSaveFilePicker (opções); alça de retorno;
} document.getElementById ("save-as"). addEventListener ("click", async ()=> { const newFileHandle=await getNewFileHandle (); conteúdo const=document.getElementById ('textarea'). valor const gravável=espera newFileHandle.createWritable (); aguarde writable.write (conteúdo); aguarde writable.close ();
});

No método getNewFileHandle () , especificamos o tipo de arquivo que gostaríamos de salvar: um arquivo de texto/txt . Em seguida, exibimos um seletor de arquivos para o usuário, permitindo que ele selecione onde deseja que o arquivo seja salvo. Este método retorna um novo identificador. Podemos então ligar aos métodos neste identificador para salvar o conteúdo da textarea no arquivo.

Vamos testar isso.

Arquivo Acc do sistema Ess API Editor de texto

Vamos demonstrar a substituição de arquivos usando o botão Salvar . Para essa funcionalidade, precisamos nos certificar de manter uma referência ao fileHandle quando um usuário abre um arquivo. Fazendo isso, podemos facilmente ligar aos métodos no fileHandle para sobrescrever o conteúdo do arquivo.

Atualizaremos nossos scripts/file-system.js com o seguinte bloco de código:

 document.getElementById ("save"). addEventListener ("click", async ()=> { conteúdo const=document.getElementById ('textarea'). valor const gravável=espera fileHandle.createWritable (); aguarde writable.write (conteúdo); aguarde writable.close ();
})

Agora, vamos testar!

Vamos carregar algum conteúdo do arquivo test.txt que criamos anteriormente, atualizá-lo e salvá-lo.

Tes ting Google Web Capabilities Demo

A API Contact Picker

A API final que exploraremos neste artigo é a API do seletor de contatos . Essa funcionalidade é nativa do sistema operacional móvel há muito tempo e, com o Project Fugu, agora podemos acessar a lista de contatos de um usuário na web.

A API Contact Picker está atualmente disponível apenas executando o Chrome 80 ou posterior em um dispositivo Android. Para esta API, escreveremos o código e, em seguida, usaremos ngrok para criar uma URL pública que fará um túnel através de nosso localhost . Fazendo isso, poderemos continuar escrevendo o código em nossa máquina enquanto testamos em nosso dispositivo móvel.

Baixe e instale ngrok em sua máquina para acompanhar esta parte. Inicie o ngrok em localhost: 5500 (ou qualquer porta em que sua extensão de servidor ativa esteja sendo executada).

 ./ngrok http 5500
 

Navegue até o URL fornecido por ngrok em um dispositivo Android para ver nosso aplicativo. Se você não conseguir acessar o aplicativo em seu dispositivo Android, certifique-se de que ngrok esteja sendo executado na mesma porta em que sua extensão VS Code do servidor ao vivo está sendo executada.

Android Port Live Server VS Code Extension

Para confirmar, verifique a barra de endereço do navegador. Por exemplo, neste exemplo, o servidor ativo é executado na porta 5500 .

Agora, em seu diretório scripts , crie um arquivo contacts-picker.js . Certifique-se de incluir este script em seu arquivo index.html .

Atualize o arquivo index.html com o seguinte código:

  

API de seletor de contatos

Adicionamos uma classe oculta do Tailwind CSS que oculta a mensagem que aparece por padrão, lendo, “Seu navegador não oferece suporte à API de seletor de contatos”. Removeremos essa classe usando JavaScript se detectarmos que o navegador do usuário é compatível com a API Contacts Picker.

Agora podemos atualizar o arquivo contacts-picker.js com este bloco de código:

 const supported=('contatos'no navegador &&'ContactsManager'na janela);
if (! suportado) { selectContactBtn.classList.add ('oculto') const messages=document.querySelectorAll ('. not-supported-message') messages.forEach ((message)=> message.classList.remove ('oculto'))
}

Se o navegador do usuário não for compatível com a API de seletor de contatos, mostraremos a mensagem.

Vamos continuar atualizando o arquivo contacts-picker.js com o restante do código de que precisamos:

 const selectContactBtn=document.getElementById ('select-contact')
//detalhes que desejamos obter sobre um contato
const props=['nome','email','tel'];
//permite que um usuário selecione vários contatos
const opts={multiple: true};
const ul=document.getElementById ('resultados') selectContactBtn.addEventListener ('click', async ()=> { tentar { contatos const=espera navigator.contacts.select (props, opts); renderResults (contatos); } catch (ex) { //Trate todos os erros aqui. }
}) function renderResults (contatos) { contact.forEach (contact=> { const li=document.createElement ('li') if (contact.name) li.innerHTML +=` Nome : $ {contact.name} 
` if (contact.email) li.innerHTML +=` E-mail : $ {contact.email.join (',')}
` if (contact.tel) li.innerHTML +=` Tel : $ {contact.tel.join (',')}
` li.classList.add ('mt-3') ul.appendChild (li) }) }

Temos uma função renderResults que pegará em uma matriz de contatos selecionados pelo usuário e os anexará à nossa tag

    para que possam ser exibidos no tela.

    Google Web Capabilities Contact Picker API Display

    Agora, você pode testar a API do seletor de contatos em um dispositivo Android executando o Chrome 80 (novamente, observe que este é o único navegador que oferece suporte à API no momento em que este artigo foi escrito). Consulte a lista atualizada aqui para ver quando chega o suporte para mais navegadores.

    Você pode ver a versão ao vivo da demonstração aqui e ver o código-fonte completo, incluindo os estilos que usamos, aqui .

    Conclusão

    O Projeto Fugu está trabalhando para expandir as possibilidades para desenvolvedores na web. Eventualmente, os desenvolvedores serão capazes de acessar as APIs nativas no dispositivo móvel de um usuário sem precisar saber nada sobre como essas APIs funcionam. Os desenvolvedores também poderão construir facilmente recursos com essas APIs usando as principais linguagens da web com as quais eles já estão familiarizados!

    Você pode ver a lista mais atualizada das APIs aqui , bem como quais navegadores suportam quais APIs. Qualquer pessoa pode sugerir quais APIs devem ser adicionadas ao projeto. You can add your suggestions to the list here.

    The post Bridging the native app gap with Project Fugu appeared first on LogRocket Blog.

    Source link