Serviço HTML: práticas recomendadas

A criação de interfaces de usuário com o serviço HTML segue muitos dos mesmos padrões e práticas de outros tipos de desenvolvimento da Web. No entanto, alguns aspectos são exclusivos do ambiente do Apps Script ou que vale a pena destacar. Veja abaixo algumas práticas recomendadas que você precisa ter em mente ao desenvolver IUs de serviço HTML.

Para ajudar a demonstrar essas práticas recomendadas, criamos um app da Web de exemplo usando o serviço HTML chamado Tarefas simples. O código-fonte completo e as instruções de configuração estão disponíveis no nosso repositório do GitHub (em inglês).

HTML, CSS e JavaScript separados

Manter todo o código HTML, CSS e JavaScript em um único arquivo pode dificultar a leitura e o desenvolvimento do seu projeto. Embora o Apps Script exija que o código do lado do cliente seja colocado em arquivos .html, ainda é possível separar o CSS e o JavaScript do lado do cliente em arquivos diferentes e incluí-los na página HTML principal com uma função personalizada.

O exemplo abaixo define uma função include() personalizada do lado do servidor no arquivo Code.gs para importar o conteúdo dos arquivos Stylesheet.html e JavaScript.html para o arquivo Page.html. Quando chamada usando scripts de impressão, essa função importa o conteúdo do arquivo especificado para o arquivo atual. Observe que os arquivos incluídos contêm tags <style> e <script> porque são snippets HTML, e não arquivos .css ou .js puros.

Code.gs

function doGet(request) {
  return HtmlService.createTemplateFromFile('Page')
      .evaluate();
}

function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename)
      .getContent();
}

Page.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <?!= include('Stylesheet'); ?>
  </head>
  <body>
    <h1>Welcome</h1>
    <p>Please enjoy this helpful script.</p>
    <?!= include('JavaScript'); ?>
  </body>
</html>

Stylesheet.html

<style>
p {
  color: green;
}
</style>

JavaScript.html

<script>
window.addEventListener('load', function() {
  console.log('Page is loaded');
});
</script>

Carregar dados de forma assíncrona, não em modelos

O HTML modelo pode ser usado para criar rapidamente interfaces simples, mas seu uso deve ser limitado para garantir que a IU seja responsiva. O código nos modelos é executado uma vez no carregamento da página, e nenhum conteúdo é enviado ao cliente até que o processamento seja concluído. Ter tarefas de longa duração no código scriptlet pode fazer com que a IU pareça lenta.

Use tags scriptlet para tarefas rápidas e únicas, como incluir outro conteúdo ou definir valores estáticos. Todos os outros dados precisam ser carregados usando chamadas google.script.run. A programação dessa maneira assíncrona é mais difícil, mas permite que a IU seja carregada mais rapidamente e oferece a oportunidade de apresentar um ícone de carregamento ou outra mensagem de carregamento ao usuário.

O que não fazer: carregar modelos

<p>List of things:</p>
<? var things = getLotsOfThings(); ?>
<ul>
  <? for (var i = 0; i < things.length; i++) { ?>
    <li><?= things[i] ?></li>
  <? } ?>
</ul>

Carregue de forma assíncrona.

<p>List of things:</p>
<ul id="things">
    <li>Loading...</li>
</ul>

<script
src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js">
</script>
<script>
// The code in this function runs when the page is loaded.
$(function() {
  google.script.run.withSuccessHandler(showThings)
      .getLotsOfThings();
});

function showThings(things) {
  var list = $('#things');
  list.empty();
  for (var i = 0; i < things.length; i++) {
    list.append('<li>' + things[i] + '</li>');
  }
}
</script>

No aplicativo de exemplo Simple Tasks, a página de serviço HTML Page.html carrega dados dessa maneira e só usa modelos para incluir outro código-fonte na página.

Carregar recursos usando HTTPS

Se a página for veiculada usando o modo sandbox IFRAME mais recente, incluir arquivos JavaScript ou CSS não exibidos usando HTTPS resultará em erros como o mostrado abaixo.

Conteúdo misto: a página em "https://..." foi carregada por HTTPS, mas solicitou um script não seguro "http://...". Esta solicitação foi bloqueada. O conteúdo precisa ser exibido por HTTPS.

As bibliotecas mais conhecidas oferecem suporte a HTTP e HTTPS. Portanto, a mudança geralmente é apenas uma questão de inserir um "s" de adição no URL.

Usar a declaração de tipo de documento HTML5

Se a página for veiculada usando o modo sandbox IFRAME mais recente, inclua o seguinte snippet de código na parte de cima do arquivo HTML.

<!DOCTYPE html>

As recusas desse tipo de documento informam ao navegador que você projetou a página para navegadores modernos e que ele não pode renderizar sua página usando o modo quirks. Mesmo que você não pretenda aproveitar os elementos HTML5 modernos ou as APIs JavaScript, isso vai ajudar a garantir que sua página seja exibida corretamente.

Carregar o JavaScript por último

Muitos desenvolvedores da Web recomendam carregar o código JavaScript na parte inferior da página para aumentar a capacidade de resposta, e isso é ainda mais importante no serviço HTML. Ao mover as tags <script> para o final da página, o conteúdo HTML vai ser renderizado antes que o JavaScript seja processado. Assim, você pode apresentar um ícone de carregamento ou outra mensagem ao usuário.

Aproveitar o jQuery

A jQuery é uma biblioteca JavaScript popular que simplifica muitas tarefas comuns no desenvolvimento da Web.