Flutter 写 Chrome 插件

Chrome 插件

Chrome 插件是扩展 Chrome 功能的小程序。 Google Chrome 具有标准化的 API,插件可以通过该 API 在浏览器中执行各种任务。

在日常生活中,我们使用浏览器插件来执行各种任务,例如广告和跟踪器拦截、语法纠正和翻译。这些扩展是使用 JavaScript 编写的,并使用 Chrome 扩展 API 与浏览器交互。由于 Flutter Web 项目是用 JavaScript 编译的,因此我们可以通过一些小调整使用 Flutter 构建 Chrome 扩展。

步骤

要使用 Flutter 创建 Chrome 扩展程序,我们需要执行以下步骤:

1、创建flutter web 项目

首先创建一个 flutter web 项目,然后需要编辑 project>web>index.html文件。 从 index.html 文件中删除所有不必要的元标记,并向 <html> 元素添加显式宽度和高度。具体的修改后的index.html 如下所示:

xml 复制代码
<html style="height: 600px; width: 300px">
  <head>
    <meta charset="UTF-8" />
    <title>chromextension</title>
  </head>
  <body>
    <script src="main.dart.js" type="application/javascript"></script>
  </body>
</html>

上面的代码中,我们看到重定向到标签中的 main.dart.js 脚本。

xml 复制代码
<script src="main.dart.js" type="application/javascript"></script>

2、为 Flutter Web 配置manifest.json文件

编辑 project > web > manifest.json 文件,该文件包含所有应用程序配置,旨在为我们的 Flutter Web 应用程序提供渐进式 Web 应用程序 (PWA) 功能(要详细了解如何使用 Flutter 构建 PWA,请查看这篇文章。)。

因此Chrome 浏览器还需要 manifest.json 文件来注册扩展程序。因此,要使插件能够正常地工作,请删除 manifest.json 文件中的内容,并用以下代码替换它们。

json 复制代码
{  
"name": "sample chrome extension",  
"description": "demo",  
"version": "1.0.0",  
"content_security_policy": {  
"extension_pages": "script-src 'self' ; object-src 'self'"  
},  
"action": {  
"default_popup": "index.html",  
"default_icon": "icons/Icon-192.png"  
},  
"manifest_version": 3  
}

在文件的action字段中,将设置为默认的弹出页面。这样,当您点击浏览器顶部栏中的扩展程序图标时,就会弹出该页面。

3、处理内容安全策略,使我们的 Chrome 扩展程序真正在浏览器环境中运行

内容安全策略 (CSP) 是浏览器中的一个安全层,可保护用户免受跨站点脚本和数据注入攻击。通常,浏览器信任来自服务器的内容。跨站点脚本滥用这种信任并在浏览器中运行恶意代码。

使用 CSP,开发人员可以在 HTTP 标头中指定可信域。支持 CSP 的浏览器将仅执行来自该特定域的脚本,并忽略内联脚本和事件处理 HTML 属性。

查看 manifest.json 文件中的 CSP。这里,我们将script-src和object-src定义为self。因此,浏览器不会执行内联脚本和来自其他来源的脚本。在开发者模式下,您会收到 CSP 错误。

4、将可选的后台脚本添加到我们的 Flutter Chrome 扩展中

后台脚本是基于事件的程序,可对浏览器中的某些事件做出反应。这些脚本对于 Chrome 扩展来说是可选的。如果您正在扩展中开发某些需要执行后台代码的功能,那么自定义后台脚本会派上用场。

要将后台脚本添加到 Flutter Chrome 扩展程序,请在 目录中添加一个新文件background.js。 在您的 manifest.json 文件中注册后台脚本,填下一下代码:

css 复制代码
 "background": {
    "service_worker": "background.js"
  },

要了解关于后台脚本的详情,请查看Chrome 开发者文档。

6、构建 Flutter Web 项目

Flutter Web 项目构建使用两种的渲染模式。

1、HTML 渲染器

使用 HTML 元素、CSS、Canvas 元素和 SVG 元素的组合。

2、CanvasKit渲染器

使用Skia作为渲染引擎并绘制像素完美的小部件。 CanvasKit 渲染器会增加应用程序的下载大小约 2 MB。

如果我们在使用 flutter build web 命令构建 Flutter Web 项目时未指定渲染器,Flutter 将在移动浏览器中使用 HTML 渲染的 Web 应用程序和 CanvasKit 渲染的桌面浏览器中的 Web 应用程序。

但是,Chrome 扩展程序不支持 CanvasKit 渲染的应用 。因此,请在构建时添加 --web-renderer html 标志以仅生成 HTML 呈现的应用程序。

Flutter Web 的另一个问题是构建输出中动态生成的代码。此行为会导致浏览器中出现 CSP 错误。要禁用动态生成的代码,请在 Flutter 构建命令中使用 --csp 标志。

因此,要使用 Flutter 制作优化的 Chrome 扩展,构建命令应该如下所示。

css 复制代码
flutter build web - web-renderer html - csp

7、 Chrome 插件实际使用

本地安装

构建完成后,我们进入chrome://extensions/page。我们从右上角打开开发者模式。 打开后,我们点击左上角的Load Unpacked按钮。从这里我们选择 project > build > web 文件夹。

上架到 Chrome 商店

这里主要要注册一个Chrome 开发者,具体可以查看在 Chrome 应用商店中发布一文

结尾

更多的创建和发布自定义 Chrome 应用和扩展程序内容,具体可以点击下方链接 support.google.com/chrome/a/an...

相关推荐
一水鉴天13 分钟前
统一对象拓扑(UOT)设计全链定稿:从三件事分离到三继承 之1 20261010(豆包“查看聊天内容”继续)
前端·css
栖凤24 分钟前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python
粥里有勺糖24 分钟前
视野修炼第136期 | 前端小恐龙"Deno"被收购
前端·github·ai编程
修炼的dance29 分钟前
页面塞了13.88 MB字体,导出的PDF只有71 KB
前端
qq_3691736330 分钟前
如何将 AI 生成的 HTML 网页发布成在线链接?不用自己搭建服务器
前端·人工智能·html·效率工具·html 发布
风花一世月37 分钟前
⚡ 我把一座含氢能源园区搬进了浏览器(五类能流实时算守恒,在线直接玩)
前端·人工智能
羲云1 小时前
Claude 越界事件之后:Agent 权限设计为什么不能只靠提示词
前端
行者全栈架构师1 小时前
【鸿蒙心迹】鸿蒙网络请求架构实战——@ohos.net.http 到 Axios 封装、拦截器与统一错误处理(HarmonyOS 7.x)
前端·算法·架构
全栈Agent 小李1 小时前
【无标题】
前端·后端·agent·ai编程·全栈·cursor·mcp
羲云1 小时前
别让 AI 凭记忆做调研:给 WorkBuddy 接上可核验的实时搜索
前端