Skip to content

Safelist

Safelist 是 UnoCSS 配置中的一个重要选项,允许你指定一组实用类,这些类无论在你的源代码中是否被检测到,都应始终包含在生成的 CSS 中。

基本用法

字符串数组

最简单的用法是提供一个包含你想保留的类名的字符串数组:

ts
// uno.config.ts
export default defineConfig({
  safelist: [
    'p-1',
    'p-2',
    'p-3',
    'text-center',
    'bg-red-500'
  ]
})

函数形式

Safelist 也可以包含在构建时调用的函数,这些函数能够动态返回类名:

ts
// uno.config.ts
export default defineConfig({
  safelist: [
    // 静态类名
    'p-1',
    'p-2',
    // 动态函数
    context => ['m-1', 'm-2', 'm-3'],
    (context) => {
      // 基于主题生成类名
      const colors = Object.keys(context.theme.colors || {})
      return colors.map(color => `bg-${color}-500`)
    }
  ]
})

混合使用

你可以在同一个 safelist 配置中混合使用字符串和函数:

ts
// uno.config.ts
export default defineConfig({
  safelist: [
    // 静态类名
    'prose',
    'bg-orange-300',
    // 动态生成
    () => ['flex', 'grid', 'block'],
    // 条件动态生成
    (context) => {
      if (process.env.NODE_ENV === 'development') {
        return ['debug-border', 'debug-grid']
      }
      return []
    }
  ]
})

返回值类型

Safelist 函数可以返回以下类型的值:

  • Arrayable<string> - 字符串或字符串数组
ts
safelist: [
  // 返回字符串数组
  () => ['class1', 'class2', 'class3'],

  // 返回单个字符串
  () => 'single-class',

  // 返回嵌套数组(会被拍平)
  () => [['nested1', 'nested2'], 'normal3']
]

实际应用场景

动态生成的类名

当你有动态生成的类名,可能无法被静态分析检测到时:

ts
safelist: [
  // 动态颜色类
  () => {
    const dynamicColors = ['primary', 'secondary', 'accent']
    return dynamicColors.flatMap(color => [
      `bg-${color}`,
      `text-${color}`,
      `border-${color}`
    ])
  },

  // 动态尺寸类
  () => {
    return Array.from({ length: 12 }, (_, i) => `gap-${i + 1}`)
  }
]

第三方组件库支持

为第三方组件库提供必要的类名:

ts
safelist: [
  // 组件库保留类名
  'prose',
  'prose-sm',
  'prose-lg',

  // 动态生成组件变体
  () => {
    const variants = ['primary', 'secondary', 'danger', 'success']
    const sizes = ['sm', 'md', 'lg']

    return variants.flatMap(variant =>
      sizes.map(size => `btn-${variant}-${size}`)
    )
  }
]

与其他配置的关系

与 blocklist 的区别

  • safelist: 确保指定的类名始终被包含
  • blocklist: 确保指定的类名始终被排除
ts
export default defineConfig({
  safelist: ['always-include'],
  blocklist: ['never-include']
})

与生成选项的关系

生成 CSS 时,可以通过 GenerateOptions 控制是否包含 safelist:

ts
const { css } = await uno.generate('', {
  safelist: true // 包含来自 safelist 的类名
})