Skip to content

Извлечение ​

UnoCSS работает, выполняя поиск использования утилит в вашей кодовой базе и генерируя соответствующий CSS по требованию. Мы называем этот процесс извлечением.

Источники контента ​

UnoCSS поддерживает извлечение использования утилит из нескольких источников:

  • Конвейер - Извлечение прямо из конвейера инструментов сборки
  • Файловая система - Извлечение из файловой системы путем чтения и отслеживания файлов
  • Встроенный - Извлечение из встроенного простого текста

Использование утилит из разных источников будет объединено и сгенерирует итоговый CSS.

Извлечение из конвейера инструментов сборки ​

Это поддерживается в интеграциях Vite и Webpack.

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

По умолчанию UnoCSS будет извлекать использование утилит из файлов в конвейере сборки с расширениями .jsx, .tsx, .vue, .md, .html, .svelte, .astro, а затем генерировать соответствующий CSS по требованию. Файлы .js и .ts не включаются по умолчанию.

Чтобы настроить их, вы можете обновить uno.config.ts:

ts
export default defineConfig({
  content: {
    pipeline: {
      include: [
        // по умолчанию
        /\.(vue|svelte|[jt]sx|mdx?|astro|elm|php|phtml|html)($|\?)/,
        // включить файлы js/ts
        'src/**/*.{js,ts}',
      ],
      // исключить файлы
      // exclude: []
    },
  },
})

Вы также можете добавить магический комментарий @unocss-include в любом месте файла, чтобы UnoCSS его просканировал. Если вам нужно сканировать файлы *.js или *.ts, добавьте их в конфигурацию, чтобы включить все js/ts файлы в цели сканирования.

ts
// ./some-utils.js

// поскольку `.js` файлы не включены по умолчанию,
// следующий комментарий указывает UnoCSS принудительно просканировать этот файл.
// @unocss-include
export const classes = {
  active: 'bg-primary text-white',
  inactive: 'bg-gray-200 text-gray-500',
}

Аналогично, вы можете добавить @unocss-ignore, чтобы пропустить сканирование и преобразование для всего файла.

Если вы хотите, чтобы UnoCSS пропустил блок кода без извлечения в любых извлекаемых файлах, вы можете использовать пары @unocss-skip-start @unocss-skip-end. Обратите внимание, что они должны использоваться парами, чтобы быть эффективными.

html
<p class="text-green text-xl">Green Large</p>

<!-- @unocss-skip-start -->
<!-- `text-red` не будет извлечен -->
<p class="text-red">Red</p>
<!-- @unocss-skip-end -->

Извлечение из файловой системы ​

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

ts
export default defineConfig({
  content: {
    filesystem: [
      'src/**/*.php',
      'public/*.html',
    ],
  },
})

Сопоставленные файлы будут прочитаны напрямую из файловой системы и отслеживаться на изменения в режиме разработки.

Извлечение из встроенного текста ​

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

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

ts
export default defineConfig({
  content: {
    inline: [
      // простой текст
      '<div class="p-4 text-red">Some text</div>',
      // асинхронный получатель
      async () => {
        const response = await fetch('https://example.com')
        return response.text()
      },
    ],
  },
})

Ограничения ​

Поскольку UnoCSS работает во время сборки, это означает, что будут сгенерированы и отправлены в ваше приложение только статически представленные утилиты. Утилиты, используемые динамически или загруженные из внешних ресурсов во время выполнения, МОГУТ НЕ быть обнаружены или применены.

Список безопасности ​

Иногда вы можете захотеть использовать динамические конкатенации, например:

html
<div class="p-${size}"></div>
<!-- это не сработает! -->

Из-за того, что UnoCSS работает во время сборки с использованием статического извлечения, во время компиляции невозможно знать все комбинации утилит. Для этого вы можете настроить опцию safelist.

ts
safelist: 'p-1 p-2 p-3 p-4'.split(' ')

Соответствующий CSS всегда будет сгенерирован:

css
.p-1 { padding: 0.25rem; }
.p-2 { padding: 0.5rem; }
.p-3 { padding: 0.75rem; }
.p-4 { padding: 1rem; }

Или более гибко:

ts
safelist: [
  ...Array.from({ length: 4 }, (_, i) => `p-${i + 1}`),
]

Если вы ищете истинную динамическую генерацию во время выполнения, вам может пригодиться пакет @unocss/runtime.

Статические комбинации списков ​

Другой способ обойти ограничение динамически сконструированных утилит - использовать объект, который статически перечисляет все комбинации. Например, если вы хотите сделать так:

html
<div class="text-${color} border-${color}"></div>
<!-- это не сработает! -->

Вы можете создать объект, перечисляющий все комбинации (предполагая, что вы знаете все возможные значения color, которые хотите использовать)

ts
// Поскольку они статические, UnoCSS сможет извлечь их во время сборки
const classes = {
  red: 'text-red border-red',
  green: 'text-green border-green',
  blue: 'text-blue border-blue',
}

И затем использовать его в шаблоне:

html
<div class="${classes[color]}"></div>

Список блокировки ​

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

ts
blocklist: [
  'p-1',
  /^p-[2-4]$/,
]

Это исключит генерацию p-1, p-2, p-3, p-4.

Released under the MIT License.