предисловие
Три интерфейсных фреймворкаAngular
,React
,Vue
, их решение для маршрутизацииangular/router
,react-router
,vue-router
Все они инкапсулированы и реализованы по принципу front-end роутинга, поэтому необходимо понять и освоить принцип front-end роутинга, потому что мы неизбежно столкнемся с некоторыми ямами в процессе его повторного использования. его принцип реализации, тогда вы можете легче использовать маршрутизацию в разработке.
1. Что такое маршрутизация?
Концепция маршрутизации возникла на сервере, когда интерфейс и сервер не разделены, сервер управляет маршрутом.HTTP
запрос, соответствующийURL
, чтобы найти соответствующую функцию сопоставления, выполнить функцию и отправить возвращаемое значение функции клиенту. Для простейшего сервера статических ресурсов можно считать, что всеURL
Функция карты — это операция чтения файла. Для динамических ресурсов функцией сопоставления может быть операция чтения базы данных или некоторая обработка данных и т.д. Затем, согласно прочитанным данным, на стороне сервера используется соответствующий шаблон для отрисовки страницы, после чего отрендеренная страница возвращается. Его преимущества и недостатки очень очевидны:
- Достоинства: хорошая безопасность,
SEO
хорошо; - Недостатки: повышенная нагрузка на сервер, что не способствует пользовательскому опыту, а код избыточен и сложен в обслуживании;
Именно потому, что внутренняя маршрутизация все еще имеет свои недостатки, у внешней маршрутизации есть собственное пространство для развития. Для внешней маршрутизации функция сопоставления маршрутизации обычно выполняет некоторыеDOM
показать и скрыть операции. Таким образом, при доступе к разным путям будут отображаться разные компоненты страницы. Существует две основные схемы реализации интерфейсной маршрутизации:
Hash
History
Конечно, у front-end роутинга есть и недостатки: при использовании клавиш браузера вперед и назад запрос будет повторно отправлен для получения данных, а кеш используется нерационально. Но в целом интерфейсная маршрутизация сейчас является основным способом реализации маршрутизации.Angular
,React
,Vue
, их решение для маршрутизацииangular/router
,react-router
,vue-router
Все они разработаны на основе внешней маршрутизации, поэтому внешняя маршрутизация понятна и
Необходимо освоить, давайте рассмотрим два распространенных режима маршрутизации переднего плана.Hash
иHistory
Объяснять.
Две, две реализации интерфейсной маршрутизации
2.1 Режим хеширования
2.1.1 Принцип
Ранняя реализация внешней маршрутизации была основана наlocation.hash
быть реализованным. Принцип его реализации также очень прост,location.hash
ЗначениеURL
Содержимое после # в нем. Например, следующий веб-сайт, егоlocation.hash
значение'#search'
:
https://www.word.com#search
также,hash
Есть также следующие особенности:
-
URL
серединаhash
Значение — это просто состояние клиентской стороны, то есть когда делается запрос к серверной стороне,hash
Запчасти не отправляются. -
hash
Изменение значения добавит запись в историю доступа браузера. Таким образом, мы можем управлять им с помощью кнопок браузера «назад» и «вперед».hash
выключатель. - мы можем использовать
hashchange
событие для мониторингаhash
Перемена.
Мы можем запустить двумя способамиhash
изменение, один черезa
метка и установкаhref
атрибут, когда пользователь нажимает на эту метку,URL
изменится, это сработаетhashchange
Событие вверх:
<a href="#search">search</a>
Другой способ заключается в непосредственном использованииJavaScript
иди прямоloaction.hash
назначение, тем самым изменяяURL
,курокhashchange
событие:
location.hash="#search"
В следующей реализации мы используем второй метод для достижения.
2.1.2. Реализация
Сначала мы определяем родительский классBaseRouter
, реализоватьHash
маршрутизация иHistory
Некоторые распространенные методы маршрутизации;
export class BaseRouter {
// list 表示路由表
constructor(list) {
this.list = list;
}
// 页面渲染函数
render(state) {
let ele = this.list.find(ele => ele.path === state);
ele = ele ? ele : this.list.find(ele => ele.path === '*');
ELEMENT.innerText = ele.component;
}
}
Мы просто достиглиpush
вставная функция,go
Для функции «вперед/назад» отмечены соответствующие комментарии к коду, которые легко понять и не будут вводиться один за другим. См. следующее:
export class HashRouter extends BaseRouter {
constructor(list) {
super(list);
this.handler();
// 监听 hashchange 事件
window.addEventListener('hashchange', e => {
this.handler();
});
}
// hash 改变时,重新渲染页面
handler() {
this.render(this.getState());
}
// 获取 hash 值
getState() {
const hash = window.location.hash;
return hash ? hash.slice(1) : '/';
}
// push 新的页面
push(path) {
window.location.hash = path;
}
// 获取 默认页 url
getUrl(path) {
const href = window.location.href;
const i = href.indexOf('#');
const base = i >= 0 ? href.slice(0, i) : href;
return base +'#'+ path;
}
// 替换页面
replace(path) {
window.location.replace(this.getUrl(path));
}
// 前进 or 后退浏览历史
go(n) {
window.history.go(n);
}
}
2.1.3, визуализация
Hash
Рендеринг примера реализации маршрутизации шаблона выглядит следующим образом:
2.2, Режим истории
2.2.1 Принцип
фронтhash
Хотя это тоже очень хорошо, но при использовании нужно добавлять #, что не очень красиво. так вотHTML5
, что также обеспечиваетHistory API
реализоватьURL
Перемена. самый важный из которыхAPI
Есть следующие два:history.pushState()
иhistory.repalceState()
. эти двоеAPI
Историей браузера можно управлять без обновления. Единственное отличие состоит в том, что в первом случае добавляется новая запись истории, а во втором — прямая замена текущей записи истории, как показано ниже:
window.history.pushState(null, null, path);
window.history.replaceState(null, null, path);
также,history
Существуют следующие функции:
-
pushState
иrepalceState
заглавие(title
): обычно игнорируется браузерами, лучше пройтиnull
; - мы можем использовать
popstate
событие для мониторингаurl
Перемена; -
history.pushState()
илиhistory.replaceState()
не сработаетpopstate
событие, то нам нужно вручную запустить рендеринг страницы;
2.2.2. Реализация
Мы также просто достиглиpush
вставная функция,go
Для функции «вперед/назад» отмечены соответствующие комментарии к коду, которые легко понять и не будут вводиться один за другим. См. следующее:
export class HistoryRouter extends BaseRouter {
constructor(list) {
super(list);
this.handler();
// 监听 popstate 事件
window.addEventListener('popstate', e => {
console.log('触发 popstate。。。');
this.handler();
});
}
// 渲染页面
handler() {
this.render(this.getState());
}
// 获取 url
getState() {
const path = window.location.pathname;
return path ? path : '/';
}
// push 页面
push(path) {
history.pushState(null, null, path);
this.handler();
}
// replace 页面
replace(path) {
history.replaceState(null, null, path);
this.handler();
}
// 前进 or 后退浏览历史
go(n) {
window.history.go(n);
}
}
2.2.3, визуализация
History
Рендеринг примера реализации маршрутизации шаблона выглядит следующим образом:
2.3 Сравнение двух режимов маршрутизации
Контрастная точка | Хэш-режим | Режим истории |
---|---|---|
эстетика | С символом # это уродливее | Просто и красиво |
совместимость | >= т.е. 8, другие основные браузеры | >= т.е. 10, другие основные браузеры |
практичность | Никаких изменений сервера не требуется | Сервер должен соответствующим образом координировать настройки маршрутизации. |
3. Резюме
В этой статье мы кратко расскажем, что такое маршрутизация, происхождение интерфейсной маршрутизации и проанализируем две интерфейсные маршрутизации:Hash
узор иHistory
Принцип работы мода и реализация простых функций, код реализации примера в этой статье выложен на гитхаб:GitHub.com/ревматизм123/…. Благодаря овладению принципом внешней маршрутизации в этой статье вы сможете прочитать основные принципы.vue-router
иreact-router
Исходный код реализован.
Адрес гитхаба:GitHub.com/ревматизм123/… , который обобщает все статьи в блоге автора, если вам нравится или вдохновляет, пожалуйста, помогите дать звезду ~, что также является поощрением для автора.
использованная литература
1. Говоря о внешней маршрутизации:Краткое описание.com/afraid/'s 2 ah 8 удобный 95…
2. Внешняя маршрутизация:сегмент fault.com/ah/119000001…