Объединение и сокращение нескольких файлов CSS / JS

Я пытаюсь оптимизировать производительность сайта путем объединения и сжатия файлов CSS и JS. Мой вопрос больше о (конкретных) шагах, как этого добиться, учитывая реальную ситуацию, с которой я столкнулся (впрочем, это должно быть типично и для других разработчиков).

Моя страница ссылается на несколько файлов CSS и JS, например:

<!--
  It's easier to work on smaller files during development.
  Hence, the multiple CSS and JS files.
-->
<link type="text/css" rel="stylesheet" href="/css/main.css" />
<link type="text/css" rel="stylesheet" href="/css/secondary-1.css" />
<link type="text/css" rel="stylesheet" href="/css/secondary-2.css" />

<script type="text/javascript" src="/scripts/js/main.js"></script>
<script type="text/javascript" src="/scripts/js/adapter/adapter.js"></script>
<script type="text/javascript" src="/scripts/js/adapter/title-adapter.js"></script>

Для производственной версии я хотел бы объединить 3 файла CSS в один и минимизировать его, например, YUI Compressor. Но тогда мне нужно будет обновить все страницы, которым нужны эти 3 файла, чтобы они ссылались на недавно уменьшенный CSS. Это кажется подверженным ошибкам (например, вы удаляете и добавляете несколько строк во многих файлах). Любой другой менее рискованный подход? Та же проблема для файлов JS.


person moey    schedule 15.02.2012    source источник
comment
Я надеюсь, что они представят что-то подобное в новом материале asp.net 4.5, чтобы в «отладке» скрипты отображались индивидуально и не минифицировались, но в «выпуске» они объединялись и уменьшались.   -  person Daniel Powell    schedule 15.02.2012


Ответы (12)


Ознакомьтесь с minify - он позволяет объединять несколько файлов js, css в один, просто складывая их в URL-адрес, например

<script src="/scripts/js/main.js,/scripts/js/adapter/adapter.js"></script>

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

person Noodles    schedule 15.02.2012
comment
Привет, лапша, у меня это не работает. Это дает мне 404 для этого скрипта src. я использовал - ‹скрипт src = test.com /script1.js,http://test.com/script2.js› - person Heemanshu Bhalla; 10.08.2018

Я считаю, что YUI Compressor лучший из существующих. Он минимизирует JS и CSS и даже удаляет те console.log операторы, которые люди используют для низкоуровневой отладки JavaScript.

Узнайте, насколько это просто.

Если вы используете svn / git, вы можете запустить его в задаче ant и, следовательно, включить его в свои обработчики post / pre-commit.

ОБНОВЛЕНИЕ. В настоящее время я использую grunt с элементами concat, minify и uglify. Вы можете использовать его с наблюдателем, чтобы он создавал новые миниатюрные файлы в фоновом режиме всякий раз, когда вы меняете источник. Uglify contrib не только удаляет журналы консоли, но также удаляет неиспользуемые функции и свойства.

См. это руководство для краткого обзора.

ОБНОВЛЕНИЕ. В настоящее время люди отступают от grunt и его предшественника «gulp» и используют npm в качестве инструмента сборки. Прочтите об этом здесь.

ОБНОВЛЕНИЕ. Итак, теперь люди используют yarn для запуска npm. Неудивительно; пряжа значок - кошка. Большинство современных фреймворков используют webpack для объединения ресурсов в пакеты, которые затем также заботятся о минификация.

person Andresch Serj    schedule 21.02.2012
comment
по ссылке выше На данный момент он не поддерживает сворачивание файлов CSS, хотя это функция YUI Compressor. - person Songo; 28.08.2013
comment
На веб-сайте YUI Compressor написано: YUI Compressor также может сжимать файлы CSS с помощью порта минификатора CSS на основе регулярных выражений Исаака Шлютера. Также: yui.github.io/yuicompressor/css.html. - person Andresch Serj; 02.09.2013
comment
Отличная история решений для рабочих процессов, и с нетерпением ждем следующего обновления! - person gdbj; 18.12.2016
comment
ЛЮБОЕ ОБНОВЛЕНИЕ? Чем люди сейчас занимаются? - person Xsmael; 26.06.2019
comment
@Xsmael: я добавил более актуальное обновление - person Andresch Serj; 27.06.2019

Мне нужно обновить все страницы, которым нужны эти 3 файла, чтобы они ссылались на только что уменьшенный CSS.

Во-первых, я бы сказал, что у вас должен быть общий заголовок. Таким образом, нет необходимости постоянно менять все заголовки, когда это необходимо. Хорошая практика - иметь один заголовок или 2-3. Так что по мере необходимости вы можете изменить заголовок. Так что всякий раз, когда вы захотите расширить свое веб-приложение, это будет менее рискованно и утомительно.

Вы не упомянули свои среды разработки. Вы можете видеть, что есть множество инструментов сжатия, перечисленных для разных сред. И вы используете хороший инструмент, то есть YUI Compressor.

person Somnath Muluk    schedule 27.02.2012

В итоге я использовал CodeKit для объединения моих файлов CSS и JS. Функция, которую я считаю действительно полезной, - это возможность выполнять конкатенацию при сохранении файла; потому что он отслеживает соответствующие ресурсы CSS / JS. Как только я их правильно скомбинировал, например к 1 файлам CSS и 1 JS, все остальные файлы просто могут ссылаться на эти 2.

Вы даже можете попросить CodeKit выполнить минификацию / сжатие на лету.

Отказ от ответственности: я никоим образом не связан с CodeKit. Я случайно нашел его в Интернете, и он послужил отличным инструментом в моем процессе разработки. Он также поставляется с хорошими обновлениями, так как я впервые использовал его более года назад.

person moey    schedule 27.02.2013
comment
это только для Mac ... Что такое Windows ?? - person Gaurav Aggarwal; 08.03.2016
comment
Я использую CodeKit, и мне он нравится ... за исключением того, что перенос проекта в новую ветку с помощью git убивает мои конкатенации js. Собираюсь начать использовать npm. - person gdbj; 18.12.2016

Совет для пользователей Windows, если вы хотите только объединить файлы:

Откройте cmd в желаемом месте и просто перенаправьте свои файлы в файл, используя "тип".

ex:

type .\scripts\*.js >> .\combined.js

Если порядок ваших скриптов важен, вы должны явно ввести файлы в желаемом порядке.

Я использую this в файле bat для моих проектов angular / bootstrap

del combos.js

type .\lib\jquery.min.js >> .\combos.js
type .\lib\bootstrap.min.js >> .\combos.js
type .\lib\Angular\angular.min.js >> .\combos.js
type .\lib\Angular\angular-route.min.js >> .\combos.js
type .\lib\Angular\angular-sanitize.min.js >> .\combos.js

type .\app.js >> .\combos.js
type .\services\*.js >> .\combos.js
type .\controllers\*.js >> .\combos.js
person mpx    schedule 01.04.2016
comment
Самый простой метод / концепция, который я нашел, должен работать идеально, даже если я использую совсем другой язык. Моя идея сейчас состоит в том, чтобы превратить его в своего рода файл кеша и вызвать к нему страницу. Спасибо. - person jacktrader; 21.06.2017

На улице 2015 год, и мне проще всего использовать gulp - http://gulpjs.com/. Уменьшить код с помощью gulp-uglify для js-скриптов и gulp-minify-css для css очень просто. Gulp определенно стоит попробовать

person igolkotek    schedule 01.02.2015

Я не вижу, чтобы вы упоминали систему управления контентом (Wordpress, Joomla, Drupal и т. Д.), Но если вы используете какую-либо популярную CMS, у всех них есть плагины / модули (также бесплатные), которые минимизируют и кэшируют ваши css и js.

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

Раньше я пытался поддерживать эти файлы вручную, и это всегда превращалось в кошмар обслуживания. Удачи, надеюсь, это помогло.

person RachelD    schedule 27.02.2012

Для людей, которым нужно что-то более легкое и гибкое, я создал сегодня js.sh, чтобы решить эту проблему. проблема. Это простой инструмент командной строки, ориентированный на файлы JS, который можно легко изменить для обработки файлов CSS. Преимущества:

  • Легко настраивается для использования несколькими разработчиками в проекте
  • Объединяет файлы JS в порядке, указанном в script_order.txt
  • Сжимает их с помощью компилятора Google Closure
  • По возможности разбивает JS на блоки по 25 КБ, поскольку iPhone не кэширует ничего больше 25 КБ.
  • Создает небольшой файл PHP с тегами <script>, которые вы можете включить, где это необходимо.
  • Использование: js.sh -u yourname

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

person Ben Y    schedule 07.09.2013

Первый шаг оптимизации - минимизация файлов. (Я настоятельно рекомендую GULP для минимизации и оптимизации. Простое решение для просмотра, установки и всех файлов сжимаются сразу. Поддерживает все CSS, JS, less, sass и т. д.)

ИЛИ Старое школьное решение:

1) Как правило, в качестве процесса оптимизации для оптимизации производительности сайта попробуйте объединить весь CSS в один файл и сжать файл, используя Компас. Таким образом, ваши многочисленные запросы к статическому CSS будут заменены одним.

2) Проблема с несколькими JS, которую вы можете решить с помощью CDN (или размещенных библиотек Google), чтобы запросы отправлялись на другой сервер, а не ваш. Таким образом, сервер не ждет завершения предыдущего запроса перед отправкой следующего.

3) Если у вас есть собственный локально сохраненный JavaScript, минимизируйте каждый файл с помощью подключаемого модуля Brackets "Сжатие JavaScript". По сути, сжатие JavsScript выполняется одним щелчком мыши. Brackets - это бесплатный редактор, созданный для CSS и JS, но его можно использовать для PHP и другие языки. Существует множество плагинов, предназначенных как для интерфейсных, так и для серверных разработчиков. В общем, все эти (пока несколько) команды выполняются "одним щелчком". Кстати, скобки заменили мой очень дорогой Dreamweaver;)

3) Попробуйте использовать такие инструменты, как Sass, Compass, less, чтобы минимизировать CSS.

Примечание. Даже без использования SASS или переменных, ваш CSS будет сжат (просто просто используйте чистый CSS и команда Compass "смотреть" сожмет его за вас).

Надеюсь, это поможет!

person StefaDesign    schedule 26.09.2014

Если вы выполняете какую-либо предварительную обработку файлов, которые вы обслуживаете, вы, вероятно, захотите настроить правильную систему сборки (например, Makefile). Таким образом, у вас есть исходные файлы без дублирования, и всякий раз, когда вы вносите изменения, вы запускаете make, и он обновляет все автоматически сгенерированные файлы. Если система сборки уже существует, узнайте, как она работает, и используйте ее. Если нет, вам нужно добавить его.

Итак, сначала выясните, как объединить и минимизировать ваши файлы из командной строки (это описано в документации YUICompressor). Назначьте каталог для автоматически сгенерированного материала, отдельный от материала, над которым вы работаете, но доступный для веб-сервера, и выводите его туда, например, gen / scripts / Combined.js. Поместите команды, которые вы использовали, в Makefile и повторно запускайте make каждый раз, когда вы внесли изменения и хотите, чтобы они вступили в силу. Затем обновите заголовки в других файлах, чтобы они указывали на объединенные и уменьшенные файлы.

person jimrandomh    schedule 27.02.2012

В моем проекте на Symfony я делаю что-то вроде этого

{# layout.html.twig #}

{% block styles %}
    {% if app.environment == 'prod' %}
        <link href="{{ asset('bundles/appmain/min.css') }}" rel="stylesheet" type="text/css" />
    {% else %}
        <link href="{{ asset('bundles/appmain/hello.css') }}" rel="stylesheet" type="text/css" />
        <link href="{{ asset('bundles/appmain/world.css') }}" rel="stylesheet" type="text/css" />
    {% endif %}
{% endblock %}
{# some-view.html.twig #}

{% extends 'AppMainBundle::layout.html.twig' %}

{% block styles %}
    {{ parent() }}

    {% if app.environment != 'prod' %}
        <link href="{{ asset('bundles/appsecond/styles.css') }}" rel="stylesheet" type="text/css" />
    {% else %}
{% endblock %}

Когда версия для разработчиков готова к производству, я использую этот сценарий, чтобы объединить все файлы css и заменить содержимое min.css.

Но это решение работает только в том случае, если одни и те же файлы css включены на все страницы.

person moldcraft    schedule 25.01.2015

Вы можете использовать узел узла cssmin, созданный на основе известного компрессора YUI.

$ npm -g i cosmic # install

# Usage   
var puts = require('util').puts,
fs = require('fs'),
cssmin = require('./cssmin');
var css = fs.readFileSync("/Any/Random/CSS/File.css", encoding='utf8');
var min = cssmin(css);
puts(min);
person sdc    schedule 29.01.2016