Русский
Русский
English
Статистика
Реклама

Расширения браузеров

Из песочницы Пишем свой плагин для VueJS. Как проект на VueJS трансформировать в расширение для браузера?

23.07.2020 14:23:59 | Автор: admin


Вступление


В этой статье мы с вами напишем свой собственный плагин для проектов на VueJS, который трансформирует проект в расширение для браузера. Узнаем как изменять правила сборки webpack и генерировать дополнительную структуру файлов и папок.


Расширения для браузеров часто имеют всплывающие окна, которые появляются при клике на иконку расширения. Во всплывающем окне может быть авторизация, регистрация или управление настройками расширения, а возможно и любая другая логика. Мне показалось очень удобным реализовать всплывающее окно и само расширение на VueJS. Было решено написать плагин для vue-cli который трансформирует существующий проект на VueJS в расширение для браузера. А содержимое проекта будет отображаться во всплывающем окне расширения. Этот плагин уже опробован в реальном проекте по проверке объявлений перекупщиков validauto.ru и расширениях для Google Chrome, Mozilla Firefox и Microsoft Edge "Узнай кто перекуп | (validauto.ru)"


Пишем плагин для vue-cli


Сначала мы создадим папку с именем vue-cli-plugin-simple-extension. Префикс vue-cli-plugin необходим для автоматического поиска плагина в npm пакетах при вызове команды vue add simple-extension.
В папке инициализируем package следующей командой


npm init

Структура плагина будет выглядеть так


 README.md generator/          template/   # шаблоны для генерации         index.js     # генератор index.js             # плагин для сервиса package.json

Генератор создает новые файлы и директории или изменяет существующие по шаблону. Добавим следующую структуру в папку template внутри generator. При установке плагина генератор будет копировать эти файлы в папку проекта src.


template/ extension/          background/         |       background.html         |       background.js         content/         |       content.js         manifest.json

content.js


Скрипт отвечает за взаимодействие с веб-страницами. Он может взаимодействовать с веб-страницами, которые посещает браузер. Может при необходимости изменять их или дополнять логикой расширения.


background.js


Скрипт отвечает за фоновый процесс. С его помощью можно взаимодействовать с сервером для передачи данных и с content.js.


manifest.json


{  "author": "",  "name": "",  "description": "",  "version": "1.0",  "minimum_chrome_version": "26.0",  "manifest_version": 2,  "browser_action": {    "default_popup": "index.html"  },  "background": {    "page": "background.html",    "persistent": true  },  "icons" : {},  "content_scripts": [    {      "matches": ["*://*/*"],      "js": ["content.js"],      "run_at": "document_end"    }  ],  "content_security_policy": "script-src 'self'; object-src 'self'",  "web_accessible_resources": [  ],  "optional_permissions": [],  "permissions": []}

Файл manifest.json сообщает браузеру важную информацию о расширении, его имени и необходимых разрешениях. "default_popup": "index.html" будет ссылаться на index.html проекта. Точка входа для Vue проектов, которая по-умолчанию находится в папке public.


Далее добавим следующий код в файл generator/index.js. Вызов api.render('./template') копирует наши файлы в проект. Код приведен ниже


module.exports = api => {    api.render('./template');};

Следующим шагом будет изменение конфигурации webpack. Это делается в основном файле плагина index.js с помощью следующего кода


const CopyPlugin = require('copy-webpack-plugin');module.exports = (api, options) => {    api.chainWebpack((config) => {        config            .entry('content')            .add('./src/extension/content/content.js');        config            .entry('background')            .add('./src/extension/background/background.js');        config.output.filename('[name].js');    });    api.configureWebpack((config) => {        // No need for splitting        config.optimization = {            splitChunks: false,        };        config.plugins = config.plugins.concat(            new CopyPlugin([                { from: 'src/extension/background/background.html', to: 'background.html' },                { from: 'src/extension/manifest.json', to: 'manifest.json', force: true },            ]),        );    });};

Этот код добавляет два дополнительных entry для content.js и background.js. Копирует manifest.json и background.html в корень папки dist при сборке. Здесь используется copy-webpack-plugin. Его необходимо добавить в зависимости плагина следующей командой


npm install copy-webpack-plugin --save-dev

И добавляем зависимость в основной проект при установке плагина. Это делается вызовом api.extendPackage в generator/index.js.


module.exports = api => {    api.extendPackage({        devDependencies: {            'copy-webpack-plugin': '^5.1.1',        },    });    ...};

Проверка работы плагина локально


Удобно тестировать плагин локально без загрузки в npm или git репозитории. Для этого необходимо подключить package в основной проект перед вызовом vue add simple-extension. Примечание: данный шаг не будет требоваться когда ваш плагин будет общедоступным в репозитории npm.
В основном проекте выполняем


npm install [путь до папки плагина] --save-dev

Теперь можем выполнить команду, которая добавляет плагин. В основном проекте выполним


vue add simple-extension

Если все прошло успешно, то сборка расширения запускается стандартной командой


npm run build

После публикации плагина в npm он будет доступен для любого пользователя через команду


vue add simple-extension

Осталось папку dist загрузить в Google Chrome или Firefox. Поздравляю, расширение готово!


Заключение


Оказалось, что написать плагин для VueJS довольно просто. Плагин позволяет для разной конфигурации VueJS быстро трансформировать проект в расширение для браузера. Был продемонстрирован пример генерации дополнительной структуры проекта, изменения правил сборки webpack и подключения плагина локально.


Ссылки на плагин


Подробнее..

Расширения для Google Chrome, без которых вы уже не сможете представить свою работу

18.11.2020 12:16:11 | Автор: admin


Google Chrome имеет возможность создания и установки собственных расширений, многие из которых сильно расширяют его базовый функционал, упрощают работу с ним и делают его более удобным. Самые полезные и незаменимые расширения я собрал в данной статье и хотел бы поделиться ими с сообществом. Разумеется, данный список может быть не полон, однако это действительно незаменимые помошники, без которых лично я не представляю свою работу в интернете. Названия всех расширений кликабельны и ведут на соответствующую страницу в интернет-магазине Google Chrome. Погнали!

1. Recent Tabs with your browsing history

image

Расширение из разряда must have для тех, кто иногда по ошибке закрывает нужные вкладки. По клику выводит 15 последних открытых вкладок. Это как Ctrl-Shift-T, только выбрать можно любую закрытую ранее вкладку.

2. LongClick New Tab

image

Я частенько увлекаюсь серфингом по конкретным сайтам, и иногда хочется открыть их разные страницы в отдельных вкладках, чтобы прочитать их позднее. Особенно это удобно для интернет-магазинов, где можно открыть несколько разных товаров и переключаться между ними для сравнения, и т. д. К сожалению, многие сайты открывают новые страницы в том же окне, и поэтому уже забывается какие страницы хотелось посетить. Данное расширение открывает любую ссылку в новой вкладке, достаточно удерживать на ней мышку нажатой в течении пары секунд.

3. Better History

image

Замена стандартной истории браузера для более удобной работы с ней в виде (наконец-то) вкладок по часам и дням недели. Вызывается аналогично стандартной истории посещений из меню или по Ctrl + H

4. Группировка вкладок

image

Простое, но крайне удобное расширение для тех, у кого постоянно открыты десятки вкладок, особенно разных страниц одного сайта. Группирует все вкладки и создает страницу со всеми открытыми вкладками для каждого сайта.

5. Read This Later

image

По роду моей деятельности мне часто приходится открывать несколько вкладок одновременно для решения какой-либо задачи, причем иногда приходится откладывать эту задачу чтобы возвратиться к ней немного позднее, так как в приоритете возникла другая задача, либо вкладок открыто уже столько, что у них даже значков не видно. В этом случае на помощь приходит расширение Read This Later, которое позволяет сохранить нужные ссылки для того, чтобы прочитать их позднее. На любой странице кликаете правой кнопкой мыши и выбираете Read This Later. Страница появится в меню самого расширения, там же можно удалить ненужные одним кликом. Зачем оно нужно если есть закладки из коробки, причем с папками? Главная проблема вкладок как раз и кроется в этих самых папках, которые просто хоронят в себе все страницы. Лично у меня в них уже пара десятков папок по разным темам, во многих из них еще по нескольку папок, и так далее, и разумеется я свято верю в то, что рано или поздно я все это буду читать. Когда-нибудь. А тут все динамично: сохранил нужные, вернулся к ним позднее, удалил ненужные, снова добавил новые, и так далее. Сдается мне что по этой причине папки оно и не поддерживает, ибо иначе это был бы просто очередной аналог закладок.

6. Translator

image

Настоящий мастхэв для тех, кому требуется время от времени переводить слова на другой язык или обратно. Очень сильно выручает когда нужно задать вопрос на StackOverflow (например), однако не получается вспомнить как пишется какое-либо слово. Ранее мне приходилось постоянно открывать Google Translate как новую страницу, что изрядно напрягало. Поддерживает какое-то просто неадекватно большое количество сервисов для перевода, однако Google Translate, конечно же, имеется.

7. Конвертер валют PRO

image

Конвертерами валют с каждым днем становится пользоваться все страшнее и страшнее, однако виноваты в этом конечно же не они. Это расширение мне нравится тем, что оно позволяет конвертировать в нескольких валютах одновременно, и даже поддерживает крипту и драгоценные металлы (!), а так же возможность автоматического перерасчета курса валют на странице. Добавляете нужную валюту, вводите нужную сумму напротив валюты, из которой вы хотите перевести, и получаете курс данной валюты в других валютах.

8. Strong Password Generator

image

Удобный генератор паролей с гибкими настройками. Поддерживаются буквы разного регистра, цифры, символы и даже возможность добавления своих символов (!). Имеет и историю ранее сгенерированных паролей, которую, ко всему прочему, можно и отключить.

9. OnionLink .onion plugin



Свершилось! Расширение для просмотра .onion сайтов прямо в Chrome для тех, кому важна не столько безопасность, сколько просмотр их контента. Просто установите данное расширение и переходите по ссылкам на .onion сайты или вводите их как обычные сайты в строке адреса. Расширение работает, и со своими прямыми обязанностями справляется, правда платное, хоть 64 рубля это и небольшая сумма.

10. Chrome extension source viewer

image

Расширение больше подойдет разработчикам, однако я просто не мог не добавить его в эту подборку, так как оно будет полезно и тем, кто предпочитает хранить файлы расширений локально (что довольно актуально, ибо на момент написания данной статьи некоторые расширения оказались удалены из магазина Chrome, поэтому пришлось искать их аналоги, причем в большинстве случаев это оказывались форки этих удаленных расширений. В самом Chrome удаленные расширения при этом работали и работают до сих пор. Поэтому позаботьтесь о резервных копиях заранее если не хотите остаться без любимых расширений на новом компьютере). Позволяет скачивать нужные расширения и/или просматривать их исходный код. Такие расширения можно устанавливать в дальнейшем в разделе Загрузить распакованное расширение в разделе Расширения в настройках Chrome. Работает на странице конкретного расширения в магазине расширений в Google Chrome (Настройки > Расширения > Подробнее > Перейти в Интернет-магазин Chrome).

11. SimpleExtManager

image

И на десерт настоящая бомба! Расширение для работы с расширениями и темами! Позволяет получить список установленных расширений и тем и отключать ненужные просто снимая соответствующие галочки без перехода в настройки браузера. Очень выручает когда некоторые расширения начинают чудить на некоторых сайтах, либо просто занимать место, особенно если расширений довольно много, не все они нужны часто, но удалять их при этом незачем, либо какое-то расширение просто упало (да, бывает и такое). Их можно просто отключить, а потом снова включить буквально парой кликов, и самое главное здесь то, что они остаются в самом расширении даже когда отключены, поэтому для их последующего включения не нужно проходить целый квест.

Я рассмотрел самые необходимые и удобные для работы расширения. Делитесь в комментариях расширениями, которыми пользуетесь вы, и которые удобны лично для вас, они так же могут быть полезны другим. Самые интересные и полезные я бы тоже хотел добавить в эту подборку чтобы не потерять их, и чтобы о них узнали и другие пользователи.

Благодарю за внимание!
Подробнее..

Пишем расширение-читалку для Habr

12.02.2021 08:05:33 | Автор: admin

Каждому разработчику однажды приходит в голову мысль написать что-то, чтобы упростить себе жизнь. Например, сократить время, проведённое за выполнением рутинных задач, или же позволить себе выполнять несколько действий одновременно.

В данной статье я хочу показать, как можно совместить утренние сборы на работу с прочтением статей на Habr. Для этого мы напишем простое расширение для браузеров на базе chromium (в частности, Chrome и Opera), которое будет зачитывать для нас вслух открытый во вкладке пост на Habr.

Расширение может быть использовано для чтения статей как на русском языке, так и на английском.

Автор туториалаАвтор туториала

Шаг 1. Определим состав расширения

Наше расширение будет состоять из нескольких частей:

  • манифест-файл manifest.json с описанием самого расширения, указанием его основных разрешений, прописыванием путей к иконкам, фоновым скриптами т.д.;

  • HTML-страница popup.html и CSS-файл style.css для popup-формы, на которой будет расположена панель управления воспроизведением аудио;

  • фоновый JavaScript-файл content.js, который будет обращаться к странице с открытым постом и воспроизводить её текстовое содержимое;

  • JavaScript-файл popup.js для popup-формы, с помощью которого фоновому скрипту будут передаваться команды пользователя, заданные через popup-форму;

  • иконки расширения 3 размеров: 128x128, 48x48, 16x16 пикселей.

В итоге получаем примерно такую структуру:

Структура проектаСтруктура проекта

Шаг 2. Подготавливаем манифест-файл

С помощью манифеста мы:

  • сообщаем о том, что мы сделали за расширение;

  • указываем, где хранятся его иконки;

  • запрашиваем доступы к вкладкам;

  • сообщаем о том, что будем выполнять фоновые скрипты;

  • указываем, какой popup мы будем использовать.

Здесь также присутствует разрешение на использование localStorage, если вы захотите менять и сохранять настройки без модификации кода. Пример расширения с применением настроек есть у меня на GitHub.

Содержимое manifest.json
{  "manifest_version": 2,  "name": "Habr Reader",  "description": "Расширение позволяет воспроизводить текст на странице со статьей на Хабре с возможностью изменения языка и скорости воспроизведения",  "version": "1.01",  "developer": {    "name": "Enji Rouz",    "url": "https://github.com/EnjiRouz/Habr-Reader-Extension"  },  "icons": {    "16": "res/icon16.png",    "48": "res/icon48.png",    "128": "res/icon128.png"  },  "permissions": [    "storage",    "http://*/*",    "https://*/*",    "tabs",    "contextMenus"  ],  "background": {    "scripts": ["js/content.js"],    "persistent": true  },  "browser_action": {    "default_icon": "res/icon128.png",    "default_popup": "popup.html",    "icon_128": "res/icon128.png"  },  "content_scripts": [{    "matches": ["<all_urls>"],    "js": ["js/content.js"]  }],  "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"}

Шаг 3. Делаем popup-форму для управления воспроизведением

С помощью данной формы мы будем ненапрямую:

  • запускать проигрывание синтезированной речи;

  • ставить воспроизведение на паузу;

  • полностью останавливать воспроизведение;

  • менять скорость воспроизведения;

  • менять язык речи с русского на английский, и наоборот.

Для этого нам потребуется сделать в popup.html несколько кнопок для управления воспроизведением, поле для ввода скорости и переключатель для языков. К странице мы привяжем файл стилей style.css, а также скрипт popup.js, который мы будем запускать после того, как форма полностью загрузится. Для этого добавим после его определения ключевое слово defer.

Содержимое popup.html
<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <link rel="stylesheet" href="css/style.css" type="text/css"/>     <script type="text/javascript" src="js/popup.js" defer></script>     <title>Habr Reader</title> </head> <body> <div class="tool-bar">     <ul>         <li>             <button id="play-button"></button>         </li>         <li>             <button id="pause-button"></button>         </li>         <li>             <button id="stop-button"></button>         </li>         <li>             <label for="speed">Speed</label>             <input type="number" name="speed" id="speed" placeholder="1" value="1" min="0.5" max="2.0"                    step="0.1">         </li>             <li>             <label><input type="radio" name="speech-language" value="ru-RU" id="ru" checked>ru-RU</label>         </li>         <li>             <label><input type="radio" name="speech-language" value="en-US" id="en">en-US</label>         </li>     </ul> </div> </body> </html>
Содержимое style.css
body{    width:180px;    height:60px;    font-family: arial, serif;    font-size: 12px;}.tool-bar{    display: block;    width: 180px;    height: 60px;    line-height: 30px;    background-color: #242424;}.tool-bar ul{    list-style-type: none;    margin: 0;    padding: 0;}.tool-bar ul li{    display: inline-block;    margin: 0;    padding: 0;}button{    background: none;    color: inherit;    border: none;    padding: 0;    font: inherit;    cursor: pointer;    outline: inherit;}.tool-bar ul li button, label{    padding: 0 4px;    text-decoration: none;    color: #FFFFFF;}.tool-bar ul li button:hover{    text-decoration: underline;}input {    width:30px;    padding: 6px 0 4px 10px;    border: 1px solid #9e9e9e;    background: #242424;    border-radius: 4px;    color: #FFFFFF;}

Итоговый вид нашей popup-формы довольно прост и лаконичен. Здесь продемонстрировано, как форма будет отображаться при нажатии на иконку расширения:

Раскрытая popup-форма расширенияРаскрытая popup-форма расширения

Кстати, необязательно каждый раз загружать расширение в браузер, чтобы посмотреть, как смотрится форма. Достаточно просто открыть HTML-файл, к которому привязан файл со стилями с помощью браузера.

Упаковку самого расширения мы рассмотрим в конце.

Шаг 4. Передаём управление фоновому скрипту из popup-формы

Для передачи команд фоновому скрипту идальнейшей обработки содержимого активной вкладки нам потребуется определить события, которые будут происходить при взаимодействии с каждым активным элементом на popup-форме.

Для этого на каждое событие мы добавим обращение к активной вкладке текущего окна, в котором передадим сообщение. В нём мы укажем следующее:

  • название команды, которую нужно выполнить, например, todo: "play", чтобы сообщить, что мы хотим начать либо продолжить воспроизведение;

  • значения переменных, которые нужны будут для выполнения этой команды, например, newSpeed: speed.value, lang: language,где мы передадим новое значение скорости и языка.

Содержимое popup.js
// определение кнопокconst playButton = document.getElementById("play-button");const pauseButton = document.getElementById("pause-button");const stopButton = document.getElementById("stop-button");// определение полей вводаconst speed = document.getElementById("speed");// назначение действий на соответствующие кнопки/поляif(playButton)    playButton.addEventListener("click", play);if(pauseButton)    pauseButton.addEventListener("click", pause);if(stopButton)    stopButton.addEventListener("click", stop);if(speed)    speed.addEventListener("input", changeSpeed);// применение настроек на странице происходит при помощи их передачи в сообщении,// предназначенном для background скриптаfunction play(){    // определение выбранного языка воспроизведения    let language = document.querySelector('input[name="speech-language"]:checked').value;    chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {        chrome.tabs.sendMessage(tabs[0].id, {todo: "play", newSpeed: speed.value, lang: language});    });}function pause(){    chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {        chrome.tabs.sendMessage(tabs[0].id, {todo: "pause"});    });}function stop(){    chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {        chrome.tabs.sendMessage(tabs[0].id, {todo: "stop"});    });}function changeSpeed(){    chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {        chrome.tabs.sendMessage(tabs[0].id, {todo: "changeSpeed", newSpeed: speed.value});    });}

Шаг 5. Пишем фоновый скрипт для синтеза речи

На самом деле,браузер уже содержит встроенные возможности для синтеза речи. Их мы и будем использовать.

Кстати, если вам хочется побаловаться с браузерным синтезом речи, вот мой проект на GitHub и страница для тестирования, которая будет работать даже со смартфона (за исключением некоторых встроенных в приложения браузеров).

Вот, что будет происходить в нашем фоновом скрипте:

  1. При загрузке страницы, содержащей элемент с ID "post-content-body", скрипт будет рекурсивно складывать содержимое текстовых элементов внутри родительского, чтобы сформировать текст для будущего синтеза (это гораздо проще, чем запрашивать разрешение на использование Habr API, но стоит учитывать, что однажды этот ID может поменяться);

  2. По окончании обхода элементов будет выдано сообщение о том, что пост готов к прочтению (но вы можете вместо этого модифицировать код так, чтобы воспроизведение аудио начиналось сразу после подготовки текста);

  3. Далее ожидается действие пользователя через popup-форму. Как только фоновый скрипт получит сообщение от popup-формы с командой и/или значением переменных, то он инициализирует переменные внутри себя и запустит соответствующие функции, например, найдёт голос для нужного языка, а затем начнёт синтез речи в случае нажатия на кнопку воспроизведения.

Конечно же, символы, содержимое таблиц, ссылки и некоторое другое нестандартное текстовое наполнение будут криво обрабатываться встроенным синтезом речи, да и не всегда ударение будет верным. Но зато, в целом вышла неплохая автоматизация ^_^

Далее вы можете модифицировать код на своё усмотрение.

Содержимое content.js
// создание средства синтеза речи и получение списка голосовconst synthesis = window.speechSynthesis;const voices = synthesis.getVoices();const utterance = new SpeechSynthesisUtterance();// текущий символ, который синтезируется в данный момент времениlet currentCharacter;// назначение события на момент, когда речь перестанет проигрыватьсяutterance.addEventListener("end", () => {    currentCharacter = null;});// получение символа, который синтезируется в данный моментutterance.addEventListener("boundary", event => {    currentCharacter = event.charIndex;});// переменные: язык речи, скорость проигрывания аудио, воспроизводимый текстlet speechLanguage = "ru-RU";let playerSpeed = 1;let textToPlay = "Открой статью, а потом уже нажимай сюда";/** * Рекурсивно прибавляет текстовое содержимое дочерних элементов для формирования текста поста * @param elementForSearchingIn - родительский элемент, в котором будет осуществляться поиск текстовых нодов */function joinTextNodes(elementForSearchingIn) {    if (elementForSearchingIn.hasChildNodes()) {        elementForSearchingIn.childNodes.forEach(function (node) {            joinTextNodes(node)        });    } else if (elementForSearchingIn.nodeType === Text.TEXT_NODE) {        textToPlay += " " + elementForSearchingIn.textContent;    }}/** * Поиск голоса для заданного языка речи * @param lang - заданный язык речи * @returns {null|SpeechSynthesisVoice} */function findVoice(lang) {    for (let i = 0; i < voices.length; i++) {        if (voices[i].lang === lang)            return voices[i];    }    return null;}/** * Проигрывание синтезированного высказывания */function playTextToSpeech() {    // если проигрывание речи было поставлено на паузу - происходит продолжение проигрывания    if (synthesis.paused && synthesis.speaking)        return synthesis.resume();    if (synthesis.speaking) return;    // определение параметров синтезируемой речи    utterance.text = textToPlay;    utterance.rate = playerSpeed || 1;    utterance.lang = speechLanguage;    utterance.voice = findVoice(utterance.lang);    // проигрывание речи    synthesis.speak(utterance);}/** * Установка проигрывания синтезированной речи на паузу */function pauseTextToSpeech() {    if (synthesis.speaking)        synthesis.pause();}/** * Остановка (прекращение) проигрывания синтезированной речи */function stopTextToSpeech() {    synthesis.resume();    synthesis.cancel();}/** * Изменение скорости речи в режиме реального времени */function changeSpeed() {    if (synthesis.paused && synthesis.speaking) return;    if (currentCharacter === null) return;    stopTextToSpeech();    playTextToSpeech(utterance.text.substring(currentCharacter));}/** * Осуществление взаимодействия pop-up формы с background скриптом при помощи отправки-получения сообщений * в активной вкладке с передачей в них необходимых для работы параметров. * Переданные параметры перезаписывают предыдущие настройки */chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {    switch (request.todo) {        case "play":            playerSpeed = request.newSpeed;            speechLanguage = request.lang;            playTextToSpeech();            break;        case "changeSpeed":            playerSpeed = request.newSpeed;            changeSpeed();            break;        case "pause":            pauseTextToSpeech();            break;        case "stop":            stopTextToSpeech();            break;    }    sendResponse({        response: "Message received"    });});// подготовка текста поста к чтениюwindow.onload = function () {    let contentBody = document.getElementById("post-content-body");    if (contentBody) {        textToPlay = "";        joinTextNodes(contentBody);        alert("Текст поста готов к чтению")    }};

Шаг 6. Упаковка и установка расширения

Я опишу упаковку и установку для Opera и Chrome. В других браузерах процесс, скорее всего, будет аналогичным, поскольку основные действия мы будем делать через стандартный раздел браузера "Расширения".

Для того, чтобы упаковать расширение, нужно проделать следующее:

  • Opera Меню Расширения Расширения включить Режим Разработчика Упаковка расширения

  • Google Chrome Дополнительные инструменты Расширения включить Режим Разработчика Упаковка расширения

На выходе вы получите crx-файл расширения, который, по факту, представляет собой архив с запакованным проектом.

Расширение можно установить через раздел "Расширения" двумя путями:

  • если модификация не требуется - для ряда браузеров достаточно перетащить подготовленный crx-файл из папки с проектом в окно с открытым разделом расширений и нажать на "Установить";

  • если была сделана модификация кода и требуется тестирование перед упаковкой(или браузер блокирует установку), то в окне с разделом расширений требуется нажать на "Загрузить распакованное расширение" и выбрать в диалоговом окне папку с проектом (предварительно убедитесь, что у вас включен режим разработчика).

Заключение

На этом мой небольшой туториал подошёл к концу.

Если у вас есть собственные расширения, которыми вы хотите поделиться - оставляйте в комментариях ссылки на них вместе с кратким описанием.

Кстати, мой хороший товарищ сделал на основе моего проекта расширение для того, чтобы оставлять для себя комментарии к объявлениям на Avito. Кому интересно - код и релиз вы найдёте на его GitHub.

Документированные исходники моего расширения и его запакованную версию можно найти здесь.

Спасибо за внимание! До новых встреч!

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru