Один величезний .css файл порівняно з кількома меншими конкретними .css файлами? [зачинено]


258

Чи є якась перевага мати один файл .css монстра, який містить елементи стилю, які будуть використовуватися майже на кожній сторінці?

Я думаю, що для зручності управління я хотів би витягнути різні типи CSS в кілька файлів і включити кожен головний файл в моє головне, <link />це погано?

Я думаю, що це краще

  1. позицій.css
  2. кнопки.css
  3. таблиці.css
  4. copy.css

vs.

  1. site.css

Ви бачили будь-які приїзди, коли це робилося в один бік проти іншого?


1
Це дійсно старе запитання, але зіткнувшись з тією ж проблемою, я знайшов те, що, на мою думку, це найкраще рішення , на випадок, якщо хтось інший потрапить на цю сторінку. Кілька файлів, які стискаються з PHP та надсилаються через один запит.
Francisco Presencia

3
@FrankPresenciaFandos робити це нормально для сайту з низьким трафіком, але запускати цей сценарій знову і знову на сайтах з високим трафіком, здається, трохи не вдається. Якщо ви використовуєте сценарій збірки, ви можете мати найкраще з обох світів і все ще підтримувати працездатний веб-сервер, оскільки на ньому не працює сценарій php (ніколи).
Чейз Флорелл

2
Він запускатиметься лише кожного разу, коли css змінюється, і тоді вам доведеться включати отриманий файл css.
Francisco Presencia

Відповіді:


85

Компілятор CSS на зразок Sass або LESS - це чудовий спосіб. Таким чином ви зможете доставити єдиний, мінімізований CSS-файл для сайту (який буде набагато меншим та швидшим, ніж звичайний єдиний вихідний файл CSS), зберігаючи при цьому найприємніше середовище розробки, при цьому все акуратно розділено на компоненти.

Sass та LESS мають додаткову перевагу змінних, вкладення та інших способів полегшити CSS для запису та обслуговування. Настійно, дуже рекомендується. Я особисто використовую Sass (синтаксис SCSS) зараз, але раніше використовував LESS. Обидва чудові, з подібними перевагами. Після того, як ви написали CSS з компілятором, навряд чи ви хочете обійтися без одного.

http://lesscss.org

http://sass-lang.com

Якщо ви не хочете возитися з Ruby, цей менший компілятор для Mac чудово:

http://incident57.com/less/

Або ви можете використовувати CodeKit (тими самими хлопцями):

http://incident57.com/codekit/

WinLess - це графічний інтерфейс Windows для компіляції менше

http://wverage.org/


2
Зміна моєї прийнятої відповіді тут, оскільки це справді саме цей шлях. Коли я спочатку запитав, я ще не відчуваю, що Сасс або МЕНШЕ справді знялися.
Нейт

144

На це важко відповісти. На мою думку, обидва варіанти мають свої плюси і мінуси.

Я особисто не люблю читати один-величезний файл CSS, і підтримувати його дуже складно. З іншого боку, розбиття його викликає додаткові запити http, які потенційно можуть уповільнити ситуацію.

Моя думка була б однією з двох речей.

1) Якщо ви знаєте, що ваш CSS НІКОЛИ не змінюватиметься, коли ви його створили, я створив би декілька файлів CSS на стадії розробки (для читабельності), а потім об'єднав їх вручну перед початком роботи (щоб зменшити запити http)

2) Якщо ви знаєте, що збираєтесь змінювати свій CSS час від часу, і вам потрібно зробити його читабельним, я буду створювати окремі файли та використовувати код (за умови, що ви використовуєте якусь мову програмування), щоб комбінувати їх у час збирання часу виконання (мінімізація / комбінація часу виконання - це ресурс).

З будь-яким варіантом я б настійно рекомендував кешування на стороні клієнта, щоб ще більше зменшити http-запити.

EDIT:
Я знайшов цей блог, який показує, як комбінувати CSS під час виконання, використовуючи лише код. Варто подивитися (хоч я ще цього не перевіряв).

EDIT 2:
Я вирішив використовувати окремі файли під час мого проектування та процес збирання для мінімізації та комбінування. Таким чином, я можу мати окремий (керований) CSS під час розробки та належний монолітний мінімізований файл під час виконання. І в мене ще є свої статичні файли та менше системних накладних витрат, оскільки я не роблю стиснення / мінімізацію під час виконання.

Примітка: для ваших покупців там, я настійно пропоную використовувати bundler як частину вашого процесу збирання. Незалежно від того, що ви будуєте в межах свого IDE або зі скрипту збирання, bundler може виконуватися в Windows через включений exeабо може бути запущений на будь-якій машині, яка вже працює node.js.


Окрім меншої кількості запитів HTTP, чи є якась перевага для одного монолітного файлу? Мій css з часом може змінюватися, але кількість користувачів буде зовсім невеликою, більшість з яких отримує доступ через високошвидкісні з'єднання. Тому я думаю, що перевага декількох файлів буде набагато більшою, ніж менша кількість запитів http ...
Nate

1
менша кількість запитів HTTP - це причина. утримання відвідувачів є пріоритетом №1, тому якщо ваша сторінка завантажується повільно, вони рідше залишаться. Якщо у вас є можливість комбінувати (я бачу, ви використовуєте asp.net), я б дуже рекомендував це робити. Це найкраще з обох світів.
Чейз Флорелл

3
"Тому я думаю, що перевага декількох файлів буде набагато більшою, ніж менша кількість запитів http ..." Ні, ні, ні ... якраз навпаки. При високошвидкісному з'єднанні час, який займає HTTP-запит, є вузьким місцем. Більшість браузерів за замовчуванням завантажують одночасно два файли, тож браузери роблять 2 запити, чекають, швидко завантажують файли css, надсилають ще 2 запити, чекають, завантажують файли швидко. На відміну від одного HTTP-запиту для одного файлу css він швидко завантажується. Комунікація з сервером була б повільною частиною.
Isley Aardvark

1
Ви можете створювати та тестувати функції з окремими таблицями стилів і комбінувати їх в один монго один час створення. Таким чином, ви не підтримуєте один файл mongo, але багато менших файлів. Ми робимо це, а також стискаємо весь пробіл та коментарі, які полегшують людину читання, але не мають сенсу для ваших веб-сторінок.
Повернення коштів не повернено,

2
Ця відповідь могла б бути оновлена ​​зараз, коли http2 зменшує перевагу меншої кількості запитів.
ДД.

33

Я віддаю перевагу декілька файлів CSS під час розробки. Керування та налагодження набагато простіше. Однак я пропоную прийти на час розгортання, замість цього ви використовуєте інструмент мінімізації CSS, наприклад YUI Compressor, який об'єднає ваші CSS-файли в один монолітний файл.


@Randy Simon - але що робити, якщо ми завжди редагуємо css безпосередньо на ftp.
Джитендра Вяс

15
Я не знаю вашої настройки, але це не здається мені гарною ідеєю. Ви повинні протестувати зміни, перш ніж їх витісняти.
Ренді Саймон

1
@RandySimon посилання YUI Compressor пошкоджено.
реформоване

16

Ви хочете обох світів.

Вам потрібно кілька CSS-файлів, тому що ваш розум - це страшна річ.

При цьому краще мати один, великий файл.

Рішення полягає в тому, щоб створити механізм, який поєднує кілька файлів в один файл.

Один із прикладів - щось подібне

<link rel="stylesheet" type="text/css" href="allcss.php?files=positions.css,buttons.css,copy.css" />

Потім сценарій allcss.php обробляє об'єднання файлів та їх доставку.

В ідеалі сценарій перевірятиме дати моди для всіх файлів, створює новий композит, якщо будь-який з них змінюється, потім повертає цей композит, а потім перевіряє відповідні заголовки HTTP-модуля, щоб не надсилати зайві CSS.

Це дає вам найкраще з обох світів. Також чудово працює для JS.


7
однак, стиснення / мінімізація часу виконання має системні накладні витрати. Ви повинні зважити плюси і мінуси. Якщо у вас сайт з високим трафіком, це не оптимальне рішення.
Чейз Флорелл

5
@ChaseFlorell - ви просто зробите стиснення / мінімізацію один раз і кешуєте її
Siler

@ Продавець, я знаю, тому я опублікував свою відповідь. stackoverflow.com/a/2336332/124069
Chase Florell

14

Маючи лише один CSS-файл, краще під час завантаження ваших сторінок, оскільки це означає менше HTTP-запитів.

Наявність декількох маленьких файлів CSS означає, що розробку простіше (принаймні, я вважаю так: наявність одного CSS-файлу на модуль вашої програми полегшує роботу) .

Отже, в обох випадках є вагомі причини ...


Рішенням, яке дозволить вам отримати найкращі з обох ідей, було б:

  • Розробка за допомогою декількох невеликих файлів CSS
    • тобто легше розвиватися
  • Щоб процес складання вашої програми був, він "поєднує" ці файли в один
    • Цей процес збирання може також зменшити великий файл, btw
    • Це, очевидно, означає, що у вашій програмі повинні бути деякі елементи конфігурації, які дозволяють їй переходити з «режиму багатофайлів» до «режиму монофайлів».
  • І використовувати у виробництві лише великий файл
    • тобто швидше завантажувати сторінки

Існує також деяке програмне забезпечення, яке поєднує файли CSS під час виконання, а не під час збирання; але робити це під час запуску означає з'їсти трохи більше процесора (і очевидно потрібно трохи кешування меканізму, щоб не повторно генерувати великий файл занадто часто)


13

Історично однією з головних переваг x при наявності одного CSS-файлу є швидкість вигоди при використанні HTTP1.1.

Однак станом на березень 2018 року понад 80% браузерів зараз підтримують HTTP2, що дозволяє браузеру одночасно завантажувати декілька ресурсів, а також можливість попередньо натискати на ресурси. Наявність одного файлу CSS для всіх сторінок означає більший, ніж необхідний, розмір файлу. При належному дизайні я не бачу жодної переваги в цьому, крім його легшого кодування.

Ідеальним дизайном для HTTP2 для найкращої продуктивності буде:

  • Майте основний CSS-файл, який містить загальні стилі, використовувані на всіх сторінках.
  • Майте окремий CSS для сторінки в окремому файлі
  • Використовуйте HTTP2 push CSS, щоб мінімізувати час очікування (cookie можна використовувати для запобігання повторних натискань)
  • За бажанням відокремте верхню частину CSS і натисніть її спочатку та завантажте решту CSS пізніше (корисно для мобільних пристроїв низької пропускної здатності)
  • Ви також можете завантажити CSS для сайту або певних сторінок після завантаження сторінки, якщо ви хочете прискорити завантаження майбутніх сторінок.

1
Це повинно бути прийнятим сучасним виконанням відповіді щодо RE. Деякі інші відповіді застаріли.
SparrwHawk

Якщо ви будуєте SPA (додаток на одній сторінці), тоді я б стверджував, що найкращий дизайн - це зібрати всі свої css та js у два повних файли. "app.js" та "vendor.js" Усі html та стилі компілюються для вбудованого JS у vendor.js Це означає, що "bootstrap.css та bootstrap.js" всі у vendor.js, і це мінімізовано з вихідними картами в " vendor.min.js ". Те ж саме з додатком, за винятком того, що ви використовуєте html для вбудованого транслілера js, так що навіть ваш html-файл додатків є у файлі js. Ви можете розмістити їх на CDN, і браузери будуть кешувати їх. Ви навіть можете компілювати зображення в стилі та в JS.
Райан Манн

12

Монолітні таблиці стилів можуть отримати багато переваг (які описані в інших відповідях), однак залежно від загального розміру документа таблиці стилів ви можете зіткнутися з проблемами в IE. IE має обмеження щодо кількості селекторів, які він прочитає одного файлу . Ліміт - 4096 селекторів. Якщо у вас монолітних таблиць стилів буде більше, ніж цього, ви хочете розділити його. Це обмеження спричиняє лише некрасиву голову в IE.

Це для всіх версій IE.

Дивіться Блог Росса Брунігеса та сторінку MSDN AddRule .


7

Існує підказка, при якій корисно мати більше одного файлу css.

Сайт з 1М + сторінками, про який середній користувач, ймовірно, коли-небудь бачить, скажімо, 5, може мати таблицю стилів з величезними пропорціями, тому намагання зберегти накладні витрати на додатковий запит на завантаження сторінки шляхом масового початкового завантаження помилково економіка.

Розтягніть аргумент до крайньої межі - це як припустити, що має існувати одна велика таблиця стилів для всієї мережі. Явно безглуздо.

Точка накидання буде різною для кожного сайту, хоча тому немає жорсткого і швидкого правила. Це залежатиме від кількості унікальних CSS на сторінці, кількості сторінок та кількості сторінок, з якими середній користувач, можливо, регулярно стикається під час користування сайтом.


Так. Це питання, про яке я прийшов сюди. Усі зосереджені на розвитку та виробництві. Звичайно, ваше середовище розробки може відрізнятися від вашого веб-сайту, але що краще для веб-сайту? Здається, ніхто не вирішує цього питання. Чи знаєте ви якісь ресурси щодо пошуку місця переломної точки?
Домінік П

5

У мене зазвичай є кілька CSS-файлів:

  • "глобальний" файл css для скидання та глобальних стилів
  • "модульні" специфічні файли css для сторінок, які є логічно згрупованими (можливо, кожна сторінка майстра оформлення замовлення чи щось таке)
  • "page" специфічні файли css для переопределення сторінки (або, помістіть це в блок на окремій сторінці)

Я не дуже переймаюся запитами на кілька сторінок для CSS-файлів. Більшість людей мають пристойну пропускну здатність, і я впевнений, що існують інші оптимізації, які мали б набагато більший вплив, ніж поєднання всіх стилів в один монолітний CSS-файл. Компроміс - між швидкістю та ремонтом, і я завжди схиляюся до ремонту. Компессор YUI звучить досить круто, але, можливо, мені доведеться це перевірити.


Це я роблю, і це добре працює для мене. Максимум, ви отримуєте по 3 файли css на кожній сторінці, що цілком розумно
Рікардо Нунес

4

Я віддаю перевагу декілька файлів CSS. Таким чином, легше поміняти "шкурки" на та вгору, як захочете. Проблема одного монолітного файлу полягає в тому, що він може вийти з-під контролю і важко керувати. Що робити, якщо ви хочете синіх фонів, але не хочете, щоб кнопки змінювалися? Просто змініть файл фонів. І т.д.


проблема полягає в тому, що це досить егоїстично з точки зору розробників. Щойно ви закінчите, вам рідко доводиться повертатися, але всім відвідувачам доводиться чекати, поки сторінки завантажують непотрібні файли css. (Те саме стосується Javascript на мій погляд)
Чейз Флорелл

3
@rockin: Перевіряючи один з моїх 5-CSS-файлових сайтів після очищення кешу, я виявив, що загальний час, необхідний для завантаження всіх CSS, становив менше 10-ї секунди. Якщо люди не можуть так довго чекати, я думаю, що їм потрібно більше Ritalin чи щось. Набагато більша проблема - це зворотні дзвінки на сайти з рекламою, як подвійне клацання тощо, що може призвести до величезних затримок, про що свідчили на цьому самому сайті протягом минулого тижня.
Robusto

Прекрасний інструмент, який використовується для тестування швидкості сайту - Firebug спільно з YSlow. Це має дати точне представлення швидкостей вашого веб-сайту.
Чейз Флорелл

4

Можливо, погляньте на компас , який є рамкою для створення авторських прав з відкритим кодом. Це засновано на Sass, тому він підтримує цікаві речі, такі як змінні, гніздування, міксин та імпорт. Особливо імпорт корисний, якщо ви хочете зберігати окремі менші файли CSS, але об'єднувати їх автоматично в 1 (уникаючи декількох повільних HTTP-дзвінків). Компас Compass додає до цього великий набір заздалегідь визначених комбінацій, які прості в обробці матеріалів між браузерами. Це написано в Ruby, але його можна легко використовувати з будь-якою системою ....


3

ось найкращий спосіб:

  1. створити загальний файл css із усім спільним кодом
  2. вставити весь конкретний код css сторінки на ту саму сторінку, у тег або за допомогою атрибута style = "" для кожної сторінки

таким чином у вас є лише один css з усім спільним кодом та html-сторінкою. до речі (а я знаю, що це не правильна тема), ви також можете кодувати свої зображення в base64 (але ви також можете це зробити з вашими js та css файлами). таким чином ви зменшуєте ще більше запитів http до 1.


2

SASS і МЕНШЕ роблять все це справді суперечливим питанням. Розробник може налаштувати ефективні файли компонентів і при компіляції об'єднати їх усі. У режимі SASS ви можете вимкнути стиснутий режим під час розробки для легшого читання та ввімкнути його знову для виробництва.

http://sass-lang.com http://lesscss.org

Зрештою, єдиний мінімізований файл CSS - це те, що ви хочете, незалежно від методики, якою ви користуєтеся. Менше CSS, менше HTTP запитів, менше попиту на сервері.


1

Перевага одного файлу CSS - ефективність передачі. Кожен запит HTTP означає відповідь заголовка HTTP для кожного запитуваного файлу, і він займає пропускну здатність.

Я обслуговую свій CSS як файл PHP з типом mime "text / css" у заголовку HTTP. Таким чином, я можу мати декілька CSS-файлів на стороні сервера і використовувати PHP включає, щоб перемістити їх в єдиний файл на запит користувача. Кожен сучасний браузер отримує файл .php з кодом CSS і обробляє його як файл .css.


Тож якщо я використовую ASP.NET загальний обробник .ASHX, був би ідеальним шляхом, який поєднує їх у єдиний файл, щоб отримати найкраще з обох світових?
Нейт

Так, я б використовував IHttpHandler, щоб поєднати ваш CSS під час виконання (див. №2 у моїй відповіді вище)
Chase Florell

@Nate: Коли я працював в ASP.Net, ми використовували файли шаблонів, щоб виконати те саме.
Robusto

@Robusto, ви могли б пояснити, що таке файл шаблону? Я не думаю, що я ніколи про це не чув. Я використовував App_Themes, але це все ще не поєднує CSS.
Чейз Флорелл

1
просто як оновлення. Використання IHttpHandler або PHP-файлу для комбінування css на стороні сервера може зберегти пропускну здатність і пришвидшити запити, але це також додасть непотрібне навантаження на сервер. Найкращий спосіб зробити це - комбінувати / мінімізувати свій css / js під час створення / публікації вашого сайту. Таким чином, у вас є один статичний файл, який не потребує жодної серверної обробки. Найкраще з ВСІХ світів, бар НІКОЛИ.
Чейз Флорелл

1

Ви можете просто використовувати один файл css для продуктивності, а потім прокоментувати такі розділи:

/******** Header ************/
//some css here

/******* End Header *********/


/******** Footer ************/
//some css here

/******* End Footer *********/

тощо


4
Це не полегшує підтримку, оскільки мені ще потрібно прокрутити милі непов’язаного css, щоб дістатися до того, що я після ...
Nate

2
@Nate: Ви розглядали можливість переходу до текстового редактора з гідною функцією пошуку? Мої особисті переваги - це один файл css, і я ніколи не прокручую його. Я просто набираю "/ classname" (я використовую похідне vi) та bam - я в цьому класі.
Дейв Шерохман

3
Це також важче підтримувати в середовищі для кількох розробників. Що таке "заголовок" у вашому наведеному вище прикладі? Що робити, якщо хтось ще не мислить географічно, а з точки зору основних елементів дизайну, таких як кнопки чи меню, а інші думають інакше? Куди йде меню, якщо воно знаходиться в заголовку? Як щодо того, якщо його немає? Я думаю, що простіше застосовувати таку дисципліну в окремих файлах. Чому розробники додатків просто не створюють величезний клас додатків із усіма обробками, а не рамку з ієрархією класів? Схоже на мене.
Робусто,

Що робити, якщо ви не пам’ятаєте назву класу, який шукаєте? Або як ви вирішите, куди додати новий клас?
Нейт

Якщо це лише сторінка веб-сайту, це справді не така вже й велика угода. Просто пропоную ще один спосіб робити речі.
Сом

1

Я використовую Jammit для роботи зі своїми файлами css і використовую багато різних файлів для читабельності. Jammit виконує всю брудну роботу з комбінування та стискання файлів перед розгортанням у виробництві. Таким чином, у мене є багато файлів у розробці, але лише один файл у виробництві.


0

Пакет стильових пакетів може зберегти ефективність завантаження сторінки, але чим більше стилів, тим повільніше браузер робить анімацію на сторінці, на якій ви перебуваєте. Це викликано величезною кількістю невикористаних стилів, яка може бути не на сторінці, на якій ви перебуваєте, але браузер все одно повинен обчислити.

Дивіться: https://benfrain.com/css-performance-revisited-selectors-bloat-expensive-styles/

Переваги пакетних стилів: - продуктивність завантаження сторінки

Недоліки пакетних таблиць стилів: - повільніша поведінка, що може спричинити скутості під час прокрутки, інтерактивності, анімації,

Висновок: щоб вирішити обидві проблеми, для виробництва ідеальним рішенням є з’єднати весь CSS в один файл, щоб зберегти на http-запитах, але використовувати JavaScript для витягування з цього файлу, CSS для сторінки, на якій ви перебуваєте, та оновлення голови за допомогою неї. .

Щоб знати, які потрібні спільні компоненти на одній сторінці, і щоб зменшити складність, було б непогано оголосити всі компоненти, якими користується ця конкретна сторінка - наприклад:

<style href="global.css" rel="stylesheet"/>
<body data-shared-css-components="x,y,z">

-1

Я створив системний підхід до розробки CSS. Таким чином я можу використовувати стандарт, який ніколи не змінюється. Спочатку я почав із сітки 960. Тоді я створив поодинокі рядки css для основних макетів, полів, заміток, шрифтів та розмірів. Потім я з'єдную їх за потребою. Це дозволяє мені зберігати послідовний макет у всіх моїх проектах і використовувати ті самі файли css знову і знову. Тому що вони не конкретні. Ось приклад: ---- div class = "c12 bg0 m10 p5 white fl" / div --- Це означає, що контейнер має 12 стовпців поперек, використовує bg0 з полями 10px прокладки 5 текст є білим і він плаває зліва. Я міг би легко змінити це, видаливши або додавши новий - Що я називаю "легким" стилем - Замість створення єдиного класу з усіма цими атрибутами; Я просто поєдную єдині стилі, коли кодую сторінку. Це дозволяє мені створювати будь-яку комбінацію стилів і не обмежує мою творчість чи змушує мене створити величезну кількість подібних стилів. Ваші таблиці стилів стають набагато більш керованими, мінімізованими і дозволяють повторно використовувати його знову і знову. Цей метод я виявив фантастичним для швидкого проектування. Я також більше не розроблюю спочатку PSD, а браузер, що також економить час. Крім того, оскільки я також створив систему імен для моїх фонів та атрибутів дизайну сторінки, я просто змінюю файл зображення при створенні нового проекту. (Bg0 = фон тіла відповідно до моєї системи імен) Це означає, що якщо я раніше мав білий тло одного проекту просто змінить його на чорний просто означає, що на наступному проекті bg0 буде чорним фоном або іншим зображенням .....


12
Чи знаєте ви, для чого призначені абзаци?
Em1,

Це така "UI Framework", як для Bootstrap або інших. Коли ви знаєте лексикон, з яким ви хочете піти, все стосується кривої навчання та прийняття використовуваних термінів. Проте я можу придумати дуже конкретні випадки, коли ваш приклад буде намагатися відповідати вимогам дизайнерів.
аугурон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.