Каковы недостатки включения середины страницы CSS-файла в 2018 году? - PullRequest
0 голосов
/ 03 мая 2018

Существует очень старая ветка , где люди утверждают, что вы никогда не должны включать CSS в тело, однако MDN заявляет , что разрешено. Так считается ли хорошей или плохой практикой включать CSS в середине страницы?

Например, давайте возьмем такую ​​структуру:

<html>
  <head>
    <link href="global.css" rel="stylesheet">
  </head>
  <body>
    <h1>Some title</h1>
    <p>Some content</p>
    <img src="some-image.jpg" />

    <link href="specific-component.css" rel="stylesheet">
    <div>
       Specific component that requires the style
    </div>

    <p>Other content</p>
  </body>
</html>

Каковы недостатки включения средней страницы specific-component-style.css по сравнению с включением ее в заголовочный раздел?

Как страница будет отображаться с ним? Будет ли это:

  • Начните загрузку global.css, some-image.jpg, specific-component.css (в этом порядке).
  • После загрузки global.css начать рендеринг страницы до элемента specific-component.css <link>.
  • Завершить загрузку specific-component.css
  • Визуализация остальной части страницы.

Или это будет:

  • Дождитесь окончания загрузки и global.css, и specific-component.css, и только потом начинайте рендеринг страницы.
  • Что делать, если перед файл specific-component.css имеется 20 изображений, браузеры определят приоритет CSS-файла или нет?

Ответы [ 4 ]

0 голосов
/ 03 мая 2018

Safari и Edge будут визуализировать контент до <link>, а затем продолжить рендеринг после извлечения связанного CSS.

Firefox будет отображать содержимое до и после <link>, а затем обновлять страницу после извлечения связанного CSS. Вы можете заставить его вести себя как Safari / Edge, используя <link … ><script> </script> (пробел между тегами скрипта необходим.

Chrome заблокирует рендеринг, как только обнаружит <link>, что означает, что он также может блокировать контент перед элементом ссылки. План должен соответствовать Safari & Edge https://bugs.chromium.org/p/chromium/issues/detail?id=481122.

Если вы обнаружили, что ваш CSS загружается слишком поздно, вы можете использовать <link rel="preload" as="style" href="…">, чтобы загрузить его раньше.

0 голосов
/ 03 мая 2018

На мой взгляд, это зависит от того, как вы работаете. Если вы загружаете полную страницу (будь то ручной HTML или сгенерированный через CMS, такой как Wordpress) - рекомендуется, чтобы стиль загружался раньше основного текста, чтобы рендеринг был более плавным и быстрым.

ОДНАКО, поскольку использование библиотек компонентов, таких как React и Vue (например), становится все более и более популярным, допустимо подключать CSS к компоненту, а не загружать отдельные компоненты CSS с общим стилем (это должно как правило, позволяет ускорить загрузку, особенно на сайтах с одной страницей, которые имеют динамически изменяющиеся элементы.

Согласно порядку рендеринга, по умолчанию CSS / JS является наивысшим приоритетом для загрузки, и после этого вы получаете элементы мультимедиа (изображения, видео, аудио и т. Д.). Отметьте эту ссылку или эту , чтобы узнать больше о приоритетах в браузере.

0 голосов
/ 03 мая 2018

Если вы дадите img{width:100px;} в global.css и img{width:150px;} в specific-component.css, в этом случае сработает specific-component.css, потому что он рендерит после global.css и перезаписывает global.css.

Если вы зададите img{width:100px !important;} в global.css и img{width:150px;} в specific-component.css, в этом случае работайте global.css, потому что мы установили значение img width в global.css, и оно не перезаписывается конкретными component.css.

И если вы дадите важное в обоих случаях, тогда работайте specific-component.css. И движок css всегда компилирует первый файл specific-component.css. (Посмотрите в элементе inspect)

0 голосов
/ 03 мая 2018

Есть два основных недостатка:

  • вы теряете удобство сопровождения кода
  • если этот CSS влияет на какой-либо элемент перед ним, вы можете получить FOUC .

Теоретически, есть и незначительные потери производительности, но они незначительны: рендеринг приостанавливается, когда встречается новый ресурс таблицы стилей. Должно быть сделано четкое различие между «блокировкой рендеринга» и выполнением сценария или блокировкой построения DOM. Браузер будет продолжать делать все возможное и будет блокировать любой сценарий, запрашивающий repaint (), до тех пор, пока ресурс не разрешится, после чего CSSOM будет перестроен, все существующие элементы DOM будут проверены на соответствие новому CSSOM, и все сценарии паузы будут продолжены.


Если ваш <style> относится к исключению, встречающемуся только в этом конкретном представлении / компоненте / странице, имеет смысл добавить его там, до того, как элемент будет затронут правилами. Но если вы сделаете из этого привычку, рано или поздно вам захочется, чтобы все ваши стили были в одном месте; Ваш проект станет труднее поддерживать.
По общим принципам не стоит этого делать.

Это также сильно зависит от масштаба вашего проекта. На небольших проектах это не имеет значения. В огромных проектах, в которых участвуют большие команды, это полностью запрещено, так как никто не вспомнит ваше исключение . Так что иногда это может быть основанием для потери вашей позиции или, по крайней мере, вашего положения.ツ

И последнее, но не менее важное, особенно если вас не считают экспертом, это то, что может быть истолковано против вашего интереса людьми, оценивающими вашу работу (например, люди, знающие меньше, чем вы, могут воспринимать это как признак вы не выполняете свою работу должным образом).


С учетом вышесказанного браузер не заботится. Если он проверяется, он применяется и отображается.
Другая незначительная техническая проблема (в случае тегов <style>, а не <link> s) заключается в том, что встроенный CSS кэшируется никогда . Он загружается каждый раз вместе с разметкой, в то время как обычный CSS в загруженных таблицах стилей больше не потребляет пропускную способность. Но, опять же, если мы говорим несколько строк кода, это не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...