位置: IT常识 - 正文

为博客园开发了一套脚手架及模板——实时预览页面定制效果(为博客园开发了什么项目)

编辑:rootadmin
有时大家可能会想为自己的博客增添一些色彩,但这种热情却常常因繁杂的配置步骤饱受消磨。CNBlogX是一套项目模板及脚手架的合集,用于快速搭建博客园的页面定制脚本开发环境。使用方式也非常简单,专注于自己的代码即可。让我们开始吧! ...

推荐整理分享为博客园开发了一套脚手架及模板——实时预览页面定制效果(为博客园开发了什么项目),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:为博客园开发了哪些项目,为博客园开发了哪些项目,博客园 开发者的网上家园,博客园发生什么事,博客园发生了什么,为博客园开发了什么项目,为博客园开发了哪些项目,为博客园开发了哪些项目,内容如对您有帮助,希望把文章链接给更多的朋友!

有时大家可能会想为自己的博客增添一些色彩,但这种热情却常常因繁杂的配置步骤饱受消磨。CNBlogX是一套项目模板及脚手架的合集,用于快速搭建博客园的页面定制脚本开发环境。使用方式也非常简单,专注于自己的代码即可。让我们开始吧!

起步请确保安装了Node.js,需要14.0或更新的版本。

通过以下命令基于CNBlogX模板创建一个叫做mytheme的项目:

npm init cnblogx mytheme

这样项目就建立完成了,让我们看看src/下的代码:

非常简洁,不必关心CNBlogX在背后做了什么,我们只要在这三个文件中添加代码即可。如果有定制化的需要,可以查看README.md中的可配置项,接下来让我们把代码部署到博客园。

首次部署若依赖安装很慢,可以考虑先配置npm淘宝镜像源。

首先给我们的项目安装依赖:

npm install

再编译我们的项目:

npm run build

然后将dist/下的生成物复制到博客园-管理-设置的对应选项中:

将custom.css的内容复制到页面定制CSS代码中。将custom.html的内容复制到页脚HTML代码中。

最后保存博客后台设置即可。

首次部署是必要的步骤,CNBlogX在构建时插入了开发者模式相关代码,接下来让我们体验一下。

开发者模式请确保已经完成首次部署。

首先执行以下命令启动调试服务器,它将监视代码变化并将其应用到博客页面中:

npm run dev

然后浏览器中打开自己的博客,双击页脚的Copyright © 你的名字,进入开发者模式。

此后,若src/下对应的文件发生了变化,这些变化将立即被应用到博客页面中:

main.ejs:支持HTML/EJS(兼容,后缀不可更改)。main.js:支持Javascript/Typescript(更改后缀为.ts即可支持Typescript)。main.scss:支持CSS/SCSS(兼容,后缀不可更改)。再次双击页脚的Copyright © 你的名字,可退出开发者模式。实践:编写常用组件

让我们写几个常用的博客组件,体验一下热模块替换带来的效率提升吧!后文中出现的组件可以在这个项目中找到。

评论区头像第一版:低分辨率头像

博客园默认不显示评论区用户的头像,但在评论区中提供了每位用户的头像链接,我们可以通过浏览器的开发者工具看到:

所以我们只要通过Javascript新建一个img标签,显示对应链接的头像即可:

嗯... 好像有一点糊,这个头像分辨率太低了。

第二版:回退式高清头像

经过观察,我们发现个人主页的头像链接和评论区的头像链接只存在一个目录的差异:

为博客园开发了一套脚手架及模板——实时预览页面定制效果(为博客园开发了什么项目)

那我们可以先显示这个清晰的头像,如果获取失败了,再回退到低分辨率的头像。效果非常不错:

第三版:二级回退式头像

有时会发现,个别用户根本没有头像,我们可以为他们添加一个默认头像。那么我们的代码至多可能有两次回退,高清头像->普通头像->默认头像。就像这样:

avatar = document.createElement('img');avatar.src = get_hi_definition_avatar_src(addr); // 设置为高清头像。avatar.addEventListener('error', () => { if (avatar.src != addr) { avatar.src = addr; // 回退到低分辨率头像。 } else { avatar.replaceWith(new_default_avatar(nick)); // 回退到默认头像。 }});

接下来让我们给用户画一个默认头像吧!

我们把衣服的位置镂空,再给头像元素设置不同的背景色,就可以将一张图片用作多个头像了。同时再用一个Map把分配的头像和用户昵称关联起来,每位没有上传头像的用户在我们的评论区就有自己专属颜色的头像了。完整代码可以看这里。

随笔目录

尽管Markdown允许通过[toc]创建一个目录,但每次都要回到顶部查看目录并不方便,让我们也写一个目录吧。

栈:将标题列表转换为目录树

目录通常是多级的,大标题包含小标题。我们可以用.querySelectorAll()将文章中所有的标题收集到一个数组中,然后通过一个栈将线性的数组转化为一棵树,像这样:

node_stack.push(root_node); // 添加一个虚拟的“h0”节点作为根。article.querySelectorAll('h1,h2,h3,h4,h5,h6').forEach(function (header) {const node = CreateTocNode(header); // 新建一个目录节点。for (; ;) {if (node_stack.top().level < node.level) {node_stack.top().add_toc_child(node); // 将当前节点添加为子标题。node_stack.push(node); // 处理下一个节点前将当前节点放到栈顶。break;} else {node_stack.pop(); // 让平级或更高级的标题出栈。}}});

将这棵树添加到文档中,再注册一个click事件完成跳转即可。

下一个需求是:「高亮当前小节的标题」。

不妨将「当前小节的标题」定义为「离屏幕顶端最近的一个标题」。那么思路就清晰起来了:注册一个滚动事件,于事件发生时遍历所有的标题,找到getBoundingClientRect().top的绝对值最小的一个,赋予其一个表示高亮的类名即可。

不过,这朴素的思路存在着一定的效率问题,下面我们将对它做出一些优化。

节流与防抖:防止滚动事件频繁触发

页面滚动时,滚动事件连续触发的频率非常高,可以用一个节流函数降低更新高亮目录的频率。但这也带来了一个问题:在一系列连续的滚动事件触发时,末尾的滚动事件可能会被节流函数过滤掉,导致原本应当高亮的当前标题没有得到更新。

为了避免丢失末尾的事件,我们需要再使用一个防抖函数。与节流函数不同,防抖函数只会在一系列连续的事件发生后才会调用一次传入的函数,我们可以通过它在最后执行一次当前目录的更新。代码是这样的:

const update_current_node_last = debounce(() => {update_current_node(); // 更新当前目录。}, 400); // 防抖:只有0.4秒内自身没有被执行过才执行回调函数。regi_scroll( // 注册滚动事件。throttle(() => {update_current_node(); // 更新当前目录。update_current_node_last(); // 防抖函数的timeout得到重置。}, 200) // 节流:最多每0.2秒执行一次回调函数。); 二分搜索:获取当前小节的标题

标题们的getBoundingClientRect().top虽然有正有负,但只要是递增的,就可以应用二分搜索。通过二分搜索找到top值在零附近的至多两个标题,再从中取top的绝对值最小的一个即可。代码是这样的:

let left = 0;let right = node_list.length - 1;while (left + 1 < right) { // 间隔为2,因为需要两个结果。const mid = Math.floor((left + right) / 2);if (node_list[mid].top <= 0) {left = mid;} else {right = mid;}}// 最后left将指向Viewport上方最近的一个标题,right指向它的下一个标题。set_current_node(select_nearest(left, right));

实现目录大概用了一百行左右的代码,可以在这里查看。

常见问题我的项目能够与其它代码共存吗?

CNBlogX默认会在进入开发者模式时清除用户的页面定制CSS代码,以免用户混淆部署版本与开发版本的样式,可以通过PRESERVE_CSS编译选项阻止这个默认行为。

若希望在调试时开启PRESERVE_CSS编译选项,推荐先部署packed编译模式生成的代码。有离线的文档吗?

有的,看项目根目录下的README.md。通过脚手架建立的新项目与Github上的模板只有包名不同。

开发者模式会影响他人阅读吗?

不会,开发者模式仅对启用它的单个浏览器有效。

要令博客定制代码对所有读者生效,需要一次新的部署。为什么有时js的更改在刷新后才生效?

因为相关的模块存在未消除的副作用,参考热模块替换的文档。

可以单独生成.js文件吗?

可以,通过STANDALONE_JS编译选项生成单独的.js文件。通过PUBLIC_PATH编译选项可更改.html引入.js文件的路径。

可以自定义端口吗?

可以,通过PORT编译选项配置端口,已部署到博客园的代码与本地测试服务器的代码配置的端口应当相同。

没有页脚的博客如何进入开发者模式?

打开浏览器的控制台,执行以下命令即可:

cnblogx_development(true);结语

希望大家喜欢,意见或建议也是很欢迎的,Issue或Pull Request就更欢迎了。

本文链接地址:https://www.jiuchutong.com/zhishi/310740.html 转载请保留说明!

上一篇:PHP获取整数间的公因数和最大公因数(php获取参数值的三种方式)

下一篇:电脑学习网给大家免费分享自己常用的三款404页面代码,非常好看且实用!(从网上学电脑下载什么软件)

  • 四年推广经验教你玩转网站推广(推广经验是什么意思)

    四年推广经验教你玩转网站推广(推广经验是什么意思)

  • 钉钉怎么退出部门(钉钉怎么退出部分)

    钉钉怎么退出部门(钉钉怎么退出部分)

  • 微信运动步数如何让别人看不见(微信运动步数如何关闭)

    微信运动步数如何让别人看不见(微信运动步数如何关闭)

  • 华为手机屏幕有水印(华为手机屏幕有残影怎么解决)

    华为手机屏幕有水印(华为手机屏幕有残影怎么解决)

  • 笔记本电脑怎么按f4(笔记本电脑怎么重装系统)

    笔记本电脑怎么按f4(笔记本电脑怎么重装系统)

  • 尼康ai和ais口区别(尼康ais镜头推荐)

    尼康ai和ais口区别(尼康ais镜头推荐)

  • 小黄车卖货多久可以提款(小黄车卖货的钱官方什么时候付款)

    小黄车卖货多久可以提款(小黄车卖货的钱官方什么时候付款)

  • qmqm文件怎么打开(qm文件是什么)

    qmqm文件怎么打开(qm文件是什么)

  • c盘还剩240g不能压缩了(c盘只剩20g了有没有影响)

    c盘还剩240g不能压缩了(c盘只剩20g了有没有影响)

  • 华为微信小视频打不开(华为微信小视频模糊不清怎么办)

    华为微信小视频打不开(华为微信小视频模糊不清怎么办)

  • 为什么pdf打印出来缺一部分(为什么pdf打印出来字体不一样)

    为什么pdf打印出来缺一部分(为什么pdf打印出来字体不一样)

  • 被别人拉黑了发信息别人能收到吗(被别人拉黑了发朋友圈他那还显示吗)

    被别人拉黑了发信息别人能收到吗(被别人拉黑了发朋友圈他那还显示吗)

  • pn结正偏是指(PN结正偏是指AN区电位高于P区BP区电位高于N区)

    pn结正偏是指(PN结正偏是指AN区电位高于P区BP区电位高于N区)

  • access数据库的作用(access数据库作业代做)

    access数据库的作用(access数据库作业代做)

  • mate30是ufs3.0吗(mate30pro ufs3.0)

    mate30是ufs3.0吗(mate30pro ufs3.0)

  • 小爱音箱每天用电多少(小爱音箱每天耗电有多少)

    小爱音箱每天用电多少(小爱音箱每天耗电有多少)

  • 申请注销抖音需要几天(抖音注销需要身份证吗)

    申请注销抖音需要几天(抖音注销需要身份证吗)

  • 红米note8支持无线充电吗(红米note8支持无线充电吗?)

    红米note8支持无线充电吗(红米note8支持无线充电吗?)

  • 苹果7哪个版本烧基带(苹果7哪个版本系统好用)

    苹果7哪个版本烧基带(苹果7哪个版本系统好用)

  • 怎么缩小照片内存容量(怎么缩小照片内存的应用)

    怎么缩小照片内存容量(怎么缩小照片内存的应用)

  • 知道QQ号码怎么添加微信(知道qq号码怎么偷密码)

    知道QQ号码怎么添加微信(知道qq号码怎么偷密码)

  • 华为p30是无线充电吗(华为p30是否无线充电)

    华为p30是无线充电吗(华为p30是否无线充电)

  • 苹果手机怎样设置天气城市(苹果手机怎样设置来电铃声)

    苹果手机怎样设置天气城市(苹果手机怎样设置来电铃声)

  • 三星s8屏幕有残影(三星s8屏幕有残影怎么办)

    三星s8屏幕有残影(三星s8屏幕有残影怎么办)

  • 闲鱼分期付款怎么弄(闲鱼分期付款怎么操作)

    闲鱼分期付款怎么弄(闲鱼分期付款怎么操作)

  • CnxMon.exe是啥进程 安全吗 CnxMon进程信息查询(zmweb.exe是什么进程)

    CnxMon.exe是啥进程 安全吗 CnxMon进程信息查询(zmweb.exe是什么进程)

  • Mac 键盘快捷键大全(mac键盘快捷键设置)

    Mac 键盘快捷键大全(mac键盘快捷键设置)

  • 巴伐利亚州Schrecksee湖的全景图,德国 (© wingmar/E+/Getty Images)(巴伐利亚州地图)

    巴伐利亚州Schrecksee湖的全景图,德国 (© wingmar/E+/Getty Images)(巴伐利亚州地图)

  • 【周末闲谈】畅想AR,AR领域迎来新风口(周末闲暇时光是什么意思)

    【周末闲谈】畅想AR,AR领域迎来新风口(周末闲暇时光是什么意思)

  • 个税分类所得税率
  • 叉车折旧年限是几年预计净残值
  • 差额征税所得税怎么申报
  • 固定资产折旧购买日期还是使用日期呢
  • 汇算清缴所得税是什么意思
  • 介质申报和网络申报的区别
  • 新公司注册资金需要实缴吗
  • 退休工资要缴纳税吗
  • 固定资产的净收益和净损失怎么计算
  • 农产品增值税抵扣新政策2021
  • 应纳税调增调减会计分录
  • 收到法人的借款
  • 企业将存货低价出售处理要如何做会计处理?
  • 采购办公用品计入什么科目
  • 企业所得税季报营业收入,营业成本怎么填
  • 一般纳税人当月只有进项没有销项怎么做账
  • 厂房进项抵扣
  • 电信报表系统
  • 所得税清算时坏账怎么算
  • 税种认定登记流程
  • 企业从事生产经营活动时所持有的基本信念
  • 工程会计做账流程及会计分录
  • 服装外贸进出口
  • 公司注销必须要清算报告吗
  • 预收款转营业外收入要交增值税吗
  • 筹建期间发生的费用计入哪里
  • 1697510472
  • 公司工会需要单独做账么
  • 苹果Mac电脑怎么锁屏
  • 电脑上网速度慢的原因及解决方法
  • 结转本月主营业务收入800000元,营业外收入2500元
  • 电脑进不了系统怎么用u盘重装
  • 股权转让协议解除返还股权优先权
  • ampa.exe是什么
  • 计提税金及附加的金额如何算
  • 存货周转材料报废处理会计分录
  • 一般纳税人什么情况下可以开3%的税率
  • Laravel5.5新特性之友好报错以及展示详解
  • 销售汇总怎么做分录
  • 工作服计入什么明细科目
  • css隐藏元素的方式
  • 货币捐赠会计分录
  • db2数据库备份文件为bkd格式
  • js日期选择
  • 工会经费申报的依据
  • 保单的增值税发票能抵税吗
  • 坏账准备在资产负债表哪里体现
  • Transactional replication(事务复制)详解之如何跳过一个事务
  • 小企业会计准则没有以前年度损益调整科目
  • 税金及附加可以结转吗
  • 公司水电费分摊怎么算
  • 车辆使用费包括油费吗
  • 股东利润分配预缴税款
  • 市政配套费减免政策
  • 冲减和冲销的会计分录
  • 总账和明细账的保管期限
  • mysql两种安装方式
  • mysql precision
  • Win7x64下Mysql5.7.18解压版的安装方法
  • win8.1 开机进桌面
  • Win10 Mobile RS2预览版14915上手视频评测
  • win7怎连蓝牙
  • echarts怎么样
  • opengl导入obj能动起来吗
  • JS实现的ajax和同源策略(实例讲解)
  • socketio nodejs
  • python 遍历字符串修改
  • JavaScript事件处理器中的event参数使用介绍
  • Host 'admin-PC' is not allowed to connect to this MySQL server
  • 在bash shell环境下
  • python中字典的键值对
  • unity3d怎么用
  • 程序员 master
  • JavaScript的函数中只能写一条代码语句
  • qt Android开发
  • Python编程中装饰器的使用示例解析
  • 淄博市税务局投诉电话
  • 增值税税率最新
  • 如何安装金税三期app
  • 航天信息的金税盘开票要怎么调格式
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设