Skip to content

การแยก (Extracting)

UnoCSS ทำงานโดยการค้นหาการใช้งาน utilities จาก codebase ของคุณและสร้าง CSS ที่สอดคล้องกันแบบ on-demand เราเรียกกระบวนการนี้ว่า extracting

แหล่งที่มาของเนื้อหา

UnoCSS รองรับการแยกการใช้งาน utilities จากหลายแหล่ง:

  • Pipeline - แยกโดยตรงจาก pipeline ของเครื่องมือสร้างของคุณ
  • Filesystem - แยกจาก filesystem ของคุณโดยการอ่านและเฝ้าดูไฟล์
  • Inline - แยกจากข้อความ plain text แบบ inline

การใช้งาน utilities ที่มาจากแหล่งต่างๆ จะถูกรวมเข้าด้วยกันและสร้าง CSS สุดท้าย

การแยกจาก Build Tools Pipeline

นี่ได้รับการสนับสนุนในการผสานรวม Vite และ Webpack

UnoCSS จะอ่านเนื้อหาที่ผ่าน pipeline ของเครื่องมือสร้างของคุณและแยกการใช้งาน utilities จากมัน นี่เป็นวิธีที่มีประสิทธิภาพและแม่นยำที่สุดในการแยก เนื่องจากเราแยกเฉพาะการใช้งานที่ถูกใช้จริงในแอปของคุณอย่างชาญฉลาดโดยไม่มีการทำ I/O ไฟล์เพิ่มเติมในระหว่างการแยก

โดยค่าเริ่มต้น UnoCSS จะแยกการใช้งาน utilities จากไฟล์ใน pipeline การสร้างของคุณด้วยนามสกุล .jsx, .tsx, .vue, .md, .html, .svelte, .astro และสร้าง CSS ที่เหมาะสมแบบ on demand ไฟล์ .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: []
    },
  },
})

คุณยังสามารถเพิ่มคอมเมนต์ magic @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 -->

การแยกจาก Filesystem

ในกรณีที่คุณใช้การผสานรวมที่ไม่มีการเข้าถึง pipeline ของเครื่องมือสร้าง (ตัวอย่างเช่น PostCSS plugin) หรือคุณกำลังผสานรวมกับเฟรมเวิร์ก backend เพื่อให้โค้ดไม่ผ่าน pipeline คุณสามารถระบุไฟล์ที่จะแยกได้ด้วยตนเอง

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

ไฟล์ที่ตรงกันจะถูกอ่านโดยตรงจาก filesystem และเฝ้าดูการเปลี่ยนแปลงในโหมด dev

การแยกจาก Inline Text

นอกจากนี้ คุณยังสามารถแยกการใช้งาน utilities จากข้อความ inline ที่คุณอาจดึงมาจากที่อื่นได้

คุณยังสามารถส่งฟังก์ชัน async เพื่อส่งคืนเนื้อหาได้ แต่โปรดทราบว่าฟังก์ชันจะถูกเรียกเพียงครั้งเดียวในเวลาสร้าง

ts
export default defineConfig({
  content: {
    inline: [
      // ข้อความ plain
      '<div class="p-4 text-red">Some text</div>',
      // async getter
      async () => {
        const response = await fetch('https://example.com')
        return response.text()
      },
    ],
  },
})

ข้อจำกัด

เนื่องจาก UnoCSS ทำงาน ในเวลาสร้าง ซึ่งหมายความว่ามีเฉพาะ utilities ที่แสดงแบบ static เท่านั้นที่จะถูกสร้างและส่งไปยังแอปของคุณ Utilities ที่ใช้แบบไดนามิกหรือดึงมาจากแหล่งภายนอกในเวลารันไทม์อาจ ไม่ ถูกตรวจพบหรือนำไปใช้

Safelist

บางครั้งคุณอาจต้องการใช้การต่อข้อความแบบไดนามิก เช่น:

html
<div class="p-${size}"></div>
<!-- นี่จะไม่ทำงาน! -->

เนื่องจาก UnoCSS ทำงานในเวลาสร้างโดยใช้การแยกแบบ static ในเวลาคอมไพล์ มันไม่สามารถรู้ทุกการรวมกันของ utilities ได้ สำหรับสิ่งนั้น คุณสามารถกำหนดค่าตัวเลือก 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

การรวมกันแบบรายการ Static

วิธีอื่นในการแก้ไขข้อจำกัดของ utilities ที่สร้างแบบไดนามิกคือคุณสามารถใช้อ็อบเจกต์ที่แสดงรายการการรวมกันทั้งหมด แบบ static ตัวอย่างเช่น หากคุณต้องการมีสิ่งนี้:

html
<div class="text-${color} border-${color}"></div>
<!-- นี่จะไม่ทำงาน! -->

คุณสามารถสร้างอ็อบเจกต์ที่แสดงรายการการรวมกันทั้งหมด (สมมติว่าคุณรู้ค่าที่เป็นไปได้ทั้งหมดของ color ที่คุณต้องการใช้)

ts
// เนื่องจากพวกมันเป็นแบบ static UnoCSS จะสามารถแยกพวกมันได้ในเวลาสร้าง
const classes = {
  red: 'text-red border-red',
  green: 'text-green border-green',
  blue: 'text-blue border-blue',
}

และจากนั้นใช้มันในเทมเพลตของคุณ:

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

Blocklist

คล้ายกับ safelist คุณยังสามารถกำหนดค่า blocklist เพื่อยกเว้น utilities บางตัวจากการสร้าง นี่มีประโยชน์ในการยกเว้น false positives ของการแยก แตกต่างจาก safelist blocklist ยอมรับทั้งสตริงสำหรับการจับคู่ที่แน่นอนและ regular expression สำหรับการจับคู่รูปแบบ

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

นี่จะยกเว้น p-1 และ p-2, p-3, p-4 จากการสร้าง

Released under the MIT License.