크롬확장프로그램 만들기 - 가이드라인! 확장프로그램 구조 설명 !
어느 날 잘쓰고 있던 학교 선배님이 만든 LMS(학습 관리 시스템)기능 확장프로그램이 학교 사이트 개편으로 인해 더 이상 쓸 수가 없어져서..내가 만들어야겠다고 생각했다..구조를 보면 간단하다. HTML+CSS+JavaScript 를 사용해서 충분히 만들 수 있다. c
크롬 확장프로그램 개발
어느 날 잘쓰고 있던 학교 선배님이 만든 LMS(학습 관리 시스템)기능 확장프로그램이 학교 사이트 개편으로 인해 더 이상 쓸 수가 없어져서..내가 만들어야겠다고 생각했다..
구조
구조를 보면 간단하다. HTML+CSS+JavaScript 를 사용해서 충분히 만들 수 있다.
-
contentscript.js 사용자가 방문하는 영역에서 작동하는 스크립트 페이지의 현재 상태에 대한 정보를 전달한다. 현재 페이지의 DOM을 읽어와서 조작이 가능하다.
-
background.js 브라우저 영역에서 작동하는 스크립트 플러그인의 이벤트 핸들러 중요한 모든 이벤트 리스너가 여기 저장된다. 이벤트가 트리거 되고, 할당된 로직을 실행할 때까지 inactive 상태로 유지된다.
-
popup.js 시각적인 기능을 담당한다. HTML과 직접 상호작용하고, background 스크립트와 함께 API를 호출 popup.html이 index.html과 같은 의미이다.
크롬 설정을 누르면 확장 프로그램에 대해서 확인할 수 있다.
확장 프로그램 관리와 Chrome 웹 스토어 방문하기가 있는데 생각보다 크롬 확장프로그램을 사용을 안하는 사람이 많다.
개발자라면 도움이 되는 확장 프로그램이 많다!! CSS viewer 라던가.. Json Viewer라던가.. 코테문제를 풀면 자동으로 깃허브에 저장된다던가..!
파일을 드래고 하거단 로드를 할 수 있는데 기본적으로
menifest 파일이 존재해야한다!!!!
Manifest 파일의 핵심 역할
Chrome 확장 프로그램의 manifest 파일(manifest.json)은 확장 프로그램의 DNA다. 이 파일은 다음과 같은 중요한 기능을 한다:
> - 확장 프로그램 신원 확립:>name, version, description 필드에 기본 정보가 들어간다.이 정보로 사용자와 Chrome 웹 스토어가 프로그램을 식별한다.
- 권한 선언:>permissions 배열에 필요한 권한이 나열된다.이는 사용자의 프라이버시와 보안을 지킨다.
- 리소스 정의:>icons, action 등에 시각적 요소의 위치가 지정된다.사용자 인터페이스 관련 파일들의 경로가 여기에 있다.
- 백그라운드 로직 설정:>background 섹션에 서비스 워커나 백그라운드 페이지가 정의된다.확장 프로그램의 '두뇌' 역할을 하는 스크립트가 여기에 지정된다.
- 콘텐츠 스크립트 선언:>content_scripts 섹션에 웹 페이지에 삽입될 스크립트가 정의된다.이를 통해 확장 프로그램이 웹 페이지와 상호작용한다.
- 보안 정책 설정:>content_security_policy에 확장 프로그램의 보안 정책이 정의된다.XSS 공격 등으로부터 확장 프로그램을 보호한다.
- API 버전 명시:>manifest_version에 사용하는 manifest 파일의 버전이 지정된다.이에 따라 Chrome이 확장 프로그램을 해석하고 실행한다.
- 웹 접근 범위 정의:>host_permissions에 접근 가능한 웹 사이트가 지정된다.사용자의 동의 하에 특정 도메인에 대한 접근 권한이 부여된다.
- 국제화 지원:>default_locale과 관련 리소스 파일로 다국어를 지원한다.이를 통해 전 세계 사용자를 위한 현지화가 가능하다.
- 웹 접근성 기능:>commands 섹션에 키보드 단축키가 정의된다.이로써 사용자 경험이 향상되고 접근성이 개선된다.천천히 읽어보면 좋다 !
menifest작성이 끝났다면 popup,contentscript,background를 작성하면 간단한 확장프로그램은 만들 수 있다.
배경색을 바꾸는 확장프로그램을 만들어 보자 !!
// manifest.json{ "name": "Simple Change Color", "description": "현재 탭의 배경색을 변경하고 텍스트를 추가하는 간단한 MV3 확장 프로그램", "version": "1.0.0", "manifest_version": 3, "permissions": [ "activeTab", "scripting" ], "host_permissions": [ "<all_urls>" ], "action": { "default_popup": "popup.html" }, "content_scripts": [ { "matches": [ "<all_urls>" ], "js": [ "contentScript.js" ], "run_at": "document_idle" } ]}
// popup.html<!DOCTYPE html><html>
<head> <title>Change background Color</title></head>
<body> <button id="changeColor">background Color change</button> <button id="addText">text add</button> <script src="popup.js"></script></body>
</html>
// popup.jsdocument.getElementById('changeColor').addEventListener('click', async () => { let [tab] = await chrome.tabs.query({ active: true, currentWindow: true }); if (chrome.runtime.lastError) { console.error(chrome.runtime.lastError); return; } if (tab && !tab.url.startsWith("chrome://")) { try { await chrome.scripting.executeScript({ target: { tabId: tab.id }, function: setPageBackgroundColor, }); console.log("Script executed successfully"); } catch (error) { console.error("Error executing script:", error); } } else { console.error("Cannot execute script on this page"); }});
function setPageBackgroundColor() { document.body.style.backgroundColor = `rgb(${Math.random() * 255}, ${Math.random() * 255}, ${Math.random() * 255})`;}
document.getElementById('addText').addEventListener('click', async () => { let [tab] = await chrome.tabs.query({ active: true, currentWindow: true }); if (chrome.runtime.lastError) { console.error(chrome.runtime.lastError); return; } if (tab && !tab.url.startsWith("chrome://")) { try { const response = await chrome.tabs.sendMessage(tab.id, {action: "addText"}); console.log("Message sent successfully", response); } catch (error) { console.error("Error sending message:", error); // Content Script가 로드되지 않았을 수 있으므로, 스크립트를 주입하고 다시 시도합니다. try { await chrome.scripting.executeScript({ target: { tabId: tab.id }, files: ["contentScript.js"] }); const response = await chrome.tabs.sendMessage(tab.id, {action: "addText"}); console.log("Message sent successfully after injecting content script", response); } catch (injectError) { console.error("Error injecting and executing content script:", injectError); } } } else { console.error("Cannot send message to this page"); }});
// background.jschrome.runtime.onInstalled.addListener(() => { console.log('배경색 변경기가 설치되었습니다.');});
// contentScript.jschrome.runtime.onMessage.addListener((request, sender, sendResponse) => { if (request.action === "addText") { const newElement = document.createElement('div'); newElement.textContent = '이 텍스트는 확장 프로그램에 의해 추가되었습니다!'; newElement.style.position = 'fixed'; newElement.style.top = '10px'; newElement.style.right = '10px'; newElement.style.backgroundColor = 'yellow'; newElement.style.padding = '10px'; newElement.style.zIndex = '9999'; document.body.appendChild(newElement); sendResponse({status: "Text added successfully"}); } return true; // 비동기 응답을 위해 필요합니다.});파일은 위 주석에 나와있는 것처럼 나눠야 한다.
이렇게 파일이 만들어지면 위에서 확장프로그램 개발자모드를 체크! 하고 파일을 로드하면 된다.
이런식으로 작동이 잘 되는걸 볼 수 있다. !!