知乎日报Web版 - 我的第一个Chrome插件
前言
抱着用 Mac 也要看知乎日报的崇高想法,偶然间看到izzyleung总结的知乎 api,萌生了自己做一个 Chrome 插件版的知乎日报。
Chrome 插件入门
Chrome 插件只需要基础前端就可以入门,当然部分高阶 api 还是需要研究研究的,好在知乎日报 Web 版涉及的不多,下面对主要涉及部分做一个简单的介绍。
Chrome 插件开发调试
- 浏览器 url 进入插件地址
- 加载已解压的扩展程序…打开你的项目地址
- 完工,开发!但是前提是你的项目里有必需的一些文件,否则会报错
Chrome 插件开发必需文件
- manifest.json - 清单文件
- popup.html - 其实非必需,但是没有就没有页面
- 没了
Manifest 文件
Chrome 插件的核心,是一个 json 格式的清单文件,必需命名为 manifest.json。
这里突然想起一件事,就是 json 文件千万别想着写注释,说起来都是泪。当初为了方便记忆,在 json 文件写了很多注释,结果 Chrome 一直报错,Google 之后才发现json 文件不能用注释,借着 Google 翻译了解了,大致是为了防止利用注释来制定解析规则。
1 2 3 4 5
| { "name": "知乎日报Web版", "version": "1.0.0", "manifest_version": 2 }
|
1 2 3 4 5 6 7 8 9
| { "description": "知乎日报Chrome扩展Web版本 - Build By 韩小平", "icons": { "16": "prod/static/img/icon16.png", "48": "prod/static/img/icon48.png", "128": "prod/static/img/icon128.png" }, "default_locale": "en" }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| { "browser_action": { "default_icon": "prod/static/img/icon16.png", "default_title": "知乎日报Web版", "default_popup": "prod/template/popup.html" }, "background": { "persistent": true, "scripts": ["prod/static/js/vendors/zepto-1.1.6.min.js"] }, "options_page": "prod/template/options.html", "permissions": [ "tabs", "contextMenus", "cookies", "notifications", "alarms", "webNavigation", "\u003Call_urls\u003E" ], "web_accessible_resources": [ "prod/static/img/icon16.png", "prod/static/img/icon48.png", "prod/static/img/icon128.png" ], "content_scripts": [], "content_security_policy": "script-src 'self' https://ssl.google-analytics.com 'unsafe-eval'; object-src 'self'", "homepage_url": "https://github.com/excaliburhan/zhDaily" }
|
Chrome api 简析
我的插件用到 Chrome api 的地方并不多,理论上你不调用它的 api 也是完全可以的。
现在的需求:不重复打开相同的日报页面。如果用原生的 location 方法,可能会无限打开,所以需要调用 chrome.tabs 相关方法。用代码举个例子,如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| function openPage(fileName, query) { chrome.tabs.query( { windowId: chrome.windows.WINDOW_ID_CURRENT, }, function (tabs) { var reg = new RegExp('^chrome.*' + fileName + '.html(\\?{0,1})' + query + '$', 'i'), isOpened = false, tabId, i; for (i = 0; i < tabs.length; i++) { if (reg.test(tabs[i].url)) { isOpened = true; tabId = tabs[i].id; break; } } if (!isOpened) { if (query) { query = '?' + query; } chrome.tabs.create({ url: 'prod/template/' + fileName + '.html' + query, active: true, }); } else { chrome.tabs.update(tabId, { highlighted: true }); } }, ); }
|
- chrome.tabs.query 和 chrome.windows 获取当前打开多有 tabs 的数组
- 正则判断需要打开的页面是否已经打开
- 如果没有,利用 chrome.tabs.create 打开新页面,等同于 location.href = ‘xxx’
- 如果已经打开,利用 chrome.tabs.update 的方法切换到对应页面
总体来说,调用 api 的需要你看文档,然后就是编程的思维了。Chrome 提供的 api 很多,所以可以实现很多很多功能,具体还有待多多开发。
吃我一发安利
最后,安利一发我的插件 - 知乎日报 Web 版。
插件地址:
https://chrome.google.com/webstore/detail/%E7%9F%A5%E4%B9%8E%E6%97%A5%E6%8A%A5web%E7%89%88/hgenmoheeaicmomkkkkkoeeihmdpacio
项目地址:
https://github.com/excaliburhan/zhDaily
欢迎各位下载试用,反馈功能。Follow 或者 Star 一下项目也不是不可以~~