Generator Situs, framework, dan CMS

Pelajari cara CMS seperti WordPress dan generator situs lainnya dapat mempermudah penggunaan gambar yang responsif.

Memang terdapat peningkatan dibandingkan menyimpan potongan alternatif setiap gambar secara manual dan mengoptimalkannya secara manual melalui alat seperti Squoosh.app, tetapi mengotomatiskan kompresi gambar sebagai langkah dalam proses pengembangan memiliki beberapa keterbatasan. Alasannya, Anda mungkin tidak selalu memiliki kontrol penuh atas gambar yang digunakan di seluruh situs—sebagian besar gambar yang ditampilkan kepada pengguna di web lebih memperhatikan konten daripada masalah pengembangan, yang diupload oleh pengguna atau editor, bukan berada di repositori bersama aset pengembangan seperti JavaScript dan stylesheet.

Hal ini biasanya memerlukan lebih dari satu proses untuk pengelolaan gambar: tugas tingkat pengembangan untuk aset gambar yang digunakan dalam membangun dan memelihara situs—latar belakang, ikon, logo, dan sebagainya—dan hal lainnya yang berkaitan dengan aset gambar yang dihasilkan melalui penggunaan situs, seperti foto yang disematkan dalam postingan oleh tim editorial, atau avatar yang diupload oleh pengguna. Meskipun konteksnya mungkin berbeda, sasaran akhirnya tetap sama: encoding dan kompresi otomatis berdasarkan setelan yang ditentukan oleh tim pengembangan.

Untungnya, library pemrosesan gambar yang telah Anda pahami dari alur kerja pengembangan lokal dapat digunakan dalam sejumlah konteks. Dan meskipun tidak ada satu pendekatan yang cocok untuk semua kondisi markup gambar responsif Anda, sistem ini menyediakan default yang logis, opsi konfigurasi, dan hook API untuk memudahkan implementasinya.

Generator Situs Statis

Dibandingkan dengan task-runner, ada beberapa kesamaan dalam cara generator situs statis seperti Jekyll atau Eleventy mendekati gambar. Pengelolaan aset diperlukan untuk menggunakan alat ini guna menghasilkan situs yang siap untuk deployment, termasuk minifikasi CSS, transpilasi, dan pemaketan JavaScript. Seperti yang dapat Anda bayangkan, ini berarti alat ini memungkinkan Anda memproses aset gambar dengan cara yang sama, menggunakan banyak library yang telah Anda pelajari.

Plugin gambar resmi untuk Eleventy menggunakan Sharp untuk memberikan pengubahan ukuran, pembuatan berbagai ukuran sumber, encoding ulang, dan kompresi, seperti beberapa tugas yang telah Anda pelajari di sini.

Tidak seperti task-runner, generator situs statis memiliki insight langsung mengenai konfigurasi dan penggunaan library tersebut, serta markup yang dihasilkan untuk situs produksi—yang berarti generator dapat melakukan lebih banyak hal untuk mengotomatiskan markup gambar responsif kami. Misalnya, saat dipanggil sebagai bagian dari kode singkat untuk menampilkan gambar, plugin ini akan menghasilkan HTML sesuai dengan opsi konfigurasi yang diteruskan ke Sharp.


const Image = require("@11ty/eleventy-img");
module.exports = function(eleventyConfig) {

async function imageShortcode(src, alt, sizes="100vw") {
  let metadata = await Image(src, {
  formats: ["avif", "webp", "jpeg"],
  widths: [1000, 800, 400],
  outputDir: "_dist/img/",
  filenameFormat: function( id, src, width, format, options ) {
      const ext = path.extname( src ),
        name = path.basename( src, ext );

      return `${name}-${width}.${format}`
  }
  });

  let imageAttributes = {
  alt,
  sizes,
  loading: "lazy"
  };

  return Image.generateHTML(metadata, imageAttributes);
}

eleventyConfig.addAsyncShortcode("respimg", imageShortcode);
};

Kode singkat ini kemudian dapat digunakan sebagai pengganti sintaksis gambar default:

{‌% respimg "img/butterfly.jpg", "Alt attribute.", "(min-width: 30em) 800px, 80vw" %}

Jika dikonfigurasi untuk menghasilkan beberapa encoding, seperti di atas, markup yang dihasilkan akan menjadi elemen <picture> yang berisi elemen <source>, atribut type, dan atribut srcset terkait yang sudah terisi sepenuhnya dengan daftar ukuran kandidat yang dihasilkan.

<picture><source type="image/avif" srcset="/img/butterfly-400.avif 400w, /img/butterfly-800.avif 800w, /img/butterfly-1000.avif 1000w" sizes="(min-width: 30em) 800px, 80vw"><source type="image/webp" srcset="/img/butterfly-400.webp 400w, /img/butterfly-800.webp 800w, /img/butterfly-1000.webp 1000w" sizes="(min-width: 30em) 800px, 80vw"><source type="image/jpeg" srcset="/img/butterfly-400.jpeg 400w, /img/butterfly-800.jpeg 800w, /img/butterfly-1000.jpeg 1000w" sizes="(min-width: 30em) 800px, 80vw"><img alt="Alt attribute." loading="lazy" src="/img/butterfly-400.jpeg" width="1000" height="846"></picture>

Tentu saja, plugin ini tidak akan dapat generate atribut sizes yang layak, karena tidak dapat mengetahui ukuran dan posisi akhir gambar dalam tata letak yang dirender, tetapi menerima satu sebagai input saat membuat markup—tugas lain untuk RespImageLint.

Framework

Framework rendering sisi klien akan memerlukan task-runner atau bundler seperti Webpack untuk mengedit, mengenkode, dan mengompresi aset gambar sendiri. Responsive-loader, misalnya, juga menggunakan library Sharp untuk menyimpan ulang aset gambar. Selanjutnya, Anda dapat melakukan import gambar sebagai objek:

  import imageAVIF from 'img/butterfly.jpg?sizes[]=400,sizes[]=800,sizes[]=1000&format=avif';
  import imageWebP from 'img/butterfly.jpg?sizes[]=400,sizes[]=800,sizes[]=1000&format=webp';
  import imageDefault from 'img/butterfly.jpg?sizes[]=400,sizes[]=800,sizes[]=1000';

Gambar yang diimpor ini selanjutnya dapat digunakan melalui abstraksi seperti komponen Image React, atau untuk mengisi markup gambar responsif secara langsung:

<picture>
  <source type='image/avif' srcSet={imageAVIF.srcSet} sizes='…' />
  <source type='image/webp' srcSet={imageWebp.srcSet} sizes='…' />
  <img
    src={imageDefault.src}
    srcSet={imageDefault.srcSet}
    width={imageDefault.width}
    height={imageDefault.height}
    sizes='…'
    loading="lazy"
  />

Framework yang melakukan rendering sisi klien adalah kandidat kuat untuk Lazysizes dan sizes="auto", sehingga memberi Anda gambar responsif yang hampir sepenuhnya otomatis.

Sistem Pengelolaan Konten

WordPress adalah salah satu pengguna paling awal dari markup gambar responsif native, dan API ini telah ditingkatkan secara bertahap sejak diperkenalkan di WordPress 4.4 dengan dukungan untuk WebP dan kontrol atas jenis mime output. Inti WordPress didesain untuk menggunakan ekstensi PHP ImageMagick (atau, jika tidak, library GD).

Saat gambar diupload melalui antarmuka admin WordPress, gambar sumber tersebut digunakan untuk menghasilkan file yang ditampilkan kepada pengguna di server, dengan cara yang sama seperti yang Anda lakukan di komputer lokal. Secara default, setiap output gambar oleh WordPress akan disertai dengan atribut srcset yang dihasilkan berdasarkan ukuran gambar yang dikonfigurasi di tema Anda.

Dua setelan utama yang dapat dikonfigurasi untuk gambar yang dihasilkan adalah kualitas kompresi dan jenis mime output.

Misalnya, untuk menetapkan kualitas kompresi default ke 70 untuk semua gambar yang dihasilkan, gunakan opsi berikut:

add_filter( 'wp_editor_set_quality', function() { return 70; } );

Untuk kompresi yang lebih baik, alihkan format output untuk gambar JPEG yang diupload ke WebP dengan kode berikut:

add_filter( 'image_editor_output_format', function( $mappings ) {
  $mappings[ 'image/jpeg' ] = 'image/webp';
    return $mappings;
} );

Mengingat bahwa WordPress memiliki pemahaman penuh tentang semua potongan alternatif dan encoding yang dihasilkannya dari gambar yang diupload, WordPress dapat menyediakan fungsi bantuan seperti wp_get_attachment_image_srcset() untuk mengambil nilai srcset penuh yang dihasilkan dari lampiran gambar.

Seperti yang mungkin sudah Anda duga pada tahap ini, bekerja dengan atribut sizes sedikit lebih sulit. Karena tidak ada informasi tentang bagaimana gambar akan digunakan dalam tata letak, WordPress saat ini ditetapkan secara default ke nilai sizes yang secara efektif menyatakan "gambar ini harus menempati 100% area pandang yang tersedia, hingga ukuran intrinsik sumber terbesar"—default yang dapat diprediksi, tetapi bukan yang benar untuk aplikasi dunia nyata apa pun. Pastikan untuk menggunakan wp_calculate_image_sizes() untuk menyetel atribut sizes yang sesuai secara kontekstual di template Anda.

Tentu saja, ada banyak plugin WordPress yang dikhususkan untuk membuat alur kerja gambar modern lebih cepat bagi tim pengembangan dan pengguna. Mungkin yang paling menarik, plugin seperti Akselerator Situs Jetpack (sebelumnya disebut "Photon") dapat memberikan negosiasi sisi server untuk encoding, yang memastikan pengguna akan menerima encoding terkecil dan paling efisien yang dapat didukung browser mereka tanpa memerlukan pola markup <picture> dan type. Sistem ini melakukannya melalui penggunaan jaringan penayangan konten gambar, yaitu teknologi yang dapat digunakan sendiri, terlepas dari CMS Anda.

Semua ini juga berlaku untuk solusi CMS yang dihosting seperti Shopify, meskipun mekanismenya sendiri akan sedikit berbeda: menawarkan hook serupa untuk menghasilkan sumber gambar alternatif serta atribut srcset yang sesuai dan arah gambar melalui elemen <picture>.