Сокращение и объединение файлов в .net - PullRequest
21 голосов
/ 02 декабря 2010

Я смотрю на реализацию оптимизации производительности моего javascript / css.В частности, для достижения минимизации и объединения таких.Я занимаюсь разработкой веб-приложений .net / c #.

У меня есть пара вариантов, и я ищу отзывы по каждому из них:

Первый - это умный инструмент, с которым я столкнулся в Chirpy, который через Visual Studioобъединяет, минимизирует и т. д. -> http://chirpy.codeplex.com/ Это визуальное дополнение студии, но, поскольку я нахожусь в командной среде, этот инструмент не идеален.

Мой следующий вариант - использовать задачу Msbuild (http://yuicompressor.codeplex.com/), чтобы минимизировать файлы и также объединить их (возможно, прочитать из файла XML, что нужно объединить). Хотя это работает для минимизации штрафа, у меня есть проблема, что мне придется поддерживать то, что должно быть объединено, чтоможет быть головной болью.

3-й вариант - использовать задачу msbuild только для минимизации, а во время выполнения с использованием некоторых вспомогательных классов объединять файлы на каждой странице. Это объединяет файлы, дает ему имя идобавить версию к нему.

Любые другие варианты, которые я мог бы рассмотреть? Меня беспокоит последний вариант, что он может иметь проблемы с производительностью, как я должен открытьФайл с локального диска, прочитайте его содержимое и затем объедините файлы.Это много обработки во время выполнения.Я смотрел на что-то вроде Squishit - https://github.com/jetheredge/SquishIt/downloads Это минимизирует файлы во время выполнения, но я бы посмотрел на это во время компиляции.

Так что любые отзывы о моих подходах были бы хороши?Если третий вариант не вызовет проблем с производительностью, я веду к этому.

Ответы [ 7 ]

11 голосов
/ 02 декабря 2010

Мы сделали нечто похожее с несколькими веб-приложениями ASP.NET. В частности, мы используем компрессор Yahoo Yui , который имеет версию библиотеки .NET, на которую вы можете ссылаться в своих приложениях.

Подход, который мы выбрали, заключался в том, чтобы генерировать необходимые объединенные / минимизированные файлы во время выполнения. Мы включили всю эту логику в элемент управления ASP.NET, но это не обязательно в зависимости от вашего проекта.

  • При первом обращении к странице мы обрабатываем список включенных файлов JS и CSS. В отдельном потоке (поэтому исходный запрос возвращается без задержки) мы затем объединили включенные файлы (1 для JS, 1 для CSS) и затем применили компрессор Yui.
  • Затем результат записывается на диск для быстрой ссылки в будущем
  • При последующих запросах страница сначала ищет минимизированные версии. Если найден, он просто подает их. Если нет, то он снова проходит процесс.

Как глазурь к пирогу:

  • Для целей отладки, если присутствует строка запроса? Debug = true, объединенные / минимизированные ресурсы игнорируются, и вместо них обслуживаются оригинальные отдельные файлы (поскольку отладка оптимизированного JS может быть затруднена)

Мы обнаружили, что этот процесс работает исключительно хорошо. Мы встроили его в библиотеку, чтобы все наши сайты ASP.NET могли воспользоваться. Сценарии после сборки могут усложниться, если каждая страница имеет разные зависимости, но время выполнения может определить это довольно легко. И, если кому-то нужно быстро исправить файл CSS, он может это сделать, удалить объединенные версии файла, и процесс автоматически запустится заново без необходимости выполнять обработку после сборки с помощью MSBuild или NAnt.

7 голосов
/ 20 ноября 2011

RequestReduce предоставляет действительно хорошее решение для объединения и минимизации JavaScript и CSS во время выполнения.Он также попытается спрайтовать ваши фоновые изображения.Он кэширует обработанные файлы и обслуживает их с помощью пользовательских ETag и далёких будущих заголовков. RequestReduce использует фильтр ответов для преобразования содержимого, поэтому для базовой функциональности не требуется код или конфигурация.Его можно настроить для работы в среде веб-фермы и синхронизации контента на нескольких серверах, а также настроить для указания на CDN.Его можно загрузить по адресу http://www.RequestReduce.com или из Visual Studio через Nuget.Источник доступен по адресу https://github.com/mwrock/RequestReduce.

4 голосов
/ 28 февраля 2011

Вы слышали о Combres? перейдите по адресу: http://combres.codeplex.com и проверьте его

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

если вы используете VS2010, вы можете легко установить его на свой проект, используя NuGet вот ссылка Combres NuGet: http://combres.codeplex.com/wikipage?title=5-Minute%20Quick%20Start

2 голосов
/ 22 октября 2011

Microsoft Ajax minifier удивительно хорош в качестве инструмента минификации.Я написал сообщение в блоге о комбинировании файлов и использовании их минификатора в обработчике javascript и таблицы стилей:

http://www.markistaylor.com/javascript-concatenating-and-minifying/

2 голосов
/ 02 декабря 2010

Пару лет назад я сделал действительно хорошее решение, но у меня нет источника.Решение было для веб-форм, но оно должно работать нормально, чтобы перенести его в MVC.Я попытаюсь объяснить, что я сделал, на каком-то простом шаге.Сначала нам нужно зарегистрировать скрипты, и мы написали специальный контроллер, который делал именно это.Когда контроллер рендерился, он делал три вещи:

  1. Свернуть все файлы, я думаю, что мы использовали сжатие YUI
  2. Объединить все файлы и сохранить в виде строки
  3. Рассчитать хеш для строки объединенных файлов и использовать его в качестве виртуального имени файла.Вы сохраняете строку объединенных файлов в кэшированном словаре на сервере со значением хеш-кода в качестве ключа. HTML-код, который отображается, должен указывать на специальную папку, в которой расположены «сценарии».

Следующим шагом является реализация специального HttpHandler, который обрабатывает запрос файлов в специальной папке.Когда делается запрос в эту специальную папку, вы делаете поиск в кэшированном словаре и возвращаете строку в основном.

Одна действительно хорошая особенность этого заключается в том, что возвращаемый скрипт всегда действителен, поэтому пользователю никогда не придетсяпопросить вас обновить скрипт.Причина этого заключается в том, что при внесении изменений в любой из файлов сценария значение хеш-функции будет изменено, и клиент запросит новый сценарий.

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

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

Обновление: Я реализовал решение для MVC и выпустил его на nuget , а источник включен. GitHub .

0 голосов
/ 03 декабря 2013

Мне нужно было решение для объединения / минимизации CSS / JS в веб-приложении .NET 2.0, SquishIt и других инструментах, которые, как я обнаружил, не были совместимы с .NET 2.0, я создал собственное решение, использующее синтаксис, аналогичный SquishIt, но совместим с .NET 2.0. Так как я думал, что другие люди могут найти это полезным, я поместил это на Github. Вы можете найти его здесь: https://github.com/AlliterativeAlice/simpleyui

0 голосов
/ 02 декабря 2010

Стоит объединить файлы во время выполнения, чтобы избежать синхронизации новых версий.Однако, как только они программно объединены, кэшируйте их на диск.Затем код, который запускается при каждой выборке файлов, должен только проверить, что файлы не изменились, прежде чем обслуживать кэшированную версию.

Если они изменились, тогда код сжатия может выполняться как разовый.Хотя производительность будет незначительной, вы также получите выигрыш в производительности благодаря меньшему количеству запросов к файлам.

Это подход, который инструмент Minify использует для сжатия JS / CSS, который имеетработал очень хорошо для меня.Это только Linux / PHP, но вы можете получить и другие идеи.

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