Задумывались ли вы когда-нибудь, как работают эти милые небольшие расширения для браузера? Те, что блокируют рекламу, переводят страницы или напоминают вам пить воду каждый час (потому что, очевидно, мы деградировали до состояния, когда наши браузеры должны поддерживать нас в живых). Что ж, пристегните ремни, потому что сегодня мы погрузимся с головой в удивительно хаотичный мир разработки расширений для Chrome!
Думайте о расширениях для Chrome как о швейцарских армейских ножах в мире браузеров — компактные, универсальные и иногда достаточно острые, чтобы порезаться, если не соблюдать осторожность. Но в отличие от того пыльного мультитула, который лежит у вас в ящике с барахлом, эти цифровые спутники действительно могут сделать ваш ежедневный сёрфинг в интернете значительно лучше.
Что такое расширения для Chrome?
Расширения для Chrome — это, по сути, небольшие программные приложения, которые настраивают и расширяют ваши возможности в браузере. Они созданы с использованием тех же веб-технологий, которые вы уже знаете и любите (или ненавидите): HTML, CSS и JavaScript. Это как создание обычного веб-приложения, но с суперспособностями и возможностью взаимодействовать с любым сайтом, который вы посещаете.
Вся прелесть в их простоте — если вы можете создать базовую веб-страницу, вы уже на 80% пути к созданию своего первого расширения для Chrome. Оставшиеся 20% включают изучение API расширений Chrome и попытки не выдрать себе волосы при отладке (спойлер: вы всё равно это сделаете).
Настройка вашей крепости для разработки
Прежде чем мы начнём кодировать, как разработчики, подстегнутые кофеином, давайте настроим нашу среду разработки. Хорошая новость в том, что вам не нужны какие-либо модные инструменты — просто текстовый редактор, браузер Chrome и достаточно терпения, чтобы разобраться с особенностями загрузки расширений Chrome.
Создайте новую папку для вашего проекта расширения. Я люблю называть свои что-то креативным, например, «моё-крутое-расширение», потому что креативность явно моя сильная сторона. Внутри этой папки мы будем создавать несколько файлов, которые будут работать вместе как хорошо смазанная машина (или, по крайней мере, как машина, которая была адекватно смазана).
Файл manifest.json: удостоверение личности вашего расширения
Каждое расширение для Chrome начинается с файла manifest.json — думайте о нём как о паспорте, водительских правах и свидетельстве о рождении вашего расширения, объединённых в одном. Этот файл сообщает Chrome всё, что ему нужно знать о вашем расширении: как оно называется, какой у него версии и какие разрешения ему нужны (спойлер: оно, вероятно, захочет получить доступ ко всему).
Вот базовая структура manifest.json, чтобы вы могли начать:
{
"name": "Task Master Pro",
"version": "1.0.0",
"description": "Расширение для повышения продуктивности, которое действительно помогает вам быть продуктивным (революционно, я знаю)",
"manifest_version": 3,
"author": "Ваше имя здесь",
"action": {
"default_popup": "popup.html",
"default_title": "Task Master Pro",
"default_icon": {
"16": "icons/icon16.png",
"32": "icons/icon32.png",
"48": "icons/icon48.png",
"128": "icons/icon128.png"
}
},
"permissions": [
"storage",
"activeTab"
],
"background": {
"service_worker": "background.js"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
]
}
Давайте разберём это, как если бы мы объясняли это вашей резиновой уточке:
- name и version: довольно самообъяснительно, если вы не увлекаетесь загадочными однобуквенными названиями расширений
- manifest_version: всегда используйте 3 — это последняя версия, и Chrome будет капризничать, если вы используете более старые
- action: определяет, что происходит, когда пользователи нажимают на иконку вашего расширения
- permissions: раздел «пожалуйста, сэр, можно ещё немного», где вы просите Chrome предоставить доступ к различным функциям браузера
- background: фоновый работник вашего расширения
- content_scripts: скрипты, которые запускаются на веб-страницах (с большой силой приходит большая ответственность)
Создание всплывающего интерфейса: лицо вашего расширения
Всплывающее окно — это то, что видят пользователи, когда они нажимают на иконку вашего расширения — это шанс вашего расширения произвести хорошее первое впечатление, так что не испортите его. Создайте файл с именем popup.html:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Task Master Pro</title>
<link rel="stylesheet" href="popup.css">
</head>
<body>
<div class="container">
<h1>Task Master Pro</h1>
<div class="input-group">
<input type="text" id="taskInput" placeholder="Что нужно покорить сегодня?">
<button id="addTask">Добавить задачу</button>
</div>
<div class="stats">
<span id="taskCount">0 задач</span>
<span id="completedCount">0 выполнено</span>
</div>
<ul id="taskList" class="task-list"></ul>
</div>
<script src="popup.js"></script>
</body>
</html>
Теперь давайте добавим немного CSS, чтобы сделать его менее похожим на то, что было разработано программистом (без обид на программистов, но мы все знаем, что наши навыки дизайна…). Создайте popup.css:
body {
width: 350px;
min-height: 400px;
margin: 0;
padding: 0;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
.container {
padding: 20px;
}
h1 {
text-align: center;
margin: 0 0 20px 0;
font-size: 24px;
text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
}
.input-group {
display: flex;
gap: 10px;
margin-bottom: 15px;
}
#taskInput {
flex: 1;
padding: 10px;
border: none;
border-radius: 5px;
font-size: 14px;
}
#addTask {
padding: 10px 15px;
background: #4CAF50;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
font-weight: bold;
transition: background 0.3s;
}
#addTask:hover {
background: #45a049;
}
.stats {
display: flex;
justify-content: space-between;
margin-bottom: 15px;
font-size: 12px;
opacity: 0.8;
}
.task-list {
list-style: none;
padding: 0;
margin: 0;
max-height: 250px;
overflow-y: auto;
}
.task-item {
background: rgba(255, 255, 255, 0.1);
margin-bottom: 8px;
padding: 12px;
border-radius: 5px;
display: flex;
justify-content: space-between;
align-items: center;
backdrop-filter: blur(10px);
}
.task-item.completed {
opacity: 0.6;
text-decoration: line-through;
}
.task-text {
flex: 1;
margin-right: 10px;
}
.task-actions {
display: flex;
gap: 5px;
}
.btn-small {
padding: 4px 8px;
border: none;
border-radius: 3px;
cursor: pointer;
font-size: 12px;
font-weight: bold;
}
.btn-complete {
background: #4CAF50;
color: white