Chrome插件學習筆記(三)

Chrome插件學習筆記(三)

參考文章:

  • https://blog.csdn.net/guoqiankunmiss/article/details/135847091
  • https://blog.csdn.net/guoqiankunmiss/article/details/135974364

1、項目搭建

在前兩篇文章中使用的原生js去操作dom,很費勁并且效果并不是很好,于是決定使用vue3來開發瀏覽器插件

1.1、創建項目

npm create vite@latest

1.2、依賴安裝

# @types/node、@types/ws:用來補充類型信息
# chokidar:用來監聽文件變化
# chrome-types:chrome相關的類型提示
# rollup-plugin-copy:用于復制manifest.json
# ws:用于創建WebSocket
npm install -D @types/node @types/ws chokidar chrome-types rollup-plugin-copy ws

1.3、vite.config.ts

import {defineConfig} from 'vite'
import vue from '@vitejs/plugin-vue'
import * as path from "node:path";
import copy from "rollup-plugin-copy";// https://vite.dev/config/
export default defineConfig({server: {port: 5500,},plugins: [vue(),copy({targets: [{src: 'src/manifest.json',dest: path.resolve(__dirname, 'dist')}],hook: 'writeBundle'}),],build: {outDir: path.resolve(__dirname, 'dist'),rollupOptions: {input: {side_panel: path.resolve(__dirname, 'src/index.html'),content_script: path.resolve(__dirname, 'src/content_script/content_script.ts'),service_worker: path.resolve(__dirname, 'src/service_worker/service_worker.ts'),},output: {assetFileNames: 'assets/[name]-[hash].[ext]',chunkFileNames: 'js/[name]-[hash].js',entryFileNames: (chunkInfo) => {const facadeModuleId = chunkInfo.facadeModuleId!const baseName = path.basename(facadeModuleId, path.extname(facadeModuleId))const saveArr = ['content_script', 'service_worker']return `[name]/${saveArr.includes(baseName) ? baseName : chunkInfo.name}.js`;},name: '[name].js'}}}
})

1.4、manifest.json

{"name": "Assistant","description": "A tool for quick conversations with AI","version": "0.0.1","manifest_version": 3,"permissions": ["sidePanel"],"host_permissions": ["*://*/*"],"action": {"default_title": "Click to switch side panel"},"side_panel": {"default_path": "src/index.html"},"background": {"service_worker": "service_worker/service_worker.js","type": "module"},"content_scripts": [{"js": ["content_script/content_script.js"],"matches": ["*://*/*"],"all_frames": true,"run_at": "document_end","match_about_blank": true}]
}

1.5、vite-env.d.ts

/// <reference types="vite/client" />
/// <reference types="chrome-types/index" />

1.6、service_worker.ts

console.log("service_worker");chrome.sidePanel.setPanelBehavior({openPanelOnActionClick: true})

1.7、content_script.ts

console.log("content_script");

1.8、index.html

index.html需要移動到src目錄下

1.9、目錄結構

在這里插入圖片描述

1.10、測試

在這里插入圖片描述

2、熱部署

熱部署的方式很多,如利用額外的插件(可參考文章https://cm-mng.bilibili.co/agent/#/mlogin),這里使用的是socket通信來實現的熱部署

2.1、.env.development

VITE_ENV_MODE=development

2.2、 .env.production

VITE_ENV_MODE=production

2.3、file_watcher.ts

import {WebSocketServer} from "ws";
import chokidar from "chokidar";
import path from "node:path";export function file_watcher(wss: WebSocketServer) {wss.on('connection', (ws) => {console.log('Client connected');// 監聽src文件夾下的所有文件,并排出node_modules下所有文件const watcher = chokidar.watch(path.join(__dirname, 'src'), {ignored: [/(^|[\/\\])\../, /node_modules/]});// 只有文件變化才會通知,如果設置成all將會通知add、change、addDir等事件watcher.on('change', (event, path) => {ws.send(JSON.stringify({type: 'reload', event, path}));});ws.on('close', () => {console.log('Client disconnected');watcher.close();});});
}

2.4、vite.config.ts

import {defineConfig, loadEnv} from 'vite'
import vue from '@vitejs/plugin-vue'
import * as path from "node:path";
import copy from "rollup-plugin-copy";
import {WebSocketServer} from "ws";
import {file_watcher} from "./file_watcher.ts";// https://vite.dev/config/
export default defineConfig((configEnv) => {// 這里取的環境變量是.env.xxxxx中的變量,根據加載的環境變量判斷是否啟動socket服務端,用于通知瀏覽器插件重新加載let env = loadEnv(configEnv.mode, process.cwd(), '');if (env.VITE_ENV_MODE === 'development') {file_watcher(new WebSocketServer({port: 5501}));}return {server: {port: 5500,},plugins: [vue(),copy({targets: [{src: 'src/manifest.json',dest: path.resolve(__dirname, 'dist')}],hook: 'writeBundle'}),],build: {outDir: path.resolve(__dirname, 'dist'),rollupOptions: {input: {side_panel: path.resolve(__dirname, 'src/index.html'),content_script: path.resolve(__dirname, 'src/content_script/content_script.ts'),service_worker: path.resolve(__dirname, 'src/service_worker/service_worker.ts'),},output: {assetFileNames: 'assets/[name]-[hash].[ext]',chunkFileNames: 'js/[name]-[hash].js',entryFileNames: (chunkInfo) => {const facadeModuleId = chunkInfo.facadeModuleId!const baseName = path.basename(facadeModuleId, path.extname(facadeModuleId))const saveArr = ['content_script', 'service_worker']return `[name]/${saveArr.includes(baseName) ? baseName : chunkInfo.name}.js`;},name: '[name].js'}}}}
})

2.5、hot_reload.ts

let timeout: numberexport function hot_reload(socket: WebSocket) {if (timeout) {clearTimeout(timeout);}socket.onopen = () => {console.log('Connected to dev server')}socket.onmessage = (event) => {const message = JSON.parse(event.data)if (message.type === 'reload') {setTimeout(() => {chrome.runtime.reload()}, 1000)}}socket.onclose = (event) => {console.log(`Socket closed: ${event.reason}`);// 斷開連接后5秒后嘗試再次連接timeout = setTimeout(() => {hot_reload(new WebSocket(`ws://localhost:5501/`))}, 5000);};socket.onerror = (error) => {console.error('Socket error:', error);};
}

2.6、service_worker.ts

import {hot_reload} from "../hot_reload.ts";console.log("service_worker");chrome.sidePanel.setPanelBehavior({openPanelOnActionClick: true})// 如果是開發環境才嘗試鏈接socket服務端
if (import.meta.env.VITE_ENV_MODE === 'development') {console.log('開發環境');hot_reload(new WebSocket(`ws://localhost:5501/`))
} else {console.log('生產環境');
}

2.7、package.json

注意這里的scripts需要修改下,開發的時候使用命令npm run watch,修改代碼后插件會自動重新加載

{"name": "assistant","private": true,"version": "0.0.0","type": "module","scripts": {"dev": "vite","watch": "vite build --watch --mode development","build": "vue-tsc -b && vite build","preview": "vite preview"},"dependencies": {"@types/node": "^24.1.0","@types/ws": "^8.18.1","chokidar": "^4.0.3","chrome-types": "^0.1.363","rollup-plugin-copy": "^3.5.0","vue": "^3.5.17","ws": "^8.18.3"},"devDependencies": {"@vitejs/plugin-vue": "^6.0.0","@vue/tsconfig": "^0.7.0","typescript": "~5.8.3","vite": "^7.0.4","vue-tsc": "^2.2.12"}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90538.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90538.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90538.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android系統中的4KB內存頁簡介

deepseek回答&#xff1a; Android系統中的4KB內存頁是虛擬內存管理的最小單位&#xff0c;其主要用途如下&#xff1a; 一、核心功能 虛擬地址映射 應用程序訪問內存時&#xff0c;系統將虛擬地址按4KB頁框映射到物理內存或磁盤空間&#xff0c;實現進程間的內存隔離和安全訪…

【Chrome】下載chromedriver的地址

下載chromedriver的地址低版本的最新版本的低版本的 http://chromedriver.storage.googleapis.com/index.html 最新版本的 https://googlechromelabs.github.io/chrome-for-testing/#stable

ISP算法——從顏色恒常性到白平衡

前面文章&#xff0c;介紹了人眼感知的物體顏色取決于光源的光譜組成與物體表面的光譜反射特性之間的相互作用。人類視覺的顏色感知是生物機制與認知智能協同作用的結果&#xff0c;人眼視網膜上的視錐細胞檢測光的顏色&#xff0c;視桿細胞分析光的亮度&#xff0c;再共同轉化…

工業缺陷檢測的計算機視覺方法總結

工業缺陷檢測的計算機視覺方法總結 傳統方法 特征提取方式&#xff1a; 顏色&#xff1a;基于HSV/RGB空間分析&#xff0c;如顏色直方圖、顏色矩等紋理&#xff1a;采用LBP、Haar、Gabor濾波器等算子提取紋理模式形狀&#xff1a;基于Hu矩、Zernike矩等數學描述符刻畫幾何特性尺…

js實現宮格布局圖片放大交互動畫

可直接運行代碼 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>五圖交互布局</title><style>* {box-sizing: border-box;margin: 0;padding: 0;}.gallery {display: grid;grid-template-c…

easyexcel流式導出

EasyExcel 支持流式導出&#xff0c;這是它的一個重要特性。流式導出可以有效解決大數據量導出時的內存溢出問題。流式導出的優勢內存友好 &#xff1a;不會一次性將所有數據加載到內存中適合大數據量 &#xff1a;可以處理百萬級甚至更多的數據性能穩定 &#xff1a;內存占用相…

廣州 VR 安全用電技術:工作原理、特性及優勢探析?

&#xff08;一&#xff09;沉浸式學習體驗? 在廣州&#xff0c;VR 用電安全培訓技術給用電安全培訓帶來變革。借助頭戴式顯示設備等硬件&#xff0c;結合 3D 建模和實時渲染技術&#xff0c;打造廣州特色用電場景。員工戴上 VR 設備進入虛擬電力場景&#xff0c;能看到電氣設…

2.Linux 網絡配置

Linux: 網絡配置 版本為centos7 網卡配置文件&#xff1a; /etc/sysconfig/network-scripts/ifcfg-ens33 [rootkami /]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet /類型&#xff1a;以太網 PROXY_METHODnone BROWSER_ONLYno BOOTPROTOnone /網絡配…

FPGA Verilog 入門語法指南

FPGA Verilog 入門語法指南 ?? 目錄 Verilog與C語言對比 基礎關鍵字 數據類型 運算符 控制結構 數值表示 阻塞與非阻塞賦值 模塊結構 預處理指令

【鴻蒙HarmonyOS Next App實戰開發】視頻提取音頻

在多媒體處理場景中&#xff0c;經常需要從視頻文件中提取純凈的音頻軌道。本文將介紹如何在HarmonyOS應用中實現這一功能&#xff0c;核心代碼基于ohos/mp4parser庫的FFmpeg能力。 功能概述 我們實現了一個完整的視頻音頻提取頁面&#xff0c;包含以下功能&#xff1a; 通過…

OpenHands:Manus 最強開源平替——本地部署與實戰指南

文章目錄?? 一、OpenHands 核心優勢&#xff1a;為何是 Manus 最佳平替&#xff1f;&#x1f9e0; 二、核心架構解析&#xff1a;多智能體如何協同工作&#xff1f;&#x1f6e0;? 三、本地化部署指南&#xff1a;Docke部署Docker 極速部署&#xff08;推薦&#xff09;&…

用 AI 做數據分析:從“數字”里挖“規律”

數據整理干凈后&#xff0c;就得分析了——算平均值、看差異、找關系&#xff0c;這些都能靠 AI 搞定。這節以“大學生在線學習滿意度”數據為例&#xff0c;教你用 AI 做描述性統計、假設檢驗、相關性分析&#xff0c;一步步從數據里挖規律&#xff0c;超詳細&#xff5e; 1. …

小程序安卓ApK轉aab文件詳情教程MacM4環境

根據Google Play的政策要求&#xff0c;自 2021 年 8 月起&#xff0c;Google Play 將開始要求新應用使用 Android App Bundle&#xff08;以下簡稱aab&#xff09; 進行發布。該格式將取代 APK 作為標準發布格式。 想了解更多關于aab的介紹可以直接閱讀android官方文檔&#x…

率先通過自動制冰性能認證,容聲冰箱推動行業品質升級

日前&#xff0c;容聲冰箱“電冰箱自動制冰性能認證”由中國家用電器研究院測試并通過&#xff0c;該認證為行業首次。這標志著中國家電行業在冰箱自動制冰功能的技術規范與品質保障領域樹立了全新里程碑&#xff0c;也將潔凈、高效的制冰體驗帶入中國家庭日常生活。目前&#…

大模型-batch之continuous batching

一、ORCA1.1 ORCA 概覽看下Continuous Batching 技術的開山之作ORCA,這個其實是融合的思路。ORCA&#xff1a;把調度粒度從請求級別調整為迭代級別&#xff0c;并結合選擇性批處理&#xff08;selective batching&#xff09;來進行優化。Sarathi[2] &#xff1a;利用Chunked P…

主要分布在背側海馬體(dHPC)CA1區域(dCA1)的時空聯合細胞對NLP中的深層語義分析的積極影響和啟示

時空聯合細胞&#xff08;Spatiotemporal Conjunctive Cells&#xff09;主要分布在背側海馬體CA1區&#xff08;dCA1&#xff09;&#xff0c;其核心功能是??同步編碼空間位置、時間信息和行為意圖??&#xff0c;形成動態的情景記憶表征。這種神經機制為自然語言處理&…

操作系統:系統程序(System Programs)

目錄 常見的系統程序類型 1?? 文件管理&#xff08;File Management&#xff09; 2?? 狀態信息&#xff08;Status Information&#xff09; 3?? 編譯器和程序開發&#xff08;Program Language Support&#xff09; 4?? 程序執行控制類&#xff08;Program Load…

【知識圖譜】Neo4j Desktop桌面版中國區被禁(無法打開)問題解決方法

【知識圖譜】Neo4j Desktop桌面版進程運行無法打開,UI 界面無法顯示問題解決辦法 前言 1.問題形式 2.原因分析 3.解決方法 3.1 方法一,斷網 3.2 方法二,手動設置代理 4.啟動Neo4j Desktop 前言 Neo4j Desktop桌面版安裝教程參考鏈接: https://zskp1012.blog.csdn.net/artic…

安裝acunetix軟件之后改www.ddosi.org.bat文件

安裝環境&#xff1a;windows11 通過網盤分享的文件&#xff1a;Acunetix_15.2.221208162_www.ddosi.org.zip 鏈接: https://pan.baidu.com/s/1FPFFr583FFFj6hxWB-Ygng?pwdjpim 提取碼: jpim 下載后文件是&#xff1a; 解壓之后&#xff0c;如下圖&#xff1a; 安裝步驟如…

pycharm安裝教程-PyCharm2023安裝詳細步驟【MAC版】【安裝包自取】

pycharm安裝教程-PyCharm2025安裝詳細步驟【MAC版】安裝安裝包獲取&#xff08;文章末尾&#xff09;今天來給大家分享 Mac 系統安裝 PyCharm&#xff0c;附帶安裝包資源安裝&#xff0c; PyCharm 相關就不敘述了&#xff0c;直接開始安裝&#xff01; 安裝 2024版本、2025年…