<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>JavaScript on Leanku 的博客</title><link>https://www.leanku.com/tags/javascript/</link><description>Recent content in JavaScript on Leanku 的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 22 Jan 2025 00:00:00 +0800</lastBuildDate><atom:link href="https://www.leanku.com/tags/javascript/index.xml" rel="self" type="application/rss+xml"/><item><title>Chrome 插件开发实战：一键把当前页面存为 Markdown</title><link>https://www.leanku.com/post/tools/chrome-extension-development-practice/</link><pubDate>Wed, 22 Jan 2025 00:00:00 +0800</pubDate><guid>https://www.leanku.com/post/tools/chrome-extension-development-practice/</guid><description>&lt;p&gt;从一行代码到 Chrome Web Store 上架。本文用一个具体例子走通 Chrome 插件开发完整流程：manifest.json、content script、popup 通信、文件下载、用户偏好存储、上架审核。&lt;/p&gt;&#10;&lt;h2 id="为什么要做这个插件"&gt;为什么要做这个插件&lt;/h2&gt;&#10;&lt;p&gt;我经常在浏览器里看技术文章。看到好的想存到 Obsidian，复制粘贴格式全乱。打开&amp;quot;另存为&amp;quot;保存下来是带广告、导航栏、侧边栏的 HTML。想找一个干净的 Markdown 版本，要么没有，要么是闭源插件不敢装。&lt;/p&gt;&#10;&lt;p&gt;装个现成插件不放心。写个 userscript 分发麻烦。干脆自己写一个。&lt;/p&gt;&#10;&lt;p&gt;这是个&amp;quot;改造已有网站&amp;quot;的小工具，Chrome 插件是最合适的形态。如果你还不确定插件是不是解决你问题的最佳方案，可以先看 &lt;a href="https://www.leanku.com/post/tools/chrome-extension-development-intro/"&gt;《Chrome 插件开发》&lt;/a&gt;。&lt;/p&gt;&#10;&lt;h2 id="我们要做的版本"&gt;我们要做的版本&lt;/h2&gt;&#10;&lt;p&gt;最终交付一个能本地转、能下载、能存用户偏好的插件：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;点击工具栏图标，弹出一个 popup&lt;/li&gt;&#10;&lt;li&gt;popup 上一个按钮&amp;quot;保存为 Markdown&amp;quot;&lt;/li&gt;&#10;&lt;li&gt;点击后，把当前页面转成干净的 Markdown，触发下载&lt;/li&gt;&#10;&lt;li&gt;几个 checkbox 让用户自定义：是否包含图片、是否包含代码块、文件名格式&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这个版本足够简单，又覆盖了插件开发的核心链路：content script、popup 通信、文件下载、用户偏好存储。&lt;/p&gt;&#10;&lt;h2 id="准备工作"&gt;准备工作&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;需要：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Chrome 浏览器（任何最近版本都行）&lt;/li&gt;&#10;&lt;li&gt;一个空文件夹&lt;/li&gt;&#10;&lt;li&gt;一个文本编辑器&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;不需要：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Node.js&lt;/li&gt;&#10;&lt;li&gt;npm&lt;/li&gt;&#10;&lt;li&gt;任何前端框架&lt;/li&gt;&#10;&lt;li&gt;任何构建工具&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;整个项目就是几个静态文件，加一个第三方库。装一个依赖就要搭构建，搭构建就要讲 webpack / vite / TypeScript，整个文章会跑偏。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;第三方库：Turndown.js&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;用来把 HTML 转成 Markdown。同类插件 80% 在用，成熟稳定。&lt;/p&gt;&#10;&lt;p&gt;下载地址：&lt;a href="https://unpkg.com/turndown@7.2.0/dist/turndown.js"&gt;https://unpkg.com/turndown@7.2.0/dist/turndown.js&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;下载下来保存到 &lt;code&gt;vendor/turndown.js&lt;/code&gt;（自己创建 &lt;code&gt;vendor&lt;/code&gt; 目录）。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;项目结构：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;markdown-saver/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;├── manifest.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;├── content.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;├── popup.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;├── popup.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;├── icons/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;│ ├── icon16.png&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;│ ├── icon32.png&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;│ ├── icon48.png&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;│ └── icon128.png&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;└── vendor/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; └── turndown.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;图标先随便找 4 张占位图（每个尺寸一张），后面会讲商店要求。&lt;/p&gt;</description></item></channel></rss>