You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
if(process.env.NODE_ENV==='development'){consteventSource=newEventSource(`http://${process.env.REACT_APP__HOST__}:${process.env.REACT_APP__PORT__}/reload/`);console.log('--- 开始监听更新消息 ---');eventSource.addEventListener('content_changed_reload',async({ data })=>{const[tab]=awaitchrome.tabs.query({active: true,lastFocusedWindow: true,});consttabId=tab.id||0;console.log(`tabId is ${tabId}`);awaitchrome.tabs.sendMessage(tabId,{type: 'window.location.reload',});console.log('chrome extension will reload',data);chrome.runtime.reload();});}
chrome.runtime.onMessage.addListener((msg: MessageEventType,sender: chrome.runtime.MessageSender,sendResponse: (response: string)=>void)=>{console.log('[content.js]. Message received',msg);sendResponse('received');if(process.env.NODE_ENV==='development'){if(msg.type==='window.location.reload'){console.log('current page will reload.');window.location.reload();}}});
build zip
懒人自动化最后一步,生产编译后自动 zip 包。
一、新增 config/scripts/zip.js
constfs=require('fs');constpath=require('path');constzipFolder=require('zip-folder');constmanifestJson=require('../build/manifest.json');constSrcFolder=path.join(__dirname,'../build');constZipFilePath=path.join(__dirname,'../release');constmakeDestZipDirIfNotExists=()=>{if(!fs.existsSync(ZipFilePath)){fs.mkdirSync(ZipFilePath);}};functionremoveSpace(str,str2){returnstr?.replace(/\s+/g,str2||'');}constmain=()=>{const{ name, version }=manifestJson;constzipFilename=path.join(ZipFilePath,`${removeSpace(name,'_')}-v${removeSpace(version)}.zip`);makeDestZipDirIfNotExists();console.info(`Zipping ${zipFilename}...`);zipFolder(SrcFolder,zipFilename,(err)=>{if(err){returnconsole.err(err);}console.info('Zip is OK');});};main();
原文
Chrome Manifest V3 + Webpack5 + React18 热更新提升开发效率。
解决的问题
开发 Chrome 插件的同学想必都会遇到一个问题:
每次更新代码需要在
chrome://extensions
扩展程序中特别的繁琐,严重影响开发效率。
本文借助 create-react-app reject 后的工程,改造实现:
实现过程
进入工程目录
打包多文件
可能需要输出以下打包文件:
一、 新增
config/pageConf.js
,开发只需按需配置需要打包的输出的文件,内部自动会处理。对应说明
二、修改
config/paths.js
,处理第一步里的配置路径导出供后续使用
三、修改
config/webpack.config.js
,配置文件打包输出,固定打包文件名,因为需要在插件 manifest.json 中配置四、修改
config/webpackDevServer.config.js
,webpack 为了提升开发时效率,默认打包文件存储在内存中。我们需要把文件打包在硬盘 build 文件夹中,然后在 Chrome 管理扩展程序中加载已解压的 build 目录。
devMiddleware: { + writeToDisk: true, },
监听 public 目录
此目录可以放置一些 Chrome 插件需要的配置静态资源,如图标,manifest.json。目录下文件变动时,实时复制到 build 中。
一、修改 scripts/build.js
// 删除 copy 代码 - copyPublicFolder()
二、新增
yarn add copy-webpack-plugin -D
三、修改
config/webpack.config.js
,监听 public 文件改动,复制最新到 buildHRM 热更新配置
由于 Chrome 插件的 CSP 安全问题,不支持例如 content 热更新。
需要修改默认 HRM 配置,手动配置热更新文件,排除 content/background。
一、修改
config/webpackDevServer.config.js
二、修改
scripts/start.js
中checkBrowsers().then
里的entry
三、修改
config/webpack.config.js
,不允许产生运行时内联代码CRX content 变更自动加载
上述可知,content 是无法支撑热更新自动加载的,
但 chrome content/background 被修改我们又不希望每次去插件管理界面点击刷新按钮。
一、修改
scripts/start.js
,webpack-dev-sever 启动时,新增/reload
请求监听,并新建 SSE二、在 devServer.startCallback 中新增 hooks 监听 content/background 变化时发送 SSE 消息
三、新增
src/pages/background/index.ts
,监听 SSE,收到文件变更通知,先利用chrome.tabs.sendMessage
给 content 发消息,刷新当前 Tab 页,然后
chrome.runtime.reload()
自动加载插件四、新增
src/pages/content/index.ts
,如果 content 变动且跟当前页 Tab 页有通信,需要刷新当前页。同样可以自动化实现,在 content 中监听 background 消息 reload Tab 页。
build zip
懒人自动化最后一步,生产编译后自动 zip 包。
一、新增
config/scripts/zip.js
二、修改 package.json
+ "build": "node scripts/build.js && node scripts/zip.js",
最终效果
太懒了,这里就不搞动态图了,各位看官老爷自行获取代码运行查看效果。
cra-crx-boilerplate
The text was updated successfully, but these errors were encountered: