hash
É history
uma pergunta muito comum em entrevistas de front-end. Muitas pessoas podem ter uma compreensão diferente de história e hash. Os campos url dos dois não têm sinal # e o outro tem sinal #. Mas você já pensou por que isso é então?Qual é a diferença entre ter # e não?Este artigo fala sobre minha compreensão do histórico de roteamento front-end e hash.
hash
Ambos history
podem ser utilizados em projetos de separação front-end e back-end, e ambos possuem características e cenários de uso próprios.
1. Princípio de roteamento de front-end
1、SPA
SPA significa Aplicativo de página única . O chamado Web
aplicativo de página única é um aplicativo com apenas uma Web
página. Ao contrário de muito tempo atrás, a interação do front-end é pular em várias páginas e cada página existe de forma relativamente independente. Um aplicativo de página única deve continuar uma página Altere dinamicamente o conteúdo renderizado da página. Um aplicativo de página única (SPA) é um aplicativo que carrega uma única HTML
página e atualiza dinamicamente essa página conforme o usuário interage com o aplicativo . Web
O navegador carregará inicialmente os necessários HTML
, CSS
e JavaScript
, e todas as operações são feitas nesta página, controlada JavaScript
por .
Hoje em dia, para lidar com Web
o rápido desenvolvimento de aplicativos de página única, várias pilhas de tecnologia de componentes de front-end surgem infinitamente. Nos últimos anos, por meio de iterações contínuas de versão, as duas principais pilhas de tecnologia vue
e react
as duas pilhas de tecnologia ganharam destaque, tornando-se as duas pilhas de tecnologia mais populares atualmente.
2. Quando o roteamento é necessário?
A maioria das estruturas usadas atualmente na China são Vue, e Vue herda a forma de desenvolvimento de aplicativos de página única. E vue-router
é vue
a configuração padrão de roteamento de , e vue-router
tem dois modos : hash
e history
.
O seguinte explicará esses dois modos, um por um.
2. Modo hash
1. Definição
hash
O modo é um modo em que o caminho da rota front-end #
é emendado com marcas de hash após o real . url
Quando o caminho atrás do sinal de libra muda #
, o navegador não reinicia a solicitação, mas aciona onhashchange
um evento.
Por exemplo: http://127.0.0.1:8001/01-hash.html?a=100&b=20#/aaa/bbb
2. As características do haxixe
-
A alteração do hash acionará o salto da página da web, ou seja, o avanço e retrocesso do navegador.
-
hash
Ele pode ser alteradourl
, mas não acionará o recarregamento da página (a alteração do hash é registrada emwindow.history
), ou seja, a página não será atualizada. Em outras palavras, todos os saltos de página são executados no lado do cliente. Portanto, isso não é considerado umahttp
solicitação, portanto, esse modo não é propício àSEO
otimização.hash
Você só pode modificar#
a parte posterior, portanto, só pode pular paraurl
o mesmo documento que o atualurl
. -
hash
Porwindow.onhashchange
meio de , para monitorarhash
as alterações de , de modo a realizar a função de salto sem atualização. -
hash
Nunca será submetido aoserver
final (pode-se entender que só vive e morre no front end).
3. Modo de histórico
1. Definição
history API
É H5
um novo recurso que permite aos desenvolvedores alterar diretamente o roteamento do front-end , ou seja, atualizar o URL
endereço do navegador sem reiniciar a solicitação .
2. API de histórico
Várias HTML5
adições são descritas abaixo history API
. Os detalhes são os seguintes:
API | definição |
---|---|
history.pushState(dados, título [, url]) | pushState é usado principalmente para adicionar um registro ao topo da pilha de histórico . Os parâmetros são analisados da seguinte forma: ①data será passado como parâmetro quando o evento onpopstate for acionado; ②title é o título da página, e todos os navegadores atuais irão ignorar este parâmetro; ③url é o endereço da página, que é opcional, e será o endereço da página atual se estiver faltando |
history.replaceState(dados, título [, url]) | Altere o histórico atual, os parâmetros são os mesmos acima; o pushState acima é adicionado, esta alteração |
história.estado | É usado para armazenar os dados dos métodos acima, e as permissões de leitura e gravação de diferentes navegadores são diferentes |
window.onpopstate | Resposta a chamadas pushState ou replaceState |
3. As características da história
Para history
, as principais características são as seguintes:
- O new
url
pode serurl
qualquer um da mesma origem que o currenturl
, ou pode ser ourl
mesmo endereço do current , mas isso causará um problema de que a operação repetida será gravada na pilha. - Passe
history.state
, adicione qualquer tipo de dado ao registro. - Propriedades adicionais podem ser definidas
title
para uso subsequente. - Através de
pushState
,replaceState
para realizar a função de nenhum salto de atualização.
4. Há problemas
Para history
, resolve muitos dos hash
problemas existentes de , mas também traz novos problemas. detalhes como segue:
- Ao usar
history
o modo, ao atualizar a página atual, o navegador reiniciará a solicitação. Senginx
não houver correspondência para obter o atualurl
,404
a página de aparecerá. - Quanto
hash
ao esquema, ele parecerá alteradourl
, mas não será incluído nahttp
solicitação. Portanto, ele é usado para guiar as ações do navegador e não afeta o lado do servidor. Portanto, a alteraçãohash
realmente não mudaurl
, portanto, o caminho da página ainda é o caminho anterior enginx
não será interceptado. - Portanto, ao usar
history
o modo, é necessário permitir que o endereço seja acessível através do servidor .Se não for definido, levará facilmente à404
situação que aparece.