前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >插件构建之plasma

插件构建之plasma

作者头像
Maic
发布于 2025-02-12 06:23:42
发布于 2025-02-12 06:23:42
8700
代码可运行
举报
文章被收录于专栏:Web技术学苑Web技术学苑
运行总次数:0
代码可运行

过去一年,开发了两款插件并上架谷歌商店,在最初技术调研时原本想使用plasma,考虑插件包的体积与其他未知原因,最终我还是选择了webpack5搭建了一个基础的chrome插件,具体可参考之前写的一篇文章#放弃plasmo,webpack5搭建了一个chrome基础插件,因为原生的插件配置也非常简单。通常的插件api使用也踩了不少坑,但从新回顾,发现plasma解决了我当初插件业务开发中的很多问题,也真正做到了让开发者只关注业务本身就行。

初始化一个插件项目

按照官方教程,初始化一个插件非常简单,使用一下命令就行,按照指定命令提示,快速初始化了一个插件项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
pnpm create plasmo

我们看到初始化后的项目是下面这样的

我们发现这是一个原始的构建插件工程项目,当我们执行pnpm run dev时,会生成一个build文件夹,我们只需要打开chrome插件的开发者模式,添加这个build

此时我们加载完插件后,popup.html插件就是这样的

我们修改popup.tsx的任何一行代码时,此时会热更新到插件,无需重新加载插件,这是我之前使用webpack5构建插件未解决的问题,因为我们次修改后,需要build,重新加载,才能生效,这种体验有点糟糕。但是plasmo就完美解决插件热更新问题

调整项目文件夹名

我们看到初始化项目根目录的popup.tsx就是我们插件打开的popup页面,但是可以在根目录下新建一个popup文件夹

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
// popup/index.tsx
import { useState } from "react"

function IndexPopup() {
  const [data, setData] = useState("")

  return (
    <div>
      <h1>公众号:Web技术学苑</h1>
    </div>
  )
}

export default IndexPopup

在初始化后的文件夹,我们可以使用src来组织我们的插件,具体可以参考src,从扩展页面中可以发现,在插件中的一些页面可以组织成以下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
# contents/index.tsx
# popup/index.tsx
# options/index.tsx
# newtab/index.tsx
# sidepanel/index.tsx
# devtools/index.tsx

我们发现popup页面的样式如何控制

css module

我们看下popup页面,我们引入的scss对应的index.module.scss

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
.app {
  width: 360px;
  height: 600px;
}

popup

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
import { useState } from "react"
import style from "./index.module.scss"

function IndexPopup() {
  const [data, setData] = useState("")

  return (
    <div className={style["app"]}>
      <h1>公众号:Web技术学苑</h1>
    </div>
  )
}

export default IndexPopup

看下页面结果

我们会发现plasma天然支持css module,真正加载插件的时候,会把scss编译成css

contents

插件中,popup是插件的一个气泡页面,90%的插件都会有这个气泡,但是我们也会发现一些安装的插件会改变我们浏览器网页的内容,为什么会改变我们浏览网页的内容呢,真正影响的当前页面布局的是contents

如何在网站插入内容?我们知道插件的content.js是可以获取到当前网页的浏览器内容的,也就是说可以操作当前网页的dom,你可以理解成加载当前网页后,chrome插件给开发者开了一个黑盒,开发者只要用户安装了这个插件,我就可以改变当前页面的dom

index.module.scss

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
.app {
  width: 100%;
  text-align: center;
  padding: 10px 0;
  color:red;
}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
// contents/index.tsx
import React, { memo } from "react"

import style from "./index.module.scss"

interface Props {}

const Index: React.FC<Props> = (props) => {
  const {} = props
  return <div className={style["app"]}>hello,欢迎关注公众号Web技术学苑</div>
}

export default memo(Index)

我们发现css没有作用,但是页面内容已经插入的当前网页的html中

我们首页会发现plasma会创建一个plasmo-csuiwebComponent,而且插入到html的根节点上,且样式不生效,那如何使得样式生效呢

导出默认getStyle

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
// contents/index.tsx
import type { PlasmoGetStyle } from "plasmo"
import React, { memo } from "react"
// 引入默认scss文件
import styleText from "data-text:./index.module.scss"
import style from "./index.module.scss"
// 引入默认样式
export const getStyle: PlasmoGetStyle = () => {
  const style = document.createElement("style")
  style.textContent = styleText
  return style
}
interface Props {}

const Index: React.FC<Props> = (props) => {
  const {} = props
  return <div className={style["app"]}>hello,欢迎关注公众号Web技术学苑</div>
}

export default memo(Index)

所以样式就生效了,我们发现在contents引入的cssmodule并不会像在popup一样,而是需要getStyle这样的接口,动态插入的style

如何在指定域名中生效,现在默认是所有网站都会生效,因此我想指定网址才生效呢,我们需要导出config即可,并配置matches指定域名,然后重新运行项目即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
// contents/index.tsx
export const config: PlasmoCSConfig = {
  matches: ["https://www.baidu.com/*"],
  all_frames: true
}
...

如何插入对应页面节点上

我们发现以上的webComponent是插入在html上的,在通常情况下,有可能实际业务中会遇到插入到页面的某个节点上,所以如何将content的内容插入到节点上

  • 主要是要导出getOverlayAnchor,然后绑定页面具体的节点
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
// contents/overlayAnchor.tsx
import type {
  PlasmoCSConfig,
  PlasmoCSUIProps,
  PlasmoGetOverlayAnchor
} from "plasmo"
import React from "react"

export const config: PlasmoCSConfig = {
  matches: ["https://www.baidu.com/*"],
  all_frames: true
}
export const getOverlayAnchor: PlasmoGetOverlayAnchor = () =>
  document.querySelector(".quickdelete-wrap")

const ContentForQuick = () => (
  <span
    style={{
      borderRadius: 4,
      background: "red",
      height: "44px",
      display: "flex",
      alignItems: "center"
    }}>
    公众号:Web技术学苑
  </span>
)

export default ContentForQuick

以上就是达到我想要的目标了,不过插入的内容依旧是webCompoent

options

通常来讲这可能是插件内部的设置页面,我们看下如何在popup中或者content中如何打开插件中内部的页面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
// options/index.tsx
import React, { memo } from "react"
interface Props {}
const Set: React.FC<Props> = (props) => {
  const {} = props
  return <div>我是设置页面</div>
}

export default memo(Set)

我们在popup弹出窗口中打开

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
...
function IndexPopup() {
  const [data, setData] = useState("")
  const handleToOptionsPage = () => {
    chrome.runtime.openOptionsPage()
  }
  return (
    <div className={style["app"]}>
      <h1>公众号:Web技术学苑</h1>
      <div onClick={handleToOptionsPage}>go to option page</div>
    </div>
  )
}

因此options页面就在弹框页面中打开了一个新的页面

newtab页面

这个页面会默认覆盖你当前默认打开的tab页面,你只需要在根目录新建newtab/index.tsx即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
// newtab/index.tsx
import React, { memo } from "react"

interface Props {}

const TabsPge: React.FC<Props> = (props) => {
  const {} = props
  return <div>new tabs page</div>
}

export default memo(TabsPge)

当我们每新开一个tab时,默认就会插件的tab

tabs

我们插件内部也可以有很多内部的页面,因此,你可以在根目录新建一个tabs目录,然后新建一个about.tsx页面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
// tabs/about.tsx
import React, { memo } from "react"
interface Props {}
const About: React.FC<Props> = (props) => {
  const {} = props
  return <div>about page</div>
}

export default memo(About)

我们可以在popup弹框页面打开一个页面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
import { useState } from "react"
import style from "./index.module.scss"
function IndexPopup() {
  const [data, setData] = useState("")
  const handleToOptionsPage = () => {
    chrome.runtime.openOptionsPage()
  }
  const handleToNewTabPage = () => {
    chrome.tabs.create({
      url: `chrome-extension://${chrome.runtime.id}/newtab.html`
    })
  }
  const handleToAboutPage = () => {
    chrome.tabs.create({
      url: `chrome-extension://${chrome.runtime.id}/tabs/about.html`
    })
  }
  return (
    <div className={style["app"]}>
      <h1>公众号:Web技术学苑</h1>
      <div onClick={handleToOptionsPage}>go to option page</div>
      <div onClick={handleToNewTabPage}>go to tab page</div>
      <div onClick={handleToAboutPage}>go to about page</div>
    </div>
  )
}
export default IndexPopup

sidepanel

这是chrome插件的一个新方式,可以在当前窗口打开侧边栏方式打开插件内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
import React, { memo } from "react"

interface Props {}

const Index: React.FC<Props> = (props) => {
  const {} = props
  return <div>this is sidepanel</div>
}

export default memo(Index)

打开sidepanel,主要在background.js中打开sidepanel

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
// background.js
chrome.action.onClicked.addListener(() => 
{ 
   chrome.sidePanel.setOptions(
   {   path: "sidepanel.html",
       enabled: true,
       openPanel: true
    }).catch((error) => console.error("Failed to open side panel:", error)); 
 });

总结

  • 主要介绍了plasma构建插件的几个核心文件,比如background.jscontentsoptionstabs等插件页面
  • 如何在content.js中使用cssModule并插入相对指定节点
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Web技术学苑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Kaggle经典数据分析项目:泰坦尼克号生存预测!
最近有很多读者留言,希望能有一个完整的数据分析项目练手,这几天收集了组织成员们的推荐。其中泰坦尼克号生存预测作为最经典的启蒙数据分析项目,对于初学者来说是应该是最合适的了,后面将分享更多进阶的数据分析项目。如果已经有基础了,推荐:
Datawhale
2020/08/28
2.7K0
Kaggle经典数据分析项目:泰坦尼克号生存预测!
Python数据科学入门:基础知识、工具与实战应用
文章链接:https://cloud.tencent.com/developer/article/2465509
一键难忘
2024/11/27
2140
机器学习与大数据分析的结合:智能决策的新引擎
在数字化和信息化的今天,数据成为了新的“石油”。海量数据的积累和处理能力的提升,使得我们可以通过分析数据从中获取有价值的信息和洞见。机器学习作为一种数据驱动的技术,能够通过学习历史数据中的模式和规律,对未来进行预测和优化。而大数据分析则为机器学习提供了丰富的数据来源和强大的计算能力。本文将详细探讨机器学习与大数据分析的结合,并通过具体代码示例展示其实现过程。
Echo_Wish
2024/12/21
1740
机器学习与大数据分析的结合:智能决策的新引擎
探索数据科学家的日常:揭秘职业背后的故事
大家好,我是你们熟悉的大数据领域自媒体创作者Echo_Wish。今天我们来聊一聊数据科学家的日常工作。这个职业听起来高大上,甚至有点神秘。那么,数据科学家的一天究竟是怎样的呢?让我们一探究竟。
Echo_Wish
2025/02/14
580
探索数据科学家的日常:揭秘职业背后的故事
为啥我敢说Python是数据分析界的扛把子语言?
首先声明下这篇文字不是卖课的,也不是无脑吹Python,咱只讲事实,认认真真讨论下Python是不是数据分析领域最好的语言。
派大星的数据屋
2024/04/19
2250
为啥我敢说Python是数据分析界的扛把子语言?
做数据分析,Python和R究竟哪个更强?
几十年来,研究人员和开发人员一直在争论,对于进行数据科学和数据分析,Python和R语言哪个才是更好的选择?近年来,数据科学在生物技术、金融和社交媒体等多个行业迅速发展。数据科学的重要性不仅得到了业内人士的认可,而且还得到了许多学术机构的认可,目前越来越多的学校都开始设立数据科学学位。
CDA数据分析师
2018/09/17
1.7K0
做数据分析,Python和R究竟哪个更强?
想要使用Python进行数据分析,应该使用那些工具
Python的数据分析能力非常出色,因为它有广泛的功能库和工具,可为数据准备、清理、分析和呈现提供全面支持。Pandas和NumPy是Python用于数据科学的核心库,pandas提供数据框架,而NumPy则提供了广泛的数值计算操作。这两个库结合起来使用,可以为Python的数据分析和科学计算领域提供很好的基础。
zayyo
2023/11/30
2390
使用Python实现深度学习模型:智能社交媒体内容分析
随着社交媒体的普及,分析社交媒体内容以获取有价值的信息变得越来越重要。本文将介绍如何使用Python和深度学习技术实现智能社交媒体内容分析。我们将从数据预处理、模型构建、训练与评估等方面详细讲解,并提供相应的代码示例。
Echo_Wish
2024/09/27
3620
使用Python实现深度学习模型:智能社交媒体内容分析
带有源代码的 10 个 GitHub 数据科学项目
截至 2023 年,世界上生成的数据已超过 120 ZB!这远远超出了我们的想象。更令人惊讶的是,这个数字将在未来两年内超过180!这就是数据科学快速发展的原因,需要热爱数据和处理数据的熟练专业人士。
磐创AI
2023/08/29
1.8K0
带有源代码的 10 个 GitHub 数据科学项目
【机器学习】—时序数据分析:机器学习与深度学习在预测、金融、气象等领域的应用
时序数据分析(Time Series Analysis)是数据科学中的一个重要领域,涉及到按时间顺序排列的数据的建模、预测和分析。随着数据量的不断增长,传统的统计分析方法逐渐无法满足复杂的时序数据分析需求。近年来,深度学习和强化学习方法的应用,为时序数据分析带来了新的机遇,尤其是在金融市场预测、气象数据分析以及设备故障检测等领域,机器学习技术得到了广泛的应用。
云边有个稻草人
2024/12/29
3420
NumPy和Pandas入门指南
数据科学是当今数字时代中的一个重要领域,而Python是数据科学家们最喜爱的编程语言之一。在这篇博客中,我们将介绍Python中两个强大的库——NumPy和Pandas,它们在数据处理和分析中发挥着重要作用。
一键难忘
2024/04/16
7230
使用Python实现深度学习模型:智能舆情监测与分析
智能舆情监测与分析是现代社会中重要的技术,通过分析社交媒体、新闻等数据,可以实时了解公众的情绪和观点,帮助企业和政府做出更好的决策。本文将介绍如何使用Python和深度学习技术来实现智能舆情监测与分析。
Echo_Wish
2024/08/16
3180
使用Python实现深度学习模型:智能舆情监测与分析
8个常用的Python数据分析库(附案例+源码)
今天给大家分析8个Python中常用的数据分析工具,Python强大之处在于其第三方扩展库较多。 本文介绍数据分析方面的扩展库分别为:NumPy、SciPy、Matplotlib、Pandas、StatsModels、Scikit-learn、Keras、Gensim,下面对这八个扩展库进行简单介绍,以及相关的代码案例
Python研究者
2021/12/15
15.1K0
8个常用的Python数据分析库(附案例+源码)
干货收藏!一文看懂8个常用Python库从安装到应用
导读:Python本身的数据分析功能并不强,需要安装一些第三方扩展库来增强其相应的功能。本文将对NumPy、SciPy、Matplotlib、pandas、StatsModels、scikit-learn、Keras、Gensim等库的安装和使用进行简单的介绍。
IT阅读排行榜
2020/03/24
1.9K0
干货收藏!一文看懂8个常用Python库从安装到应用
用ChatGPT做数据分析与挖掘
模式对比从对比可知,结合ChatGPT的交互式分析体验降低专业门槛,允许非专业认识以提问的形式探索数据,实时获取定制化的分析结果,增强了数据分析的灵活性和响应速度。同时节省人力成本和缩短周期,传统的数据分析需要专业人员投入大量时间和精力进行清洗、整理、建模和解读数据,而ChatGPT可以减轻这些负担,让专业人士更多地专注于策略制定和高层次问题解决。
洁洁
2024/10/12
2210
用ChatGPT做数据分析与挖掘
数据分析50+高频场景实战 业绩提升立竿见影|果fx
数据分析师是一个在现代企业中扮演重要角色的职业,主要负责从数据中提取有价值的信息,以支持决策和业务发展。
baikeu电抗
2024/12/25
1550
探索Python的力量:如何处理大数据
大数据已成为现代科技社会中的重要组成部分,从金融到健康医疗,几乎所有领域都在利用大数据进行决策。Python作为一种灵活、易用且强大的编程语言,已成为处理大数据的主要工具之一。在本文中,我们将探讨如何使用Python处理大数据,并结合代码示例来详细说明这一过程。
Echo_Wish
2025/02/26
1560
探索Python的力量:如何处理大数据
使用Python实现深度学习模型:智能娱乐与虚拟现实技术
智能娱乐与虚拟现实(VR)技术正在改变我们的娱乐方式。通过深度学习模型,我们可以创建更加沉浸式和智能化的娱乐体验。本文将介绍如何使用Python和深度学习技术来实现智能娱乐与虚拟现实的应用。
Echo_Wish
2024/08/18
2150
使用Python实现深度学习模型:智能娱乐与虚拟现实技术
【知识】使用Python来学习数据科学的完整教程
编者按:Python学习和实践数据科学,Python和Python库能够方便地完成数据获取,数据探索,数据处理,数据建模和模型应用与部署的工作,对于数据科学工作中各个环节都有合适的解决方案。对于新手,建议按着本教程学习与实践。 我在SAS工作了5年多之后,决定走出舒适区。作为一名数据科学家,我在寻找其他好用的工具,幸运的是,没过多久,我发现了Python。 一直以来,我喜欢敲代码。事实证明,有了Python,敲代码变得更为容易。 我花了一周时间来学习Python的基础知识,从那时起,我不仅深入钻研Pytho
陆勤_数据人网
2018/02/26
1.7K0
【知识】使用Python来学习数据科学的完整教程
Python数据分析实验三:基于Scikit-Learn构建数据分析模型
文章相关资源可参考我的GitCode仓库:https://gitcode.com/Morse_Chen/Python_data_analysis
Francek Chen
2025/01/22
1030
Python数据分析实验三:基于Scikit-Learn构建数据分析模型
推荐阅读
相关推荐
Kaggle经典数据分析项目:泰坦尼克号生存预测!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档