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

Công việc nào cũng vậy, sau một thời gian chúng ta sẽ tự nhận thấy có những thứ cứ lặp đi lặp lại hàng ngày. Mình cũng vậy, công việc của mình được thực hiện rất nhiều trên Google Chrome và sẽ thật hữu ích nếu như chúng

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

468 Blog bài viết

Bình luận