Главная » CSS, Веб-разработка

Не используйте @import

11 Апрель 2009 просмотров 2,358 комментариев 16


Вольный перевод статьи don’t use @import
Автор: Steve Souders

В данной статье автор приводит наглядные доказательства, почему не стоит использовать @import для загрузки стилей в документ.

LINK vs. @import

Существует 2 способа загрузки файлов стилей. Использовать тег LINK:

<link rel='stylesheet' href='a.css'> 

Или импортировать файлы с помощью @import:

<style>
@import url('a.css');
</style>

Я предпочитаю использовать LINK для удобства, т.к. вы должны помнить, что @import нужно размещать всегда в самом верху блока стилей, в противном случае они не импортируются.

Новости примадонны отечественного шоу-бизнеса, Аллы Пугачёвой.
Все еще ищите хостинг для своего проекта?

@import @import

Я хочу рассказать о различных способах использования LINK и @import. В приведенном ниже примере прописаны 2 файла стилей: a.css и b.css. Каждый файл по загрузке занимает ровно 2 секунды, чтобы было удобно отследить влияние на скорость загрузки в дальнейшем. В первом примере используется @import для загрузки обоих файлов стилей. В этом примере, называемом @import @import, HTML документ содержит следующий блок стилей:

<style>
@import url('a.css');
@import url('b.css');
</style> 

Если вы всегда будете использовать только @import для загрузки стилей, то проблем с производительностью не будет, хотя мы увидим ниже, это может привести к ошибке с JavaScript. Оба файла загружаются параллельно (см. рисунок 1) Но проблемы начинают появляться, если использовать @import внутри файла стилей, либо вместе с LINK.

import-import

Рис. 1.

LINK @import

В примере LINK @import используется тег LINK для загрузки a.css, и @import для b.css:

<link rel='stylesheet' type='text/css' href='a.css'>
<style>
@import url('b.css');
</style> 

В IE (тестировалось в 6, 7, и 8), это привело к тому, что файлы загружаются последовательно друг за другом, как показано на рисунке 2. Соотвественно, время загрузки страницы в IE увеличится.

link-import

Рис. 2

LINK с @import

В примере LINK с @import, файл  a.css загружается через LINK, и содержит внутри правило @import для b.css:
В документе:

<link rel='stylesheet' type='text/css' href='a.css'> 

в a.css:

@import url('b.css');

Этот способ также приводит к тому, что файлы загружаются последовательно (рис. 3.), а не параллельно, но теперь это происходит не только в IE, но и остальных браузерах. Если подумать – все логично: браузер загружает a.css и начинает парсить его. Обнаружив внутри правило @import, начинается загрузка файла b.css.

link-with-import

Рис. 3.

Блоки LINK с @import

Незначительное отличие от предыдущего примера привело к удивительным результатам в IE. LINK используется для вызова a.css и для нового файла proxy.css, который содержит только @import для b.css.
В коде:

<link rel='stylesheet' type='text/css' href='a.css'>
<link rel='stylesheet' type='text/css' href='proxy.css'> 

В proxy.css:

@import url('b.css');

Результаты эксперимента в IE показаны на рисунке 4. Первый запрос – HTML документ. Второй запрос -  a.css (2 секунды). Третий – proxy.css. Четвертый – b.css (2 секунды). И вот что удивительно, IE не хочет начинать загрузку b.css, пока файл a.css не будет загружен полностью. Во всех других браузерах такого сюрприза не происходит, что приводит к более быстрой загрузке страницы (см. рисунок 5).

link-blocks-import

Рис. 4. Результаты в IE.

link-blocks-import-not-ie

Рис. 5. Результаты в других браузерах.

Много @imports

Использование сразу нескольких правил @import в IE приводит к тому, что файлы загружаются не в том порядке, в котором они указаны в коде. В этом примере используется 6 файлов стилей (каждый из которых загружается по 2 секунды), за которыми следует JS скрипт (4 секунды для загрузки).

<style>
@import url('a.css');
@import url('b.css');
@import url('c.css');
@import url('d.css');
@import url('e.css');
@import url('f.css');
</style>

<script src='one.js' type='text/javascript'></script>

На рис. 6 вы увидите, что самый долгий по загрузке – это скрипт. Несмотря на то что он указан после стилей, в IE он загружается первым. Если в скрипте содержится код, который зависит от применяемых стилей (getElementsByClassName, и т.п.), это может привести к ошибкам работы скрипта, т.к. он загружается прежде чем стили.

many-imports

Рис. 6.

LINK LINK

Проще и безопасней использовать LINK для загрузки стилей:

<link rel='stylesheet' type='text/css' href='a.css'>
<link rel='stylesheet' type='text/css' href='b.css'> 

Использование LINK обеспечивает параллельную загрузку файлов во всех браузерах (см. рисунок 7). Применение LINK также гарантирует, что файлы будут загружены именно в том порядке, который указан в коде документа.

import-import

Рис. 7.

Для нас особенно плохо то, что ресурсы могут быть загружены в другом порядке, нежели указано в документе. Все браузеры должны заглядывать наперед перед загрузкой стилей для извлечения правил @import и начинать их загрузку немедленно. До тех пор, пока браузеры не реализуют это, я советую избегать использование @import и загружать стили только с помощью LINK.

Блогун

Комментариев 16 »

  • ]]>art пишет: ]]>

    ну раз так, то и не буду
    а вобще и не привилась привычка использовать @import  

    Цитировать

  • ]]>liberborn пишет: ]]>

    а вы в код этой странички заглядывали?
    @import url(http://www.getincss.ru/wp-content/themes/perfect-tabs/style.css); @import url(/wp-content/plugins/postratings/postratings-css.css);@import url(/wp-content/themes/perfect-tabs/css/ui-tabs.css);@import url(/wp-content/themes/perfect-tabs/css/print.css);  

    Цитировать

  • ]]>Автор пишет: ]]>

    Я прекрасно знаю свой код ;) Мне придется пока это оставить, как раз как показатель.

      

    Цитировать

  • ]]>YoYurec пишет: ]]>

    оригинальная статья обновилась! добавили ещё 2 метода, более реальные в использовании на приктике как по мне…  

    Цитировать

  • ]]>Chrono пишет: ]]>

    Неубедительно, причем весьма. @imports позволяет грузить файлы стилей параллельно, не препятствуя отрисовке странички и это есть главное его преимущество. А единственный весомый аргумент против – проблемы при многочисленных @imports неубедителен, так как на на практике я не встречал больше двух таблиц стилей для профессионально сделаных движков и, тем более, статических страничек. Также с использованием @imports и LINK – я думаю веб-мастер не-ламер не будет использовать разные методы.Ну а что касается Ослика, то его уже пора хоронить, а Вы все пытаетесь его воскрешать различными подгонами и ухищрениями, продлевая его агонию и мучая себя ;=) Может все-таки закопаем?  

    Цитировать

  • ]]>Eli пишет: ]]>

    вообще не использую import, всегода только Link   

    Цитировать

  • ]]>Anstak пишет: ]]>

    Спасибо, теперь +1 в корзину против @import. Я недавно смотрел семинар Яндекса по верстке, и там рассказывали свои технологии. Так вот там используют импорт, но при загрузке некий скрипт обрабатывает всё таки образом, что бы @import заменить на содержимое файла, который он импортирует. Но Это Яндекс, со своими миллионными запросами, а обычным людям такого не надо =). Они предпочитают @import из за того, что LINK делает лишние http запросы.  

    Цитировать

  • ]]>Anstak пишет: ]]>

    То что ты на практике не встречал больше двух таблиц стилей ни о чем не говорит. И тут всё зависит не от профессионального движка, а от разработчика. У меня например 5 файлов стилей прибито почти всегда. Обычный, для IE, версии для печати, для визуального редактора (в CMS MODx), Иногда предпочитаю вынести отдельный файл стилей для IE7. Ослика еще рано хоронить, 2 года ему еще даю, минимум.  

    Цитировать

  • ]]>Mas пишет: ]]>

    Согласен с постом. Всегда косо смотрел на @import.

    @Chrono, на wow.ya.ru там практически везде используется @import в больших количествах. А я еще удивлялся – по логике вещей фреймверки не используются громосткие, а грузиться на диалапе долго по сравнению с другими более громоздкими сайтами.  

    Цитировать

  • ]]>almaz пишет: ]]>

    Как-то привык разделять стили на:
    main.css
    header.css
    content.css
    footer.css

    Физически не могу уже писать стили в одном файле.

    Но у меня лично вопрос в другом: выгоднее ли для больших проектов (от 50 разных страниц) писать для всех страниц общие стили и потом для каждой страницы свой файл стилей, чтобы быстрее грузило или же при серфинге по сайту лучше написать один большой файл стилей для всех страниц и потом его прокешит и не будет грузить?  

    Цитировать

  • ]]>Блог для вебмастеров пишет: ]]>

    @almaz,
    выгоднее написать общий файл стилей + отдельные для каждой страницы. Ведь юзер на все 50 сразу не зайдет, зачем ему лишние кб грузить?  

    Цитировать

  • ]]>almaz пишет: ]]>

    Логично. Я просто спрашиваю мнения, т.к. вот есть проект на 70 страниц. Грузить я так понимаю через линк потом нужное в каждой странице? А то с импортом непонятно до конца. То пишут, что он параллельно грузится, то последовательно. А Если ИЕ для этого дела брать, то он вообще больше 2-х запросов ведь не обрабатывает, так что ему должно быть пофигу как грузить стили. Нет?  

    Цитировать

  • ]]>Блог для вебмастеров пишет: ]]>

    @almaz,
    Смешивать LINK и @import, а тем более если есть скрипты – точно не стоит. Подгружайте через LINK и проблем не будет и в IE тоже.  

    Цитировать

  • ]]>almaz пишет: ]]>

    Спасибо, опробую метод, хотя, честно говоря у меня и с импортом проблем не было никогда. В смысле, что даже на ИЕ этого особо не заметно при загрузке на слабых каналах.  

    Цитировать

  • ]]>sshp пишет: ]]>

    Они предпочитают @import из за того, что LINK делает лишние http запросы

    И @import тоже делает, иначе никак.

    @imports позволяет грузить файлы стилей параллельно, не препятствуя отрисовке странички и это есть главное его преимущество.

    На Yahoo Developer Network писали, что @import препятствует прогрессивному рендерингу страницы в IE.
    In IE @import behaves the same as using <link> at the bottom of the page, so it’s best not to use it.
    … These browsers block rendering to avoid having to redraw elements of the page if their styles change.

    У меня например 5 файлов стилей прибито почти всегда. Обычный, для IE, версии для печати, для визуального редактора (в CMS MODx), Иногда предпочитаю вынести отдельный файл стилей для IE7.

    Множество отдельных файлов повышают нагрузку на сервер из-за дополнительных HTTP-запросов. Может быть тебе будет полезно объединить, например, Обычный и версии для печати, если они оба появляются на всех страницах. Я думаю, разделять можно, если какая-то часть CSS-правил относится только к отдельному разделу ─ чтобы не загружать лишние правила, если посетитель даже не зашёл в этот раздел.
    Хотя HTTP 1.1 имеет директиву Keep-Alive, благодаря которой открывается только одно TCP/IP-соединение для всех файлов… Но все почему-то всё равно гонятся за снижением обращений к серверу.. (все эти CSS-Sprites или даже base64-кодирование изображений..) Никто не знает, почему, а?  

    Цитировать

  • ]]>Александр пишет: ]]>

    В ярушечке используется подход верстки “независимыми блоками”, описанный Чикуенком, очень удобный подход. для ие используется условные операторы, которые, действительно подключают скрипт, заменяющий @import на линк, или подключают отдельный css, который собирается спец для ие, для других же браузеров оставляют @import. Разбивают проект на папки, в каждой папке лежит верстка одного блока, в каждой такой папке есть и html, который всегда можно поправить отдельно в ней же.  

    Цитировать

Комментарии

Добавьте ваш комментарий, или трекбэк с сайта. Вы также можете подписаться на комментарии к этой статье через RSS.

Вы можете использовать теги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Чтобы получить аватарку, зарегистрируйтесь на Gravatar.