JavaScript - это однопоточная среда программирования. При загрузке нескольких сценариев в верхней части тега заголовка остальные теги скрипта под ним блокируются до тех пор, пока не загрузится этот тег скрипта. Если один тег сценария не может быть загружен, то все остальные из них застряли ... пока браузер не истечет для этого тега скрипта. Чтобы обойти эту проблему блокировки, разработчики перемещали теги скриптов в нижней части веб-страницы за последние несколько лет.
Проблема действительно заметна, когда на сайте много JS-файлов, которые находятся в верхней части страницы & amp; загружаются с 3-го, 4-го, 5-го, до N-го партийных серверов поставщиков рекламы. Когда сервер поставщика рекламы отправляется в автономный режим, где их объявления больше не могут обслуживаться, что случается довольно часто - тогда JS на странице сидит & amp; ожидает от браузера тайм-аута. Это заставляет страницу застревать во время загрузки. Это создает плохой опыт работы с пользователем.
Трюк разработчика движущихся тегов скрипта в нижней части страницы помогает облегчить эти 2 проблемы. Это также ускоряет загрузку веб-страниц и amp; быть доступным раньше для пользователей и amp; поиск ботов. Поскольку боты поисковых систем заботятся о времени загрузки страницы, они могут повысить производительность веб-сайтов, когда их веб-страницы загружаются быстро.
Поэтому важно по возможности перемещать теги скриптов в нижней части страницы.
>>> re.split('(\W)', 'foo/bar spam\neggs')
['foo', '/', 'bar', ' ', 'spam', '\n', 'eggs']
Я нашел этот основанный на генераторе подход более удовлетворяющим:
def split_keep(string, sep):
"""Usage:
>>> list(split_keep("a.b.c.d", "."))
['a.', 'b.', 'c.', 'd']
"""
start = 0
while True:
end = string.find(sep, start) + 1
if end == 0:
break
yield string[start:end]
start = end
yield string[start:]
Это избегает потребности выяснить корректный regex, в то время как в теории должно быть довольно дешевым. Это не создает новые строковые объекты и, делегирует большую часть итеративной работы к эффективному методу находки.
... и в Python 3.8 это может быть столь же коротко как:
def split_keep(string, sep):
start = 0
while (end := string.find(sep, start) + 1) > 0:
yield string[start:end]
start = end
yield string[start:]