Quando o JavaScript deve gerar HTML?


34

Eu tento gerar o mínimo de HTML possível do JavaScript. Em vez disso, prefiro manipular a marcação existente sempre que posso e apenas gerar HTML quando precisar inserir dinamicamente um elemento que não seja um bom candidato ao uso do Ajax. Acredito que isso facilite muito a manutenção do código e faça alterações rapidamente, pois a marcação é mais fácil de ler e rastrear. Minha regra geral é: HTML é para estrutura de documentos, CSS é para apresentação, JavaScript é para comportamento.

No entanto, eu já vi muitos códigos JS que geram montes de HTML, incluindo formulários inteiros e diálogos modais com muito conteúdo. Em geral, qual método é considerado a melhor prática? Em que circunstâncias o JavaScript deve ser usado para gerar HTML e quando não?


2
Por que você acha que a marcação é mais fácil de ler e rastrear via Ajax?
Psr

3
Eu normalmente uso o Ajax de uma de duas maneiras: carregando fragmentos HTML pré-renderizados inteiros na página ou em uma matriz JSON que eu analiso e insiro os dados nos elementos existentes. Muito raramente, gerarei dinamicamente HTML a partir de dados do Ajax e o inserirei na página. Como o conteúdo do Ajax geralmente é pré-renderizado como HTML, é mais fácil ler do que tentar seguir a criação de elemento dinâmico em JavaScript. Eu posso rapidamente olhar para ele e ver a estrutura e o conteúdo.
VirtuosiMedia 28/03

2
Fantasticamente espinhosa questão ...
Mark Canlas

2
@VirtuosiMedia - Mas os snippets HTML pré-renderizados não têm os mesmos problemas quando renderizados no servidor e com renderizados via javascript? Não estou tentando ser contencioso, realmente não entendo qual é o seu problema.
Psr

1
@psr Geralmente, não. Ao usar uma estrutura JS ou até mesmo JavaScript simples, você acabará gerando seu HTML com uma série de chamadas e funções de método. Se isso for feito com um grande número de elementos, pode ser muito difícil ver qual é a estrutura real do documento. Por outro lado, o lado do servidor gerado por HTML geralmente mantém uma estrutura limpa e apenas faz com que o código do servidor faça eco dos dados em um modelo HTML, em vez de gerar os próprios elementos. Portanto, se você deseja fazer uma alteração no comportamento do JS, é necessário rastrear os métodos que geram elementos para ver a hierarquia.
VirtuosiMedia 28/03

Respostas:


19

Sempre que encontrei forte geração de HTML em javascript, era quase exclusivamente em um plug-in de interface do usuário independente. Faz sentido, pois permite encapsular todo o plug-in em um único arquivo .js (+ a .css para personalizar estilos), tornando-o facilmente reutilizável, distribuível e independente da estrutura usada no aplicativo.

Portanto, se você estiver escrevendo um plug-in javascript autônomo ou um componente genérico da interface do usuário que gostaria de usar em diferentes aplicativos, essa abordagem terá suas vantagens. Caso contrário, acho que é mais limpo, mais fácil de escrever e mais fácil de manter quando você mantém a geração html longe do javascript e do lado do servidor.


29

Acho que o problema é que você está comparando modelos do lado do servidor escritos de maneira limpa com a geração de HTML ad-hoc do lado do cliente mal escrita. Obviamente, o código escrito corretamente é mais fácil de ler, manter e rastrear.

Você chama o código do lado do cliente "montes de HTML", mas é claro que é o mesmo HTML onde quer que seja gerado. O "monte" é realmente o grande pedaço de código.

Existem muitas bibliotecas de modelos do lado do cliente por aí. Eles funcionam de forma semelhante aos do lado do servidor. Como você prefere, a troca de desempenho é complicada, mas o JSON geralmente é mais compacto que o HTML e o modelo no cliente pode eliminar algumas chamadas do servidor. Por outro lado, o cliente pode ter o JS desativado ou ser muito lento para ser prático, portanto depende do seu público-alvo também. No geral, acho que as abordagens são bastante comparáveis, com o maior fator sendo os recursos de navegador do seu público-alvo.

Mas isso depende exatamente do que você está fazendo, se você prefere JS ao seu ambiente de servidor, qual solução de modelo você prefere etc.


15

Há uma tendência para usar modelos do lado do cliente, em casos extremos, você teria o servidor fornecendo apenas API RESTful, por exemplo, no formato JSON, enquanto fazia toda a renderização do lado do cliente. A vantagem dessa abordagem é que o código e os modelos JS são recursos estáticos que podem ser armazenados em cache, em proxy e distribuídos via CDN. O que não pode ser feito se você tiver HTML dinâmico gerado pelo servidor. Além disso, retornar apenas dados da API RESTful em formato leve utiliza muito menos recursos do servidor, tornando a resposta mais rápida. Por ser mais leve, é menos transferência de rede, o que torna mais rápido. Dessa forma, você pode ter um aplicativo de baixa latência muito responsivo, mesmo em conexões lentas, como 3G. Portanto, essa abordagem é popular para páginas e aplicativos para celular.

Existem inúmeras bibliotecas execução modelos JS, um dos mais populares são Pure , bigode e dust.js . Mais tarde, usado pelo LinkedIn, eles descreveram as vantagens em seu artigo "Deixando JSPs no pó: movendo o LinkedIn para dust.js modelos do lado do cliente" .


Estou fazendo meu primeiro webapp (como são chamados hoje em dia, tenho java / c ++ background). E parece-me natural para gerar um monte de html com JS como o usuário passa por um processo onde ele precisa de vários componentes de interface do usuário diferentes, e eu nunca recarregar a página
Emile Vrijdags

2

A vantagem de gerar HTML no cliente é transferir o trabalho de renderização para cada cliente, que geralmente fica ocioso aguardando a resposta. Liberando mais recursos do servidor para fornecer apenas dados JSON e conteúdo estático (HTML, JS e CSS).

Fazemos um aplicativo da web que gera exclusivamente HTML com Javascript. 87% das ocorrências no servidor são dados JSON, o conteúdo estático geralmente é carregado uma vez e depois no cache do navegador.

Mas você não pode usá-lo - pelo menos não facilmente - se precisar de SEO. Ou se você segmentar uma população com o Javascript desativado, mas não tenho certeza de que essa ainda seja relevante no Youtube, Twitter, Facebook, Gmail, ... forçando naturalmente as pessoas a ativá-lo.


0

Em relação ao carregamento dinâmico de páginas, deve-se perceber que, por trás de todo o "JQuery AJAX Cloud!" mágica, apenas duas coisas possíveis estão acontecendo:

  1. O código de um elemento está sendo injetado em uma div (ruim) ou
  2. O conteúdo está sendo carregado em um iframe (melhor, mas não é o mesmo ...)

Em relação à pergunta original, só crio conteúdo HTML via Javascript quando estou criando um aplicativo da Web de algum tipo que lê dados XML ou JSON armazenados no servidor e isso é alterado muito.

Não faria muito sentido carregar conteúdo estático em uma página com Javascript, pois sempre há a possibilidade de que ele não seja carregado corretamente ou o cliente o desativará ("pegue esses anúncios irritantes!"). Além disso, torna muito difícil alterar o conteúdo HTML quando ele é esmagado em um feio document.write()ou em uma cadeia de caracteres document.createElement().

Então, você está certo; digite o HTML bruto ou, se for necessário conteúdo dinâmico, use um script do lado do servidor para gerar o que é necessário. Use Javascript para injetar HTML somente se o site tiver a intenção de funcionar sem uma conexão com a Internet ou um caso semelhante.

Uma última observação: se você deseja implementar xmlhttprequests, er, AJAX, em um site, provavelmente a melhor / mais segura maneira de fazer isso é armazenar os dados em um formato de dados (como XML), carregá-los e enviá-los de acordo. no cliente. document.writee element.innerHTMLrealmente não é a melhor maneira de manipular o conteúdo e provavelmente causará dores de cabeça em potencial no futuro (por que esse script não está sendo executado? Minha <i>tag quebrada está em itálico tudo! etc.).


1
Essas certamente não são as únicas coisas que podem acontecer. O Javascript tem acesso total ao DOM, e você pode manipular a árvore DOM como achar melhor ao manipular uma resposta AJAX.
Tdammers

Por que injetar conteúdo em uma div é ruim?
31412 Peter Taylor

@ Petereteray injetar conteúdo não é ruim, innerHTMLé usar é.
Raynos

@ PeterTaylor Se um elemento ou dois forem adicionados document.appendChildou algo assim, provavelmente não haverá problemas. O problema é com o código que se parece com isso div.innerHTML="<table cellpadding='0'><tr><td><label>Val:</label></td><td><input type='text' /></td></tr></table>- é um pesadelo para depurar.
Jeffrey Sweeney

Mas o que isso tem a ver com '"JQuery AJAX Cloud!" Magia'? Seu exemplo parece mais com sua antítese.
31412 Peter Taylor

0

Meu mantra é: quando é mais fácil e ninguém se importa com a marcação.

Você também pode aproveitar os dois e definir um limite em que é muito difícil se preocupar com a marcação e preferir se concentrar na árvore DOM. Por exemplo, um formulário com linhas dinâmicas (por exemplo, "adicionar outro anexo"), você provavelmente desejaria o formulário em HTML, o botão "adicionar linha" e o botão enviar ... provavelmente não deseja gerar o HTML com a linguagem do servidor ou algo assim.

Outra regra prática pode ser a reutilização. Se sua solução puder ser aplicada a outros problemas no lado do cliente, encapsule-a em js.


0

Criamos aplicativos de página única (ala Google Mail) e, literalmente, não há geração de HTML no servidor em nossos aplicativos. Em vez disso, estamos usando o Backbone.js para estruturar o lado do cliente e o Handlebars para renderizar nosso JSON em modelos que vão para a página. Na verdade, funciona muito bem e estamos chegando ao fim do nosso primeiro aplicativo que o usa e enfrentaremos um projeto ainda maior no futuro.

Qualquer tipo de cliente gordo em que o servidor é usado apenas para persistir dados e retornar resultados da consulta é um filho-pôster durante um período em que você deseja que o JavaScript gere HTML. Apenas certifique-se de usar um bom mecanismo de modelo para torná-lo limpo e fácil.


0

Estou gerando código html no jquery porque estou usando um portlet e, após a execução do código jsp, preciso fazer um loop com código html, que não consiga entrar no loop java for com algum código javascript. Então, eu estou processando java arraylist em uma matriz javascript e usando as seqüências de caracteres para gerar html.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.