Os navegadores (IE e Firefox) analisam arquivos javascript vinculados toda vez que a página é atualizada?
Eles podem armazenar em cache os arquivos, então acho que eles não tentarão baixá-los a cada vez, mas como cada página é essencialmente separada, espero que eles derrubem qualquer código antigo e o analisem novamente.
Isso é ineficiente, embora perfeitamente compreensível, mas eu me pergunto se os navegadores modernos são inteligentes o suficiente para evitar a etapa de análise nos sites. Estou pensando em casos em que um site usa uma biblioteca javascript, como ExtJS ou jQuery, etc.
Respostas:
Esses são os detalhes que pude descobrir. Vale a pena notar primeiro que, embora o JavaScript geralmente seja considerado interpretado e executado em uma VM, esse não é realmente o caso dos intérpretes modernos, que tendem a compilar a fonte diretamente no código da máquina (com exceção do IE).
Chrome: motor V8
V8 possui um cache de compilação. Isso armazena o JavaScript compilado usando um hash da fonte para até 5 coletas de lixo. Isso significa que duas partes idênticas do código-fonte compartilharão uma entrada de cache na memória, independentemente de como foram incluídas. Esse cache não é limpo quando as páginas são recarregadas.
Fonte
Atualização - 19/03/2015
A equipe do Chrome divulgou detalhes sobre suas novas técnicas para streaming e cache de JavaScript .
Opera: Carakan Engine
Portanto, o JavaScript é armazenado em cache nas recargas de página, duas solicitações para o mesmo script não resultarão em uma recompilação.
Fonte
Firefox: SpiderMonkey Engine
O SpiderMonkey usa
Nanojit
como backend nativo, um compilador JIT. O processo de compilação do código da máquina pode ser visto aqui . Em resumo, parece recompilar scripts à medida que são carregados. No entanto, se examinarmos mais de perto os internosNanojit
, veremos que o monitor de nível superiorjstracer
, usado para rastrear a compilação, pode passar por três estágios durante a compilação, proporcionando um benefício paraNanojit
:Isso significa que para
hot
fragmentos de código, o código nativo é armazenado em cache. Significado que não precisará ser recompilado. Não está claro se essas seções nativas de hash são mantidas entre as atualizações de página. Mas eu diria que eles são. Se alguém puder encontrar evidências de apoio a isso, então excelente.EDIT : Tem sido apontado que o desenvolvedor Mozilla Boris Zbarsky afirmou que Gecko não cache de scripts compilados ainda . Retirado desta resposta SO .
Safari: JavaScriptCore / SquirelFish Engine
Penso que a melhor resposta para esta implementação já foi dada por outra pessoa .
Isto foi escrito por Maciej Stachowiak , o principal desenvolvedor do Safari. Então, acho que podemos considerar isso verdade.
Não consegui encontrar nenhuma outra informação, mas você pode ler mais sobre as melhorias de velocidade do
SquirrelFish Extreme
mecanismo mais recente aqui ou procurar o código fonte aqui se estiver se sentindo aventureiro.IE: Motor de Chakra
Não há informações atuais sobre o JavaScript Engine do IE9 (Chakra) neste campo. Se alguém souber alguma coisa, comente.
Isto é completamente não-oficial, mas para implementações de motores mais velhos do IE, Eric Lippert ( um desenvolvedor de MS de JScript ) afirma em uma resposta do blog aqui que:
Isso sugere que o bytecode não persiste de maneira alguma e, portanto, o bytecode não é armazenado em cache.
fonte
Opera faz isso, como mencionado na outra resposta. ( fonte )
O Firefox (mecanismo SpiderMonkey) não armazena em cache o bytecode. ( fonte )
O WebKit (Safari, Konqueror) não armazena em cache o bytecode. ( fonte )
Não tenho certeza sobre o IE [6/7/8] ou o V8 (Chrome), acho que o IE pode fazer algum tipo de cache, enquanto o V8 não. O IE é de código fechado, então não tenho certeza, mas na V8 pode não fazer sentido armazenar em cache o código "compilado", pois eles são compilados diretamente no código da máquina.
fonte
Tanto quanto sei, apenas o Opera armazena em cache o JavaScript analisado. Consulte a seção "Programas compilados em cache" aqui .
fonte
Não vale nada que o Google Dart resolva explicitamente esse problema por meio de "Snapshots" - o objetivo é acelerar o tempo de inicialização e carregamento carregando a versão preparada do código.
A InfoQ tem uma boa redação @ http://www.infoq.com/articles/google-dart
fonte
Eu acho que a resposta correta seria "nem sempre". Pelo que entendi, o navegador e o servidor desempenham um papel na determinação do que é armazenado em cache. Se você realmente precisa recarregar arquivos sempre, acho que você deve configurá-lo no Apache (por exemplo). Obviamente, suponho que o navegador do usuário possa ser configurado para ignorar essa configuração, mas isso provavelmente é improvável.
Então, eu imagino que, na maioria dos casos práticos, os próprios arquivos javascript são armazenados em cache, mas são dinamicamente reinterpretados cada vez que a página é carregada.
fonte
O navegador definitivamente faz uso de cache, mas sim, os navegadores analisam o JavaScript toda vez que uma página é atualizada. Porque sempre que uma página é carregada pelo navegador, ela cria duas árvores: 1. Árvore de conteúdo e 2. Árvore de renderização.
Essa árvore de renderização consiste nas informações sobre o layout visual dos elementos dom. Portanto, sempre que uma página é carregada, o javascript é analisado e qualquer alteração dinâmica do javascript é como posicionar o elemento dom, mostrar / ocultar o elemento, adicionar / remover elemento, fará com que o navegador recrie a árvore de renderização. Mas os broswers modernos como FF e chrome lidam com isso de maneira um pouco diferente; eles têm o conceito de renderização incremental; portanto, sempre que houver mudanças dinâmicas pelos js, como mencionado acima, isso fará com que esses elementos sejam renderizados e repintados novamente.
fonte