Hướng dẩn Tự tạo Chrome Extension cho riêng mình

Cấu trc của một Chrome Extension

Về cơ bản, một Chrome Extension chủ yếu sẽ được viết bằng Javascript v HTML. Bạn c thể tổ chức cc thư mục ty sao cho ph hợp v tiện lợi nhất trong qu trnh code. Với mnh th sẽ như thế ny:

Dưới đy, chng ta sẽ đi su vo bn trong để tm hiểu chức năng của từng file

Chức năng của cc thnh phần

1. manifest.json

Đy l file config cho extension của chng ta. N chứa thng tin cơ bản về extension, cc file sẽ được chạy, inject...

{    "name": "Nhaccuatui Extension",    "version": "0.0.1",    "manifest_version": 2,    "description" : "Extension for Nhaccuatui",    "icons": {        "16": "images/icon.png",        "48": "images/icon.png"    },    "browser_action": {        "default_icon": {            "19": "images/icon.png",            "38": "images/icon.png"        },        "default_title": "Nhaccuatui Extension",        "default_popup": "popup.html"    },    "background": {        "page": "background.html",        "persistent": false    },    "content_scripts": [        {            "matches": [                "*://nhaccuatui.com/bai-hat/*",            ],            "js": [                "scripts/content.js",            ],            "css": [                "styles/font.css",                "styles/main.css"            ],            "run_at": "document_idle"        }    ],    "permissions": [        "clipboardWrite",        "storage"    ]}
  • name: L thuộc tnh xc định tn extension của bạn
  • version: Phin bản hiện tại, Chrome sẽ dựa vo đy để xc định xem extension của bạn c bản cập nhật mới hay khng
  • manifest_version: Xc định phin bản của chnh file manifest.json
  • description: Miu tả chi tiết hơn về extension
  • icons: Icon của extension sẽ được hiển thị trn store. Trong trường hợp ny, mnh để chng trong thư mục images
  • browser_action:
    • default_icon: Icon sẽ được sử dụng để hiển thị trn trnh duyệt
    • default_title: Title sẽ được hiển thị khi hover chuột vo icon của extension
    • default_popup: Đy l file HTML sẽ được hiển thị khi bạn mở extension ra. Chng ta sẽ ni r hơn về file ny trong phần sau
  • background:
    • page: Đy sẽ l trang chạy ngầm bn dưới v thường sẽ chỉ chứa một script tag để đưa file javascript vo
    • persistent: L flag c gi trị ltruehoặcfalse. Xc định trang background sẽ được chạy như thế no
  • content_scripts:
    • matches: Xc định cc trang web m bạn muốn thm cc nội dung của mnh vo
    • js: L danh sch cc file javascript sẽ được inject vo cc trang web đ được khai bo bn trn
    • css: Tương tự như thuộc tnhjsnhưng l danh sch cc file css
    • run_at: Thời điểm inject cc file content bn trn vo trang web
  • permissions: Khai bo cc quyền hạn truy cập cho extension

2. Content script

Đy l cc thnh phần được inject vo cc trang web m bạn khai bo ở thuộc tnhmatchestrong filemanifest.json. Cc thnh phần ny được chạy cng mi trường với trang web hiện tại nn bạn c thể sử dụng javascript, css để thao tc ln cc thnh phần DOM. Nhờ đ bạn c thể thay đổi giao diện trang, thm cc button, thm cc chức năng khc m bạn muốn.

3. Popup page

Đy l trang sẽ chạy v hiển thị khi bạn mở extension của mnh ln. Cấu trc của n cũng tương tự như những trang HTML khc. Trong trường hợp của mnh th đ trangpopup.html. Trang ny được chạy ở một mi trường khc so với cc content script. C thể hiểu nm na l chng được chạy ở một cửa sổ trnh duyệt khc so với cửa sổ trnh duyệt hiện tại.

!doctype html
html lang="en"
head
meta charset="utf-8"
link rel="stylesheet" href="./styles/lib/bootstrap.min.css"
link rel="stylesheet" href="./styles/page.css"
titleMy Extension/title
/head
body
div class="wrapper"
h1This is popup page/h1
/div
script src="./scripts/lib/bootstrap.min.js"/script
script type="module" src="./scripts/popup.js"/script
/body
/html

Bạn sẽ tạo giao diện chnh cho extension của mnh tại đy. Trang sẽ được load lại mỗi khi extension được mở. Bạn c thể sử dụnglocalStorageđể lưu trữ dữ liệu giống như một database.

4. Background page

Cũng giống như trangpopup.html, trangbackground.htmlcũng sẽ chạy cng một mi trường. Tuy nhin n khng c giao diện m đơn thuần chỉ chứa một script tag với mục đch đưa vo đ filebackground.js.

html
body
script type="module" src="./scripts/background.js"/script
/body
/html

Mặc định trang ny sẽ được tự động sinh ra v tự động inject filebackground.js, nhưng trong trường hợp bạn muốn custom n th đy sẽ l nơi để bạn thực hiện điều đ

Filebackground.jsđược sử dụng với mục đch tương tự như một server, n lắng nghe cc sự kiện được gọi từ trang popup hay trang content. Xử l, lưu trữ dữ liệu cũng như l trả về data trong response.

Giao tiếp gữa cc thnh phần

Vừa rồi chng ta đ phần no hiểu được chức năng của cc thnh phần trong một extension. Như chng ta đ biết, filecontent.jsđược chạy cng với trang web hiện tại m n được inject vo. Trong khi đ,popup.jsvbackground.jsđược chạy ở cng một mi trường v chng tch biệt hon ton so với của sổ hiện tại m trnh duyệt đang hiển thị. V thế, để c sự kết nối giữa cc file script ở cc mi trường khc nhau, Chrome sử dụng cc message để thể hiện sự giao tiếp đ.

Chng ta sẽ cng nhau lm mt v dụ để hiểu hơn vấn đề ny nh. Extension của chng ta sẽ c chức năng l lưu lại cc bi ht m mnh thch trnhttps://www.nhaccuatui.com/để hng ngy c thể nghe lại chng m khng phải mất cng tm kiếm. Tất nhin l thực tế th trang nhạc no cũng c chức năng tạo playlist rồi. No hy cng bắt đầu thi.

content.js

Trong phần ny, chng ta sẽ xử l việc chn thm vo trang một button m khi click vo n, chng ta sẽ lấy dữ liệu ở trang hiện tại v gửi ln chobackground.jsxử l:

window.onload = function () {
var button = document.createElement('button');

button.innerHTML = 'Add to Playlist';
document.body.prepend(button);

button.addEventListener('click', function () {
var link = window.location.href;
var name = document.querySelector('.name_title').innerText;
chrome.extension.sendMessage({
type: 'add-song',
data: {link, name}
});
});
}

Để rằng, ở thuộc tnhmatchestrongmanifest.json, chng ta c một gi trị l"*://nhaccuatui.com/bai-hat/*". Như vậy đoạn script trn sẽ chỉ được chạy ở trang m bi ht đang được pht.

background.js

Vừa rồi ởcontent.jschng ta đ gửi một message đi. Vậy muốnbackground.jsnhận được thng điệp ny th chng ta phải đăng k cho n lắng nghe những request được gửi đến

chrome.extension.onMessage.addListener(
function (request) {
switch(request.type) {
case 'add-song':
addSong(data);
break;
case 'remove-song':
break;
}
});

function addSong(data) {
var songs = getSongs();
songs.push(data);
localStorage.songs = JSON.stringify(songs)
}

function getSongs() {
if (!localStorage.songs) {
localStorage.songs = JSON.stringify([]);
}

return JSON.parse(localStorage.songs);
}

Khi nhận được message, chng thực hiện lưu data vo tronglocalstorage.

popup.js

Như đ thấy chng ta sử dụngpopup.jstrong trangpopup.htmldo đ tại đy chng ta sẽ xử l ởpopup.jsđể hiển thị danh sch cc bi ht đ được lưu.

$(document).ready(function () {
var songs = JSON.parse(localStorage.songs || '[]');
var songHTML = null;

songs.forEach(song = {
songHTML = $(`a href="${song.link}" target="_blank"${song.name}/a`);
$('.wrapper').append(songHTML);
})
});

Như vậy, mỗi lần extension được mở ra, chng ta sẽ thấy danh sch cc bi ht m mnh đ lưu được hiển thị ra ở đy. Bạn c thể thm cc tnh năng khc nữa như tự động pht cc bi ht trong danh sch, hay download tất cả chng về my của mnh.

Load extension

  • Cc bạn vo google chrome, g vo địa chỉchrome://extensions/
  • Click vo nutLoad unpackedbn gc tri mn hnh
  • Tm đến folder chứa extension của chng ta, thế l xong

Tổng kết

Vừa rồi chng ta đ tm hiểu về cc thnh phần của một chrome extension cũng như cc chức năng v sự giao tiếp giữa chng. Hi vọng với những chia sẻ đ, cc bạn sẽ phần no hiểu hơn về cấu trc của một extension để c thể tự tạo ring cho mnh một extension, phục vụ cc nhu cầu của bản thn.


Thủ Thuật Hay

470 Blog posts

Related post