Langsung ke konten
Integration

Optimalkan SVG di pipeline CI Anda dengan REST API (tidak perlu instalasi SVGO)

| 5 min read

Gunakan API pengoptimal SVG botoi untuk mengecilkan SVG yang membengkak dari Figma dan alat desain di dalam GitHub Actions. Satu perintah curl, tidak ada ketergantungan Node.js, file 50-70% lebih kecil.

CI/CD pipeline visualization diagram
Photo by Growtika on Unsplash

Ikon SVG yang diekspor dari Figma berukuran 3-5x lebih besar dari yang seharusnya. Alat desain disematkan metadata, kosong <defs> blok, atribut khusus editor, dan data jalur verbose yang tidak pernah digunakan browser. Ikon 24 piksel yang seharusnya berukuran 800 byte dikirimkan pada 3.200 byte. Kalikan dengan 50 ikon dalam sistem desain dan Anda mengirimkan 120 KB data SVG yang tidak perlu pada setiap pemuatan halaman.

Perbaikan standarnya adalah SVGO, alat Node.js yang menghilangkan pembengkakan ini. Tapi SVGO membawa 30+ ketergantungan npm ke dalam proyek atau lingkungan CI Anda. Jika frontend Anda sudah dibuat dengan Go, Rust, Python, atau HTML biasa, menginstal Node.js dan npm semata-mata untuk memperkecil SVG berlebihan.

API pengoptimal botoi SVG melakukan pekerjaan yang sama dengan satu permintaan HTTP. Tidak ada instalasi, tidak ada ketergantungan, tidak ada konflik versi. Kirim SVG mentah, dapatkan kembali versi yang dioptimalkan dengan metrik ukuran.

Satu perintah curl untuk mengoptimalkan SVG

Kirim string SVG Anda ke /v1/svg/optimize titik akhir:

curl -s -X POST https://api.botoi.com/v1/svg/optimize \\
  -H "Content-Type: application/json" \\
  -d '{
    "svg": "&lt;svg xmlns=\\"http://www.w3.org/2000/svg\\" width=\\"24\\" height=\\"24\\" viewBox=\\"0 0 24 24\\"&gt;&lt;!-- Figma metadata --&gt;&lt;defs&gt;&lt;/defs&gt;&lt;g id=\\"Layer_1\\"&gt;&lt;path d=\\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z\\" fill=\\"#1a73e8\\"/&gt;&lt;/g&gt;&lt;/svg&gt;"
  }'

API mengembalikan SVG yang dioptimalkan bersama dengan data ukuran sebelum/sesudah:

{
  "success": true,
  "data": {
    "optimized": "&lt;svg xmlns=\\"http://www.w3.org/2000/svg\\" width=\\"24\\" height=\\"24\\" viewBox=\\"0 0 24 24\\"&gt;&lt;path d=\\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z\\" fill=\\"#1a73e8\\"/&gt;&lt;/svg&gt;",
    "original_size": 12450,
    "optimized_size": 5180,
    "savings_percent": 58.4
  }
}

Responsnya mencakup jumlah byte SVG asli dan yang dioptimalkan, ditambah persentase disimpan. Gunakan angka-angka ini untuk melacak dampak pengoptimalan di seluruh aset Anda perpustakaan.

Alur kerja Tindakan GitHub untuk pengoptimalan otomatis

Alur kerja ini berjalan pada setiap permintaan tarik yang mengubah file SVG. Ternyata berubah SVG, mengoptimalkan masing-masing melalui API, dan mengembalikan hasilnya ke PR cabang. Peninjau melihat SVG yang dioptimalkan tanpa langkah manual apa pun.

Membuat .github/workflows/optimize-svgs.yml di repositori Anda:

name: Optimize SVGs

on:
  pull_request:
    paths:
      - '**/*.svg'

jobs:
  optimize-svgs:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Find changed SVG files
        id: changed
        run: |
          FILES=\$(git diff --name-only --diff-filter=ACM origin/\${{ github.base_ref }} HEAD -- '*.svg')
          echo "files=\$FILES" >> \$GITHUB_OUTPUT
          echo "Found SVGs: \$FILES"

      - name: Optimize SVGs
        if: steps.changed.outputs.files != ''
        run: |
          TOTAL_SAVED=0
          for FILE in \${{ steps.changed.outputs.files }}; do
            SVG_CONTENT=\$(cat "\$FILE")
            PAYLOAD=\$(jq -n --arg svg "\$SVG_CONTENT" '{"svg": \$svg}')

            RESPONSE=\$(curl -s -X POST https://api.botoi.com/v1/svg/optimize \\
              -H "Content-Type: application/json" \\
              -H "Authorization: Bearer \${{ secrets.BOTOI_API_KEY }}" \\
              -d "\$PAYLOAD")

            SUCCESS=\$(echo "\$RESPONSE" | jq -r '.success')
            if [ "\$SUCCESS" = "true" ]; then
              echo "\$RESPONSE" | jq -r '.data.optimized' > "\$FILE"
              SAVINGS=\$(echo "\$RESPONSE" | jq -r '.data.savings_percent')
              ORIGINAL=\$(echo "\$RESPONSE" | jq -r '.data.original_size')
              OPTIMIZED=\$(echo "\$RESPONSE" | jq -r '.data.optimized_size')
              echo "Optimized \$FILE: \$ORIGINAL -> \$OPTIMIZED bytes (\$SAVINGS% saved)"
              TOTAL_SAVED=\$((TOTAL_SAVED + ORIGINAL - OPTIMIZED))
            else
              echo "::warning::Failed to optimize \$FILE"
            fi
          done
          echo "Total bytes saved: \$TOTAL_SAVED"

      - name: Commit optimized SVGs
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add '*.svg'
          git diff --cached --quiet || git commit -m "chore: optimize SVG assets"
          git push

Alur kerja hanya memproses SVG yang diubah di PR saat ini, dan mempertahankan panggilan API ke minimum. Itu --diff-filter=ACM tangkapan bendera ditambahkan, disalin, dan file yang dimodifikasi sambil melewatkan penghapusan.

Sebelum dan sesudah: perbandingan ukuran dunia nyata

Berikut adalah hasil dari menjalankan API pada SVG yang diekspor dari Figma secara umum kumpulan ikon dan ilustrasi aplikasi web:

Penghematan rata-rata pada file-file ini: 59,4%. Keuntungan terbesar datang dari ilustrasi SVG yang berisi metadata tersemat dan definisi jalur verbose. Ikon masih sederhana lihat pengurangan 55-65% karena Figma mengekspor presisi desimal dan atributnya browser mengabaikan.

Skrip pengoptimalan batch

Untuk penggunaan lokal atau integrasi ke sistem CI lainnya (GitLab CI, CircleCI, Jenkins), skrip shell ini mengoptimalkan setiap SVG dalam direktori:

Jalankan di direktori aset Anda:

chmod +x optimize-svgs.sh
./optimize-svgs.sh src/assets/icons

Atur BOTOI_API_KEY variabel lingkungan untuk melewati anonim batas kecepatan 5 permintaan per menit. Tanpa kunci, skrip akan berhenti sejenak permintaan untuk tetap di bawah batas.

Alternatif: kait pra-komit

Jika Anda lebih memilih untuk mengoptimalkan SVG sebelum mencapai repositori Anda, gunakan Git kait pra-komitmen. Pendekatan ini menangkap SVG yang membengkak di mesin pengembang bukannya di CI:

Hook hanya memproses SVG yang dipentaskan untuk dikomit, sehingga tidak akan menyentuh file Anda belum berubah. Setiap file yang dioptimalkan dipentaskan ulang secara otomatis.

Apa yang dihapus selama pengoptimalan

API menargetkan data yang tidak memiliki dampak visual pada SVG yang dirender:

  • Metadata penyunting: Figma, Illustrator, dan Sketch menyematkan alat khusus atribut (data-name, sketch:type) yang dilewati browser.
  • Komentar XML: Alat desain menambahkan komentar seperti <!-- Generator: Adobe Illustrator 28.0 --> yang tidak ada gunanya dalam produksi.
  • Grup dan def kosong: SVG yang diekspor berisi kosong <g> Dan <defs> elemen yang tersisa dari lapisan struktur dalam alat desain.
  • Atribut yang berlebihan: Nilai default seperti fill-opacity="1" Dan stroke-miterlimit="4" cocok dengan default browser dan dapat dihapus.
  • Presisi berlebih: Koordinat jalur dengan 8 tempat desimal (12.34567890) dibulatkan menjadi 2 (12.35) tanpa terlihat perbedaan pada resolusi layar.

Kapan mengoptimalkan SVG di tempat lain

Pendekatan API berfungsi paling baik untuk kumpulan ikon, logo, dan ilustrasi UI. Beberapa kasus dimana strategi yang berbeda lebih masuk akal:

  • SVG dengan font tertanam: Jika SVG Anda berisi <text> elemen dengan font khusus, ubah teks menjadi kerangka di alat desain Anda sebelumnya mengoptimalkan. API tidak mengelompokkan atau menyematkan font.
  • SVG animasi: Animasi SMIL dan animasi CSS di dalam SVG adalah dipertahankan, tetapi uji keluarannya untuk memastikan atribut waktu tetap utuh.
  • SVG di atas 2 MB: Ini biasanya berisi gambar raster yang dikodekan base64. Ekstrak file tersebut sebagai file PNG/JPEG terpisah dan rujuk sebagai gantinya.

FAQ

Apakah saya memerlukan kunci API untuk menggunakan titik akhir pengoptimal SVG?
Tidak. API botoi mengizinkan 5 permintaan anonim per menit tanpa kunci. Untuk pipeline CI yang memproses banyak SVG per penerapan, tambahkan kunci API Anda sebagai rahasia GitHub dan teruskan di header Otorisasi untuk menghapus batas kecepatan.
Pengoptimalan apa yang diterapkan API pada SVG?
API menghapus metadata, artefak editor, komentar, grup kosong, dan atribut berlebihan. Ini menciutkan transformasi yang tidak perlu, menggabungkan jalur jika memungkinkan, dan membulatkan nilai numerik. Hasilnya setara dengan menjalankan SVGO dengan preset bawaannya.
Akankah SVG yang dioptimalkan terlihat berbeda dari aslinya?
Tidak. API hanya menghapus data yang tidak memiliki efek visual. Output yang diberikan identik dengan piksel aslinya. Jika SVG menggunakan fitur yang bergantung pada metadata (seperti nama lapisan Illustrator), string tersebut akan dihapus tetapi rendering visualnya tetap sama.
Bisakah saya memproses SVG yang lebih besar dari 1 MB?
API menerima payload SVG hingga 2 MB. Jika SVG Anda lebih besar dari itu, kemungkinan besar berisi gambar raster yang disematkan (PNG atau JPEG yang dikodekan base64 di dalam SVG). Ekstrak gambar-gambar itu sebagai file terpisah dan referensikan dengan tag gambar.
Bagaimana hal ini dibandingkan dengan menginstal SVGO secara lokal?
SVGO memerlukan Node.js dan npm di lingkungan CI Anda, menambahkan 30+ dependensi transitif, dan memerlukan manajemen versi. Pendekatan API adalah perintah curl tunggal tanpa ketergantungan. Trade-off: memerlukan akses jaringan selama CI, sementara SVGO berjalan offline.

Mulai membangun dengan botoi

150+ endpoint API untuk pencarian, pemrosesan teks, pembuatan gambar, dan utilitas developer. Paket gratis, tanpa kartu kredit.