使用nodejs批量给文章添加二维码图片
大家好,我是前端西瓜哥。
因为最近公众号没有涨粉,所以打算给我的个人博客网站(blog.fstars.wang)上的所有文章底部添加公众号的二维码。
为此我打算用 nodejs 写个批量处理文件的简单脚本。
我的具体需求是这样的。
文章都是用 markdown 文件写的,这是一种纯文本的文件格式,并且都位于 posts 文件夹下。
现在我们需要将 所有 markdown 文件的末尾都加上我的公众号二维码图片 ,即加上下面这种格式的内容。 ![img](xx.jpg)
其中有个模板文件,不需要添加图片,所以我们要设置一个 黑名单 。
此外 有些文章已经加了该图片,我们也需要将这些文章排除在外 ,防止文章出现两张相同图片。同时也能防止不小心多次执行脚本,导致不可逆的修改。 代码实现
我们先看完整的代码。 import * as fs from "fs/promises"; import path from "path"; const dirPath = "script/folder"; const img = "![img](xx.jpg)"; const addedContent = " " + img; const blacklist = ["b.md"] const appendText = async () => { console.log("=====开始====="); const files = await fs.readdir(dirPath) for (let file of files) { // 命中黑名单,跳过 if (blacklist.includes(file)) continue; // 转换为正确的绝对路径 file = path.resolve(dirPath, file); console.log("正在处理文件:", path.resolve(dirPath, file)); // 判断是否已含有图片。如果有,跳过 const content = await fs.readFile(file, { encoding: "utf8" }); if (content.includes(img)) continue; // 追加写入 await fs.appendFile(file, addedContent); } console.log("=====结束====="); } appendText();
我们先设置好要用到的几个变量,然后将它们全都放到文件开头。 const dirPath = "content/posts"; // 要处理文件的所在目录 const img = "![img](xx.jpg)"; // 图片内容 const addedContent = " " + img; // 添加时,前面加俩换行符 const blacklist = ["b.md"] // 黑名单
放到开头是为了让我们在需要时快速修改,符合相关代码高内聚原则。如果这些变量流散在代码逻辑中,当我们要改配置时,就要找上半天。
这里我引入了 nodejs 内置的 fs 库。fs 指的是文件系统(File System),fs 库就是专门用来处理文件的这么一个库。
fs/promise 则是fs 的 promise 版,将原来 fs 方法的回调参数移除,然后返回一个 promise。
我们就用这个 promise 版的 fs,因为它能写出同步形式的代码,可读性会更好。
fs.readdir() 方法能够读取目录内容,返回一个字符串数组,里面是所有的文件名。 const files = await fs.readdir(dirPath)
接下来我们就去遍历这个数组。这里有个 初学者容易犯的错误,就是会去使用 forEach 方法。
因为 forEach 是 for 循环的一层封装,会执行传入的回调函数。但 forEach 的这个函数并不是 async 函数,所以是无法等待 await 方法执行完的。
async 函数其实是挺新的特性,forEach 则是存在了很长时间,当时 forEach 并没有考虑 async 这种东西,为了兼容,以后也不会。
所以你需要使用原生的 for 循环方法。for 和 for...of 都可以。
然后我们检查一下文件名是否在黑名单中,如果在,跳过此轮循环,直接进入下一轮。 for (let file of files) { // 命中黑名单,跳过 if (blacklist.includes(file)) continue; /// ... }
然后我们要将文件名、和它所在的目录名组合,生成一个绝对路径。 // 转换为正确的绝对路径 file = path.resolve(dirPath, file);
直接使用文件名是不行的,因为 脚本会以被执行时所在的工作目录进行路径计算的,文件名是个相对于指定目录的相对路径,相对工作目录不一定是正确的。
接着是使用 fs.readFile 读取文件内容,记住要将 encoding 设置为 "utf8",否则你会拿到一个二进制的内容。
如果文件中已经有图片了,就跳过。 // 判断是否已含有图片。如果有,跳过 const content = await fs.readFile(file, { encoding: "utf8" }); if (content.includes(img)) continue;
否则在文件末尾通过 fs.appendFile 方法添加图片内容。 // 追加写入 await fs.appendFile(file, addedContent);执行脚本
脚本写好了,我们准备执行了。
首先为了可以吃后悔药,我强烈建议你想将文件通过版本控制软件(如 git),先存一个档。当脚本配合得不是很好时,我们可以轻松愉快地回滚到修改前的版本。当然拷贝一份作为备份也行。
总之,备份很重要。
改改配置,然后执行。
成功!
大家可以去我的 blog.fstars.blog 看看,现在所有文章下都有这二维码图片了。
我是前端西瓜哥,欢迎关注我。
支付宝送红包,苹果绿了经常在AppStore中购买App或是其他消费的小伙伴,想必都知道苹果会不定时联合其他品牌推出AppStore充值9折活动。有充值需求的小伙伴,都能在这个活动中白嫖到一些福利。由于
乐橙专业家用摄像机TP7S,快给您的家上个安心锁吧近几年,家庭盗窃案件只增不减,甚至有一些不法分子图谋不轨,导致了更多的悲剧发生。。家是我们的港湾,不能让它被破坏,一定要提前预防,阻止悲剧的发生。市面上的家用摄像机可以说是琳琅满目
36氪首发向金融机构提供IT运维保障服务,争锋科技数千万元A轮融资近日,36氪获悉,金融行业IT系统运维保障企业南京争锋信息科技有限公司(下称争锋科技)宣布完成A轮数千万元融资,投资方为咏圣资本。本次融资资金,主要用于人才引进产品矩阵的研发市场拓
微信一物一码红包系统红包系统定制开发微信一物一码红包,相信大家在平常购物消费时候也见过,对此并不陌生。在互联网时代,一物一码红包是以一物一码系统为载体,以红包奖励实物奖奖励,积分奖励方式来吸引用户进行扫码。而通过一物
苹果准备推出新款Mac电脑搭载下一代M2芯片财经网科技4月15日讯,据新浪科技消息,根据开发者日志,苹果已开始对几款搭载下一代M2芯片的新款Mac电脑进行广泛的内部测试。苹果正致力于开发搭载自主处理器芯片性能更强大的电脑产品
苹果正在M2芯片曝光,至少四颗本文转载自半导体芯闻公众号彭博社报道,根据开发者日志,苹果已开始对几款配备下一代M2芯片的新Mac机型进行广泛的内部测试,这是其推动使用自研处理器制造更强大计算机的一部分。日志显示
向日葵UUpro评测不用ROOT系统,就能远程控制手机让其大放异彩前言随着手机更新换代的速度越来越快,很多年轻人都会隔三岔五的换新机,因此每家每户都会有那么几部淘汰下来的旧手机,而这些旧手机的最好归宿,就是给家里的老人继续使用,毕竟老年人对手机性
特斯拉Model概念机曝光前后双摄像头配骁龙8Gen1作为美国科技的两大巨头,苹果和特斯拉在商业上几乎没有交集。然而,随着5G技术和物联网技术的日益成熟,过去设备之间的孤岛形式正在被打破。对于任何互联网设备来说,独处变得越来越困难。来
盘点一下即将要发布的几款手机时间步入四月,新机机潮已经到来,在这个月里手机是一个接一个的发布,从联通发布优畅享50plus到黑鲨5系列,再从荣耀play6T系列到vivo发布XnoteXfold和pad,四月
你的手机号码月租是多少?现在所用号码,是10年刚踏入社会工作办理的,应该算联通第一批无月租号码,白号什么都没有,可以单独开通来电显示,一天一毛钱,随时可以关闭,以前分潍坊五区,区内每分钟一毛二,区外3毛,
手机连接电脑读取文件手机连接电脑读取文件一打开手机USB调试模式打开手机系统设置二下载驱动保存到电脑,请记住保存的位置三用数据线将手机连接到电脑强烈建议大家使用手机原配的USB数据线!!四安装驱动如果