Giter VIP home page Giter VIP logo

awesome-chrome-extension-boilerplate's Introduction

awesome-chrome-extension-boilerplate

Build Status Known Vulnerabilities Percentage of issues still open

一个超棒的基于 React & TypeScript & webpack 的 chrome 扩展开发模板

manifest v3 版本 👉 manifest-v3

✨ 特性

  • 🔥 支持修改 content scripts 代码自动重载扩展和刷新注入了 content scripts的页面,再也不用修改了 content scripts 后手动刷新扩展和页面了。
  • 🌴 optionspopup 页面支持 react hot reload & react devtools,充分享受现代前端工程化的便捷,让你从开发 SPA 无缝切换到 chrome 扩展开发。
  • 🛡️ 整个模板包括 webpack 配置都是用 TypeScript 编写的,使用 TypeScript 配置 webpack 减少查阅文档和手残的概率。
  • 💄 ​ 支持 css/less/sass,使用 mini-css-extract-plugin 将 CSS 分离成 content CSS Script。
  • ⚒️ 集成了社区很多的优秀的 webpackeslintbabel 插件,优化开发,构建和打包分析体验,还配置了 husky , format-imports, stylelint, travisaudit-ci 构建工具。
  • 🌈 默认集成了 jquerylodashantd 等常用工具库,并对它们的打包进行了优化

📦 安装

# 克隆这个模板
git clone https://github.com/tjx666/awesome-chrome-extension-boilerplate.git

# 安装依赖,推荐使用 pnpm
pnpm

🛠️ 开发

🔔 请确保你对 chrome 扩展开发已经有基本的了解,入门推荐:Chrome 插件(扩展)开发全攻略。如果你对项目的配置有疑问。

准备工作

修改清单文件

在 src 目录下有两个清单文件:manifest.dev.jsonmanifest.prod.json,分别是开发环境和生产环境的配置文件。

注意:任何注入了 content scripts 的页面也必须被注入 js/all.jscss/all.css ,为了实现这一点,它俩的 matches 应该是其它所有 content scriptsmatches 的父集。

示例的配置是:

"content_scripts": [
    // 所有注入了 content scripts 的页面都注入了 js/all.js 和 css/all.css
    {
        "matches": ["https://github.com/*"],
        "css": ["css/all.css"],
        "js": ["js/all.js"]
    },
    // 注入到 github pull requests 页面
    {
        "matches": ["https://github.com/pulls"],
        "css": ["css/pulls.css"],
        "js": ["js/pulls.js"]
    }
]

添加静态资源

public 下的文件会被打包到扩展的根目录,manifest 中用到的图标等资源可以直接放到 public 文件夹下面。模板在 public/icons 放了一些默认的图标,因此可以在 manifest 中这样引用图标:

// manifest.dev.json
{
  "icons": {
    "16": "icons/extension-icon-x16.png",
    "32": "icons/extension-icon-x32.png",
    "48": "icons/extension-icon-x48.png",
    "128": "icons/extension-icon-x128.png"
  }
}

启动 devServer

yarn start

无论是开发环境还是生产环境都会在项目根目录生成 extension 文件夹,chrome 访问 chrome://extensions/ 也就是扩展管理页面,点击右上角的按钮开启开发者模式,选择加载已解压的扩展程序,再选择刚刚生成的 extension 文件夹即可加载扩展。

load extension

由于 chrome 的限制,官方的 chrome 扩展 react devtools 并不能审查 chrome-extension:// 协议的页面如 optionspopup 页面。所以需要使用独立的 react devtools,使用下面的命令启动 devServer 的同时打开独立的 devtools 窗口:

npm run devtools

react devtools

你可以通过 open 参数配置在 webpack 初次编译成功打开某个 URL:

"scripts": {
        "start": "cross-env-shell NODE_ENV=development ts-node --files -P ./server/tsconfig.json ./server --open=https://xxx.xxx.com",
    },

编写代码

模板默认的代码实现的功能是修改 github 导航栏的颜色,模板使用了 normalize.css 和一些自定义样式对 CSS 进行样式重置。

如果你想开发 background 脚本,你可以在 src/background 文件夹编写你的代码。src/background/index.tsbackground 脚本的入口,也是 webpack 的一个 entry,其它像 optionspopup 页面也类似。你可以查看 webpackentry 配置: src/server/utils/entry.ts 了解更多实现细节。

它俩的 webpack entry 分别是 src/options/index.tsxsrc/popup/index.tsx。这两个页面很相似,都只是一个普通的 web 页面,因此你可以像开发一个 react SPA 一样开发它们。

这个模板使用了 react 的最新版本,因此你可以使用 react hooks 去开发函数组件,react hookseslint 规则也集成了。

模板使用 React Fast Refresh 支持 react 的热更新。

这个模板会扫描 src/contents 文件夹,将所有子文件夹中的 index.tsxindex.ts 作为 webpack entry

content scripts 都放在 src/contents 目录下。默认有个 all.ts,也是个 webpack entry,它不能被删除,因为这个 webpack entry 被用于注入实现 chrome 扩展自动刷新功能的补丁。

举个 🌰:

当你要给 URL 是 https://www.example.com/discuss 页面开发 content script,你需要做下面两步:

  1. 添加 content scripts 和页面 URL 之间的映射到 manifest.dev.jsonmanifest.prod.json:

    "content_scripts": [
        {
            "matches": ["https://www.example.com/discuss*"],
            "css": ["css/discuss.css"],
            "js": ["js/discuss.js"]
        }
    ],
  2. 创建一个和上面 content script 路径对应的文件夹 src/contents/discusssrc/discuss/index.tsx 或者 src/discuss/index.ts 将会被视为一个 webpack entry。 webpack 会通过这个 entry 最终产出 js/discuss.js 这个 chunk

    mini-css-extract-plugin 会将所有被 discuss/index.ts 导入的样式文件合并再分离到 extension/css/discuss.css,这也是为什么上面的 manifest 中 content CSS script 可以使用 css/discuss.css 的原因

dev server 代理

你可以在 server/configs/proxy.ts 中配置 dev server 的代理,所有向 dev server 发送的请求都会根据你配置的规则被代理转发,修改配置后需要重启 dev server 才会生效,更多细节请查看使用的中间件 http-proxy-middleware

const proxyTable: ProxyTable = {
  // 如果 devServer 启动地址是 http://127.0.0.1:3600
  // 那么请求 http://127.0.0.1:3600/path_to_be_proxy 将会被 dev server 转发到 http://target.domain.com/path_to_be_proxy
  '/path_to_be_proxy': { target: 'http://target.domain.com', changeOrigin: true },
};

👷 打包

构建生产级别的包直接运行:

pnpm build

如果你想分析打包情况:

pnpm build-analyze

📢 注意事项

src/allsrc/background 下的文件包含了实现修改 content script 自动重载扩展和刷新注入了 content script 页面的功能的代码。除非你不开发 content scripts,否则,不能删除它

📚 Blog

核心原理:使用 webpack 构建 chrome 扩展的热更新问题

🎯 TODO

  • 给 manifest.json 增加 JSON 校验,目前使用的是 SchemaStore 提供的 schema,有极少部分内容已经过时了,有时间要去提个 PR。
  • 支持 webpack dev server 代理
  • 针对 chrome 扩展本身是个多页面应用的特点,提取多个页面的公共依赖到单独的 chunk

🤝 贡献 PRs Welcome

欢迎提交 PRs 和 issues。

awesome-chrome-extension-boilerplate's People

Contributors

tjx666 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

awesome-chrome-extension-boilerplate's Issues

optimization.splitChunks配置的问题

我不太明白为什么只有一些库(例如 Material UI、React 和 React Router)可以成功地拆分为单独的代码块。
而其他不能被拆分,从而导致background.js 和 contentScript.js不能立即执行。

此外,我还尝试使用 runtimeChunk 选项来将运行时代码提取到单独的代码块中,但是单独拆分运行时代码,也会导致background.js 和 contentScript.js不能立即执行。

我明白这个问题不是你的项目的问题,而是关于我对 Webpack 的使用理解不够深入。

Uncaught ReferenceError: React is not defined

检查

  • 这个问题在 master 分支存在
  • 这个问题在 manifest-v3 分支存在
  • 这个问题只在 yarn build 构建的产物中出现,通过 yarn start 构建的产物可以正常工作

基础信息

  • 代码分支: master/manifest-v3
  • Node 版本: v14.18.2
  • Yarn 版本: 1.22.19

报错信息

Uncaught ReferenceError: React is not defined
    at Object.bc2f415eff8759b90940 (popup.js:17:6297)
    at i (popup.js:30:4550)
    at popup.js:30:6176
    at i.O (popup.js:30:4820)
    at popup.js:30:6208
    at popup.js:30:6214

复现步骤

下载项目并build插件

git clone --depth=1 --branch master [email protected]:tjx666/awesome-chrome-extension-boilerplate.git

cd awesome-chrome-extension-boilerplate

yarn install

yarn build

安装插件

  • 1.Chrome 浏览器允许「开发者模式」
  • 2.「加载已解压的扩展程序」选择 extension 目录

使用插件复现错误

  • 1.安装插件后无法查看 popup 页面
  • 2.在 popup 中 「右键」选择 「审查弹出内容」的 Console 中可以看到 报错信息

请教如何激活react-devtools 还是有问题

先说我其实是使用这个模版https://github.com/lxieyang/chrome-extension-boilerplate-react
但看到你在官网有发问怎么激活react-devtools facebook/react#24844
你说你有加react-devtools在每个entry前了,但是不工作,后来你又发了一个commit 5d426a3
看起来是要自己加tag?
一路找到你这里的repo,又找到了这篇: #39
你又说加官网说的加entry,可是上面不是说不能工作了吗?

我自己是照了react官网作:
添加了依赖
image

加了 'react-devtools' 到每个entry最前面
image

我是先手动激活专案下的 npx react-devtools
然后跑专案
console出错Uncaught TypeError: hook.sub is not a function
image

怎么样都修不好啊…请教我还可能漏了什么吗?

支持 webpack dev server 代理和 API mock

最近一段时间在用这个脚手架开发插件,作为后端开发,很多前端的东西还是很懵逼的;

大佬有没有时间给折腾下开发环境的代理和跨域问题;

目前我的项目卡到这里啦;

README 中 git clone 地址修改

git clone [email protected]:tjx666/awesome-chrome-extension-boilerplate.git xxx
Cloning into 'xxx'...
Warning: Permanently added the RSA host key for IP address '140.82.112.4' to the list of known hosts.
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

使用 git 协议克隆要求权限,建议直接修改成 https 协议;

git clone https://github.com/tjx666/awesome-chrome-extension-boilerplate.git

请问 devtools extension 控制台插件可以用这个模版开发吗?

开发一个控制台面板插件需要一个脚本,调用 Chrome API,指定面板的 HTML 内容:

chrome.devtools.panels.create("Font Picker",
                              "FontPicker.png",
                              "Panel.html", // 面板的 HTML 内容
                              function(panel) { ... });

看起来这个模版目前好像不行。如果想要调试插件,可能要在每次修改后重新 build。请问后续会增加这方面的支持吗?或者有什么实现的思路吗?

开发过程中会提示 Service Worker (无效)然后热更新就无效了

如题,问下 chatgpt 原因给了一堆原因。直觉让我觉得是有更新了代码导致的无效,但是又感觉没有手段验证。希望能交流一下。
如果需要提供debug项目请告诉我。
ps: 过一段时间(2-5分钟)后 Service Worker 又会有效,没有其间没有进行任何操作。有效后热更新恢复。然后过段时间(2- 3分钟)又无效。

错误原因:

  1. 清除缓存:在开发过程中,可能会出现缓存问题。您可以尝试清除浏览器缓存并重新加载扩展程序来查看是否解决了问题。

  2. 文件路径错误:确保 Service Worker 注册文件的路径设置正确。请检查注册 Service Worker 的代码,并确保文件路径是正确的。

  3. HTTPS 环境:Service Worker 需要在 HTTPS 环境下才能工作。如果您的扩展程序在非 HTTPS 环境下运行,Service Worker 将无效。

  4. 范围(Scope)问题:Service Worker 的范围指定了它的作用域。确保 Service Worker 的范围设置正确,以使其包含您想要缓存的资源。

  5. 生命周期问题:Service Worker 有自己的生命周期。如果您在 Service Worker 中执行了某些任务,但没有在正确的时间注销或更新 Service Worker,可能会导致它无效。

  6. 版本更新问题:如果您对 Service Worker 进行了更改并发布了新的版本,但未正确更新 Service Worker,可能会导致旧的 Service Worker 仍然有效。

yarn start下使用antd组件报错

Uncaught SyntaxError: Unexpected token 'else'
    at Object../node_modules/@ant-design/colors/lib/generate.js

yarn build是可以正常使用

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.