Memulai

Ekstensi terdiri dari komponen yang berbeda, tetapi kohesif. Komponen dapat mencakup skrip latar belakang, skrip konten, halaman opsi, elemen UI, dan berbagai file logika. Komponen ekstensi dibuat dengan teknologi pengembangan web: HTML, CSS, dan JavaScript. Komponen ekstensi akan bergantung pada fungsinya dan mungkin tidak memerlukan setiap opsi.

Tutorial ini akan mem-build ekstensi yang memungkinkan pengguna mengubah warna latar belakang halaman mana pun di developer.chrome.com. Tutorial ini akan menggunakan banyak komponen inti untuk menunjukkan pengantar tentang hubungan mereka.

Untuk memulai, buat direktori baru untuk menyimpan file ekstensi.

Ekstensi yang sudah selesai dapat ditemukan di sini.

Membuat manifes

Ekstensi dimulai dengan manifes. Buat file bernama manifest.json dan sertakan kode berikut.

{
  "name": "Getting Started Example",
  "version": "1.0",
  "description": "Build an Extension!",
  "manifest_version": 2
}

Direktori yang menyimpan file manifes dapat ditambahkan sebagai ekstensi dalam mode developer dalam status saat ini.

  1. Buka halaman Pengelolaan Ekstensi dengan membuka chrome://extensions.
    • Halaman Pengelolaan Ekstensi juga dapat dibuka dengan mengklik menu Chrome, mengarahkan kursor ke Alat Lainnya, lalu memilih Ekstensi.
  2. Aktifkan Mode Developer dengan mengklik tombol di samping Mode developer.
  3. Klik tombol LOAD UNPACKED dan pilih direktori ekstensi.

Muat Ekstensi

Akhirnya! Ekstensi berhasil diinstal. Karena tidak ada ikon yang disertakan dalam manifes, ikon toolbar generik akan dibuat untuk ekstensi.

Tambahkan petunjuk

Meskipun telah diinstal, ekstensi ini tidak memiliki petunjuk. Buat skrip latar belakang dengan membuat file berjudul background.js, lalu letakkan di dalam direktori ekstensi.

Skrip latar belakang, dan banyak komponen penting lainnya, harus didaftarkan dalam manifes. Mendaftarkan skrip latar belakang dalam manifes akan memberi tahu ekstensi file mana yang akan direferensikan dan bagaimana perilaku file tersebut.

{
  "name": "Getting Started Example",
  "version": "1.0",
  "description": "Build an Extension!",
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "manifest_version": 2
}

Ekstensi kini mengetahui bahwa ekstensi menyertakan skrip latar belakang non-persisten dan akan memindai file terdaftar untuk menemukan peristiwa penting yang perlu diproses.

Ekstensi ini akan memerlukan informasi dari variabel persisten segera setelah diinstal. Mulailah dengan menyertakan peristiwa pemrosesan untuk runtime.onInstalled di skrip latar belakang. Di dalam pemroses onInstalled, ekstensi akan menetapkan nilai menggunakan storage API. Dengan begitu, beberapa komponen ekstensi akan dapat mengakses nilai tersebut dan mengupdatenya.

chrome.runtime.onInstalled.addListener(function() {
  chrome.storage.sync.set({color: '#3aa757'}, function() {
    console.log("The color is green.");
  });
});

Sebagian besar API, termasuk storage API, harus didaftarkan di kolom "permissions" dalam manifes agar ekstensi dapat menggunakannya.

{
  "name": "Getting Started Example",
  "version": "1.0",
  "description": "Build an Extension!",
  "permissions": ["storage"],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "manifest_version": 2
}

Kembali ke halaman pengelolaan ekstensi dan klik link Reload. Kolom baru, Periksa tampilan, tersedia dengan link biru, halaman latar belakang.

Memeriksa Tampilan

Klik link untuk melihat log konsol skrip latar belakang, "The color is green."

Memperkenalkan antarmuka pengguna

Ekstensi dapat memiliki banyak bentuk antarmuka pengguna, tetapi ekstensi ini akan menggunakan popup. Buat dan tambahkan file berjudul popup.html ke direktori. Ekstensi ini menggunakan tombol untuk mengubah warna latar belakang.

<!DOCTYPE html>
<html>
  <head>
    <style>
      button {
        height: 30px;
        width: 30px;
        outline: none;
      }
    </style>
  </head>
  <body>
    <button id="changeColor"></button>
  </body>
</html>

Seperti skrip latar belakang, file ini perlu ditetapkan sebagai pop-up dalam manifes di bagian page_action.

{
  "name": "Getting Started Example",
  "version": "1.0",
  "description": "Build an Extension!",
  "permissions": ["storage"],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "page_action": {
    "default_popup": "popup.html"
  },
  "manifest_version": 2
}

Penetapan untuk ikon toolbar juga disertakan di bagian page_action di kolom default_icons. Download folder gambar di sini, ekstrak, dan tempatkan di direktori ekstensi. Update manifes agar ekstensi mengetahui cara menggunakan gambar tersebut.

{
  "name": "Getting Started Example",
  "version": "1.0",
  "description": "Build an Extension!",
  "permissions": ["storage"],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "page_action": {
    "default_popup": "popup.html",
    "default_icon": {
      "16": "images/get_started16.png",
      "32": "images/get_started32.png",
      "48": "images/get_started48.png",
      "128": "images/get_started128.png"
    }
  },
  "manifest_version": 2
}

Ekstensi juga menampilkan gambar di halaman pengelolaan ekstensi, peringatan izin, dan favorit. Gambar ini ditetapkan dalam manifes di bagian icons.

{
  "name": "Getting Started Example",
  "version": "1.0",
  "description": "Build an Extension!",
  "permissions": ["storage"],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "page_action": {
    "default_popup": "popup.html",
    "default_icon": {
      "16": "images/get_started16.png",
      "32": "images/get_started32.png",
      "48": "images/get_started48.png",
      "128": "images/get_started128.png"
    }
  },
  "icons": {
    "16": "images/get_started16.png",
    "32": "images/get_started32.png",
    "48": "images/get_started48.png",
    "128": "images/get_started128.png"
  },
  "manifest_version": 2
}

Jika dimuat ulang pada tahap ini, ekstensi akan menyertakan ikon skala abu-abu, tetapi tidak akan berisi perbedaan fungsi apa pun. Karena page_action dideklarasikan dalam manifes, ekstensi dapat memberi tahu browser kapan pengguna dapat berinteraksi dengan popup.html.

Tambahkan aturan yang dideklarasikan ke skrip latar belakang dengan declarativeContent API dalam peristiwa pemroses runtime.onInstalled.

chrome.runtime.onInstalled.addListener(function() {
  chrome.storage.sync.set({color: '#3aa757'}, function() {
    console.log('The color is green.');
  });
  chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
    chrome.declarativeContent.onPageChanged.addRules([{
      conditions: [new chrome.declarativeContent.PageStateMatcher({
        pageUrl: {hostEquals: 'developer.chrome.com'},
      })
      ],
          actions: [new chrome.declarativeContent.ShowPageAction()]
    }]);
  });
});

Ekstensi akan memerlukan izin untuk mengakses declarativeContent API dalam manifesnya.

{
  "name": "Getting Started Example",
...
  "permissions": ["declarativeContent", "storage"],
...
}

Pop-up

Browser kini akan menampilkan ikon tindakan halaman berwarna lengkap di toolbar browser saat pengguna membuka URL yang berisi "developer.chrome.com". Jika ikon berwarna, pengguna dapat mengkliknya untuk melihat popup.html.

Langkah terakhir untuk UI pop-up adalah menambahkan warna pada tombol. Buat dan tambahkan file bernama popup.js dengan kode berikut ke direktori ekstensi.

let changeColor = document.getElementById('changeColor');

chrome.storage.sync.get('color', function(data) {
  changeColor.style.backgroundColor = data.color;
  changeColor.setAttribute('value', data.color);
});

Kode ini mengambil tombol dari popup.html dan meminta nilai warna dari penyimpanan. Kemudian, warna akan diterapkan sebagai latar belakang tombol. Sertakan tag skrip ke popup.js di popup.html.

<!DOCTYPE html>
<html>
...
  <body>
    <button id="changeColor"></button>
    <script src="popup.js"></script>
  </body>
</html>

Muat ulang ekstensi untuk melihat tombol hijau.

Logika lapisan

Ekstensi sekarang mengetahui bahwa pop-up harus tersedia untuk pengguna di developer.chrome.com dan menampilkan tombol berwarna, tetapi memerlukan logika untuk interaksi pengguna lebih lanjut. Update popup.js untuk menyertakan kode berikut.

let changeColor = document.getElementById('changeColor');
...
changeColor.onclick = function(element) {
  let color = element.target.value;
  chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
    chrome.tabs.executeScript(
        tabs[0].id,
        {code: 'document.body.style.backgroundColor = "' + color + '";'});
  });
};

Kode yang diupdate menambahkan peristiwa onclick pada tombol, yang memicu skrip konten yang dimasukkan secara terprogram. Tindakan ini akan mengubah warna latar belakang laman menjadi warna yang sama dengan tombol. Penggunaan injeksi terprogram memungkinkan skrip konten yang dipanggil pengguna, bukan menyisipkan kode yang tidak diinginkan ke dalam halaman web secara otomatis.

Manifes memerlukan izin activeTab untuk mengizinkan akses sementara ekstensi ke tabs API. Tindakan ini memungkinkan ekstensi memanggil tabs.executeScript.

{
  "name": "Getting Started Example",
...
  "permissions": ["activeTab", "declarativeContent", "storage"],
...
}

Sekarang ekstensi berfungsi sepenuhnya. Muat ulang ekstensi, muat ulang halaman ini, buka pop-up, dan klik tombol untuk mengubah warna menjadi hijau. Namun, beberapa pengguna mungkin ingin mengubah latar belakang ke warna yang berbeda.

Berikan opsi kepada pengguna

Ekstensi saat ini hanya mengizinkan pengguna mengubah latar belakang menjadi hijau. Dengan menyertakan halaman opsi, pengguna akan memiliki lebih banyak kontrol atas fungsi ekstensi, sehingga dapat menyesuaikan pengalaman penjelajahan mereka lebih lanjut.

Mulailah dengan membuat file bernama options.html dalam direktori dan sertakan kode berikut.

<!DOCTYPE html>
<html>
  <head>
    <style>
      button {
        height: 30px;
        width: 30px;
        outline: none;
        margin: 10px;
      }
    </style>
  </head>
  <body>
    <div id="buttonDiv">
    </div>
    <div>
      <p>Choose a different background color!</p>
    </div>
  </body>
  <script src="options.js"></script>
</html>

Kemudian daftarkan halaman opsi dalam manifes,

{
  "name": "Getting Started Example",
  ...
  "options_page": "options.html",
  ...
  "manifest_version": 2
}

Muat ulang ekstensi dan klik DETAIL.

Memeriksa Tampilan

Scroll halaman detail ke bawah, lalu pilih Opsi ekstensi untuk melihat halaman opsi, meskipun saat ini halaman tersebut akan terlihat kosong.

Opsi Ekstensi

Langkah terakhir adalah menambahkan logika opsi. Buat file bernama options.js di direktori ekstensi dengan kode berikut.

let page = document.getElementById('buttonDiv');
const kButtonColors = ['#3aa757', '#e8453c', '#f9bb2d', '#4688f1'];
function constructOptions(kButtonColors) {
  for (let item of kButtonColors) {
    let button = document.createElement('button');
    button.style.backgroundColor = item;
    button.addEventListener('click', function() {
      chrome.storage.sync.set({color: item}, function() {
        console.log('color is ' + item);
      })
    });
    page.appendChild(button);
  }
}
constructOptions(kButtonColors);

Empat opsi warna disediakan kemudian dibuat sebagai tombol pada halaman opsi dengan pemroses peristiwa onclick. Saat pengguna mengklik tombol, nilai warna akan diperbarui di penyimpanan global ekstensi. Karena semua file ekstensi menarik informasi warna dari penyimpanan global, tidak ada nilai lain yang perlu diperbarui.

Langkah selanjutnya

Selamat! Direktori tersebut kini memiliki ekstensi Chrome yang berfungsi penuh, meskipun sederhana.

Apa selanjutnya?

  • Ringkasan Ekstensi Chrome melakukan pencadangan sedikit, dan mengisi banyak detail tentang arsitektur Ekstensi secara umum, dan beberapa konsep tertentu yang ingin dipahami developer.
  • Pelajari opsi yang tersedia untuk men-debug Ekstensi dalam tutorial proses debug.
  • Ekstensi Chrome memiliki akses ke API yang canggih dan tidak hanya tersedia di web terbuka. Tag Chrome.* Dokumentasi API akan menjelaskan setiap API.
  • Panduan developer ini berisi puluhan link tambahan ke beberapa dokumentasi yang relevan dengan pembuatan ekstensi lanjutan.