Не зовсім те, здається все ще не зрозуміло пояснив.
На JS не потрібно додатково підтягувати сторінку, це реалізовано на бекенді. Якщо відкривати сторінку в браузері (без ajax), бекенд рендерить повністю всю сторінку яка запитується по вказаному URL. Якщо ж ми з JS робимо ajax запит, тоді бекенд замість повної сторінки повертає лише частину з контентом, який відповідно замінює блок зі старим контентом і міняє URL через pushState.
Так реалізована вся навігація на DevZone. Ось такий результат приходить від бекенда на ajax запит
В цей же блок я і додав js який оновлює сторінку якщо немає title, цей хак, в принципі, розв'язує проблему, але не зовсім гарно.
Без ajax повертається повна сторінка
І ця проблема виникає лише якщо відкрити сайт, далі перейти по посиланню яке завантажить іншу сторінку по ajax, закрити браузер і після повторного відкриття браузера на цій вкладці замість повної сторінки буде лише частина html з контентом, який був повернутий останнім ajax запитом.
<html>
<body>
<div>
Блок який постійно залишаються на сторінці
<a href="/path" class="ajax">отримати дані по ajax і записати в блок #content</a>
</div>
<div id="content">
дані в цьому блоці замінюються ajax запитом
</div>
<div>
Блок який постійно залишаються на сторінці
</div>
</body>
</html>
Він працює як потрібно, при кліці на посилання отримуються дані по ajax і записуються в блок #content, через pushState також змінюється URL.
Але якщо закрити браузер, а потом відкрити, на сторінці буде лише частина html коду яка була в блоці #content
Сподіваюся я зрозуміло пояснив.
PS. В момент відкриття браузера запит на сервер не відсилається, я перевіряв. Це саме браузер так відновлює сторінку залишаючи на ній лише ту частину що була отримана в останньому запиті.
Щойно змінив коментар, мені видалось повідомлення, що коментар змінено, але зразу цього не показало. Прийшлось перезавантажувати сторінку щоб побачити зміни.
Проблема в не тільки в тому що конструктор видаляється. Вона ще і в тому, що AOT не може генерувати код в рантаймі(Reflection.Emit), а це прямо необхідна штука для нормальної швидкодії. Є контейнери які можуть працювати з АОТ і без Reflection.Emit, але вони не такі зручні як звичайні. Наприклад, Splat(https://github.com/reactiveui/splat) він працює за рахунок того, що розробник повиннен самостійно передати делегат який створить інстанс. Це виглядає наступним чином:
Locator.CurrentMutable.Register(() => new Toaster(Locator.Current.Resolve()), typeof(IToaster));
P.S. Помітив що обрізаються < >. @Admin, ти вкурсі про це?)
Дякую за пояснення. Якщо суть в тому, що AOT викидає конструктори, то чи не можна реєструвати залежності викликаючи new самостійно і обійтись вже існуючими IoC контейнерами і без кодогенераціі?
Тут більша проблема Reflection.Emit. На AOT платформах він відсутній як класс.
В Xamarin є режим AOT компіляції і лінковка під час якої викидують методи/класси/збірки. В результаті, може виявитися що конструктор сервісу, який зареєстрований в звичайному ІоС контейнері, був просто викинутить оскільки ніхто явно його не визивав. Всі ці оптимізації можуть значно покращити швидкість холодного старту.
https://docs.microsoft.com/en-us/xamarin/mac/internals/aot
В Unity є IL2CPP (Intermediate Language To C++) - це штука яка компілить IL код в С++ і потім білдить його уже як С++ застосунок. Цей спосіб вимушені міра, оскільки iOS дозволяє тільки AOT компіляцію от вони і викручуються.
Nice catch!
Здається воно залишилось після моїх старих експереметнів. Звідти уже нічого не використовується. Запустив cleanup всього проекту щоб прибрати подібні штуки.
Не зовсім те, здається все ще не зрозуміло пояснив.
На JS не потрібно додатково підтягувати сторінку, це реалізовано на бекенді. Якщо відкривати сторінку в браузері (без
ajax
), бекенд рендерить повністю всю сторінку яка запитується по вказаному URL. Якщо ж ми з JS робимоajax
запит, тоді бекенд замість повної сторінки повертає лише частину з контентом, який відповідно замінює блок зі старим контентом і міняє URL черезpushState
.Так реалізована вся навігація на DevZone. Ось такий результат приходить від бекенда на
ajax
запитВ цей же блок я і додав js який оновлює сторінку якщо немає
title
, цей хак, в принципі, розв'язує проблему, але не зовсім гарно.Без
ajax
повертається повна сторінкаІ ця проблема виникає лише якщо відкрити сайт, далі перейти по посиланню яке завантажить іншу сторінку по
ajax
, закрити браузер і після повторного відкриття браузера на цій вкладці замість повної сторінки буде лише частинаhtml
з контентом, який був повернутий останнімajax
запитом.О, це вже значно краще. Тепер залишилось замінити текст у початковому запитанні. Я пішов туди відповідати.
Сторінка виглядає приблизно таким чином
І JS код
Він працює як потрібно, при кліці на посилання отримуються дані по ajax і записуються в блок
#content
, черезpushState
також змінюється URL.Але якщо закрити браузер, а потом відкрити, на сторінці буде лише частина html коду яка була в блоці
#content
Сподіваюся я зрозуміло пояснив.
PS. В момент відкриття браузера запит на сервер не відсилається, я перевіряв. Це саме браузер так відновлює сторінку залишаючи на ній лише ту частину що була отримана в останньому запиті.
Питання потрібно спростити і доповнити. Не чітко зрозуміло що є, і що повинно бути на сторінці.
Цього я також, ще не зробив
Оскільки ви помітили, то доведеться виправити 😄
Щойно змінив коментар, мені видалось повідомлення, що коментар змінено, але зразу цього не показало. Прийшлось перезавантажувати сторінку щоб побачити зміни.
Це баг. Забув додати оповіщення до цього розділу :)
Виправлю.
До речі, лист не прийшов про ваш коментар. Це баг чи фіча?
Це ви про мене? То не я на відео.
В цьому розділі я поширюю цікаві матеріали які знаходжу.
Ага, так ось хто такий Alex ))
Виправив обрізку тегів, тепер в блоках з кодом нічого не має обрізатися.
Проблема в не тільки в тому що конструктор видаляється. Вона ще і в тому, що AOT не може генерувати код в рантаймі(Reflection.Emit), а це прямо необхідна штука для нормальної швидкодії. Є контейнери які можуть працювати з АОТ і без Reflection.Emit, але вони не такі зручні як звичайні. Наприклад, Splat(https://github.com/reactiveui/splat) він працює за рахунок того, що розробник повиннен самостійно передати делегат який створить інстанс. Це виглядає наступним чином:
Locator.CurrentMutable.Register(() => new Toaster(Locator.Current.Resolve()), typeof(IToaster));
P.S. Помітив що обрізаються < >. @Admin, ти вкурсі про це?)
Дякую за пояснення. Якщо суть в тому, що AOT викидає конструктори, то чи не можна реєструвати залежності викликаючи new самостійно і обійтись вже існуючими IoC контейнерами і без кодогенераціі?
Тут більша проблема Reflection.Emit. На AOT платформах він відсутній як класс.
В Xamarin є режим AOT компіляції і лінковка під час якої викидують методи/класси/збірки. В результаті, може виявитися що конструктор сервісу, який зареєстрований в звичайному ІоС контейнері, був просто викинутить оскільки ніхто явно його не визивав. Всі ці оптимізації можуть значно покращити швидкість холодного старту. https://docs.microsoft.com/en-us/xamarin/mac/internals/aot
https://docs.microsoft.com/en-us/xamarin/android/deploy-test/linker
В Unity є IL2CPP (Intermediate Language To C++) - це штука яка компілить IL код в С++ і потім білдить його уже як С++ застосунок. Цей спосіб вимушені міра, оскільки iOS дозволяє тільки AOT компіляцію от вони і викручуються.
https://docs.unity3d.com/Manual/IL2CPP.html
А які проблеми з рефлексією в Xamarin, Unity?
Nice catch! Здається воно залишилось після моїх старих експереметнів. Звідти уже нічого не використовується. Запустив cleanup всього проекту щоб прибрати подібні штуки.
https://github.com/byme8/ZeroIoC/blob/master/src/ZeroIoC.Core/ZeroIoCContainer.cs#L5
Пригадалося:
ПС дякую за статтю.
Я питав про пряме чи автоматичне копіювання без зайвих рухів.
Непогане видиво про Юнікод: https://www.youtube.com/watch?v=MijmeoH9LT4
Кому ліньки вибирати чи самому налаштовувати Oh-My-Zsh тему: я був зробив (трохи покращений) відповідник класичної теми bash -- https://gist.github.com/bebyx/38ce753760f4f3a71e56dc081e64aa8e
Також, надибав гламурний плаґін для ZSH автозаповнення: https://starship.rs/
Так, ви праві. Виправлено.
Гарно, що є стаття про юнікод українською. Тільки виправте "БМЯП", бо це мабуть російською.