自荐一下我写的 chrome 扩展开发模板

2020-01-06 15:35:43 +08:00
 YuTengjing

有以下特点:

  1. 基于 webpack + react + TypeScript。
  2. 这也是个人觉得最大的特点:支持修改 content script 能自动重载扩展和刷新当前页面。这样当你在开发 content script 的时候不需要去扩展管理页面先重载一下扩展再刷新注入了 content script 的页面。
  3. 整个项目都 TypeScript 化,包括 webpack 配置和 devServer,使用 ts 配置 webpack 减少你查阅文档和手残的可能
  4. 支持 sass/less CSS 扩展语言,使用 mini-css-extract-plugin 插件将 CSS 分离成 content CSS Script。也就是说你只需要你编写的 content js script,然后导入对应 style 文件,就可以像下面这样配置 manifest.json:
"content_scripts": [
    {
        "matches": ["https://github.com/pulls"],
        "css": ["css/pulls.css"],
        "js": ["js/pulls.js"]
    }
]
  1. 使用 eslint 和相关插件 lint TypeScript,babel 编译 TypeScript,fork-ts-checker-webpack-plugin 检查 TypeScript 类型。

    eslint 取代 tslint 已经是必然的趋势,相关插件也比较成熟了。

    使用 babel 编译 ts 的好处是可以使用各种现有的 babel 插件,例如你用了 antd 作为 UI 组件库的化可以使用 babel-plugin-import 配置按需导入,使用 babel-plugin-lodash 配置 lodash 的按需导入,但是如果用 ts-loader 就没法用了。

  2. 由于 chrome 的限制,官方的 chrome 扩展 react devtools 并不能审查 chrome-extension:// 协议的页面如 options,popup 页面。所以需要使用独立的 react devtools,模板也对这一点进行了支持,并且配置了 react/react hooks 的 hot reload。

项目地址: awesome-chrome-extension-boilerplate

4176 次点击
所在节点    程序员
6 条回复
zhw2590582
2020-01-06 15:55:03 +08:00
自动刷新我一直用这个,或者你可以整合一下: https://github.com/xpl/crx-hotreload
YuTengjing
2020-01-06 16:00:02 +08:00
@zhw2590582 不需要整合,我设计的模板除了 content scripts 只能自动刷新扩展和当前页面,其它页面例如 options 和 popup, background 等页面直接支持完整的 webpack 热更新。
orzorzorzorz
2020-01-07 16:41:33 +08:00
在不变动包含 chrome.xxx 的原有代码的前提下,可以只热更新 popup 的代码吗?
调细节的时候得一遍遍重新加载然后点图标看 popup 的改动效果,如果只构建 popup 就会出现 chrome.xxx undefined 的错,两者都让人看在眼里,疼在蛋上。
YuTengjing
2020-01-07 20:16:35 +08:00
@orzorzorzorz #3 可以的,只有修改了 popup 用到的代码才会且只会触发 popup 弹窗页面热更新。
其实 popup 本质就是渲染一个 html 文件,你可以当成一个普通的 SPA 开发。

补充一点知识细节:在我的认知里,chrome 扩展 yej 就是一个包含 manifest.json 的金泰文件最后会被 chrome 扩展托管为一个静态文件服务器,协议就是 chrome://xxx。然后 popup 也就是点击图标后的弹窗本质上就是访问中国静态服务器上的一个 options.html 文件,我们知道现在前端的 SPA 本质上访问的也就是一个 index.html,所以开发 popup 页面和开发普通的 SPA 是没有很大的区别的。不过还是有一些细节上的问题,例如由于 CSP 的限制 chrome 扩展不能执行 eval,内联 js 代码,这个通过配置 manifest.json 的 content_security_policy 字段即可。还有就是我们知道前端路由一般有 BrowserRouter 和 HashRouter 等 Router,因为 BrowserRouter 需要访问的服务器将所有 HTML 页面定向到 Index.html,但是 chrome 托管扩展的静态服务器是没法编程控制它将所有的页面定向到 popup.html,而且也没意义,使用 HashRouter 则刚刚好,又不会因为 URL 带 hash 值比较丑(因为看不到),又实现了前端路由的功能。
YuTengjing
2020-01-07 21:02:08 +08:00
尴尬,前面的回复好多错别字,重新整理了下知识细节部分:
在我的认知里,chrome 扩展本质上就是一个包含 manifest.json 的文件夹,最后会被 chrome 托管为一个静态文件服务器,协议就是 chrome://。然后 popup 也就是点击图标后的弹窗本质上就是访问静态服务器上的一个 options.html 文件。我们知道现在前端的 SPA 本质上访问的也就是一个 index.html,所以开发 popup 页面和开发普通的 SPA 是没有很大的区别的,都可以充分利用 webpack 模块化和热更新。不过还是有一些细节上的问题,例如由于 CSP 的限制 chrome 扩展不能执行 eval,内联 js 代码,这个通过配置 manifest.json 的 content_security_policy 字段即可。还有就是我们知道前端路由一般有 BrowserRouter 和 HashRouter 等 Router,因为 BrowserRouter 需要访问的服务器将所有 HTML 页面定向到 index.html,但是 chrome 托管扩展的静态服务器是没法编程控制它将所有的页面定向到 popup.html,而且也没意义,因为托管的不止一个页面还有 options 等页面。使用 HashRouter 则刚刚好,又不会因为 URL 带 hash 值比较丑(因为看不到),又实现了前端路由的功能。
YuTengjing
2020-01-17 15:10:34 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/635490

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX