Существует два режима для интерфейсного маршрута: режим HASH и режима истории. Далее мы анализируем методы реализации, преимущества и недостатки этих двух режимов.
Чтобы облегчить демонстрацию, light-server должен быть установлен глобально: пряжа глобальная добавить световой сервер
хэш-режим
Режим хеширования — это способ использования знака решетки для пути к интерфейсной маршрутизации.#Шаблон вставлен после реального URL. когда хэштег#При изменении следующего пути браузер не будет повторно инициировать запрос, а запуститhashchangeмероприятие.
Пример:
мы создаем новыйhash.htmlфайл, содержание:
<a href="#/a">A页面</a>
<a href="#/b">B页面</a>
<div id="app"></div>
<script>
function render() {
app.innerHTML = window.location.hash
}
window.addEventListener('hashchange', render)
render()
</script>
Запустите в каталоге:
light-server -s . --port 3000
затем откройтеhttp://localhost:3000/hash.htmlПроверьте эффект.
В приведенном выше примере мы используемaЯрлык настраивает два маршрута навигации, поставитьappКак контейнер рендеринга представления, он запускает обновление контейнера представления при переключении маршрутов, что на самом деле является принципом реализации хеш-маршрутизации в большинстве интерфейсных фреймворков.
Суммируйте преимущества и недостатки режима хеширования:
- преимущество: Совместимость с браузерами хорошая, поддерживается даже IE8
-
недостаток: Путь находится в знаке фунта
#Сзади некрасиво
режим истории
History API — это новая функция, предоставляемая H5, которая позволяет разработчикам напрямую изменять интерфейсную маршрутизацию, то есть обновлять URL-адрес браузера без повторной инициации запроса.
Пример:
мы создаем новыйhistory.html, содержание такое:
<a href="javascript:toA();">A页面</a>
<a href="javascript:toB();">B页面</a>
<div id="app"></div>
<script>
function render() {
app.innerHTML = window.location.pathname
}
function toA() {
history.pushState({}, null, '/a')
render()
}
function toB() {
history.pushState({}, null, '/b')
render()
}
window.addEventListener('popstate', render)
</script>
Запустите в каталоге:
light-server -s . --historyindex '/history.html' --port 3000
затем откройтеhttp://localhost:3000/history.htmlПроверьте эффект.
History API предоставляет множество функций для вызова разработчиками Мы могли бы также открыть консоль и ввести следующую инструкцию, чтобы наблюдать за изменениями в адресной строке браузера:
history.replaceState({}, null, '/b') // 替换路由
history.pushState({}, null, '/a') // 路由压栈
history.back() // 返回
history.forward() // 前进
history.go(-2) // 后退2次
Приведенный выше код слушаетpopstateсобытие, которое можно слушать:
- Пользователь нажимает действия браузера вперед и назад.
- История звонков вручную
back,forwardа такжеgoметод
Не могу отслеживать:
- история
pushStateа такжеreplaceStateметод
Вот почему вышеизложенноеtoAа такжеtoBФункцию нужно вызывать вручнуюrenderпричина метода. Кроме того, вы также можете заметитьlight-serverбольше команд--historyindex '/history.html'Параметры, для чего это?
Когда браузер обновится, он отправит реальный запрос ресурса в соответствии с путем. Если путь является URL-адресом, установленным внешним интерфейсом через API истории, ресурс часто не существует на стороне сервера, поэтому возвращается 404. Приведенные выше параметры означают, что если бэкенд-ресурс не существует, он вернетhistory.htmlСодержание.
Поэтому при деплое одностраничного приложения на базе history API онлайн оно должно поддерживаться бэкендом, иначе появится большое количество 404. Взяв в качестве примера наиболее часто используемый Nginx, вам нужно всего лишь настроитьlocation /Добавьте следующую строку в:
try_files $uri /index.html;
Суммируйте преимущества и недостатки режима истории:
-
преимущество: Путь относительно нормальный, без знака решетки
# - недостаток: Совместимость не так хороша, как хэш, и ему нужна поддержка сервера, иначе он получит 404, как только страница обновится.