做一个FabricJS.cc的中文文档网站——面向markdown编程
- 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
- 📢本文作者:由webmote 原创
- 📢作者格言:新的征程,用爱发电,去丈量人心,是否能达到人机合一?
前言
世界变化真的好快,从asp,php的后端构建WEB,到现在流行的前后端分离,甚至于最近逐渐火热的前端全栈,感觉技术就是一个圆圈,又一次体会了分久必合,合久必分的伟大预言。
大家有没有玩过Vite Press,这整个一面向MarkDown编程,最后生成静态WEB,再次回到了html的原生起点。
不过这次使用的不是Press,但也是vite生态圈的一员,Astro 这个技术框架,大致原理同Press,都是编译产生HTML静态页面。
1.造一个轮子,翻一个网站
这个世界不缺轮子,在公司造轮子,不在公司依然造轮子。
因为喜欢,所以就开造。当然也不全是,主要是FabricJS 处于一个升级阶段,其V6版本做了很多破坏性升级。 对于新手,老的文档不太适宜了,我当时做个小程序使用的时候,走了不少弯路,因此淋过雨的人,总想让其他人有把伞撑撑。
所以,这是一个V6版本的中文档手册,目前目录如下,大家可以点击 FabricJS.cc 访问。

开始
你的第一个app
简介:1.对象、画布、图像、路径
简介:2.动画、颜色、文本、事件
简介:3.组、序列化、子类化
简介:4.绘制、定制化、node应用
简介:5.缩放、平移
简介:6.变换
简介:7.剪裁路径介绍
简介:8.剪裁路径更多高级用法
简介:9.剪裁画布
简介:10.使用绝对定位的剪裁路径

2. 支持代码编辑和演示
是的,静态文档没有这个功能,因此,我借助了官网的超能力,仔细研究了astro的组件模型,把演示集合和代码中的演示功能都调整完好了,相比官网更近一步的完善了演示部分,以及修正了老文档的错误(主要是不兼容V6)。

没错,我和代码的主要贡献者Andra有一番邮件交流,他希望我能为官网的翻译做出贡献,这不是问题,不过囿于 astro处于关键的升级版本阶段,其对 i18n的支持也处于破坏性更新中,这个工作暂时押后来做。
3.增加文档讨论支持
是的,这个功能对于文档网站的共建来说,也是非常重要的,继承这个功能虽然并不轻松,不过总算是完成了,借助giscus提供的技术,我们开通github的讨论区,不需要自己创建后台程序,就可以实现博客网站经常用到的评论功能。
由于需要github登录,这样无形中也可以避免很多垃圾评论。

有了这个功能,如果文档有什么遗漏或错误,也方便大家直接讨论解决办法。
4. 有关API文档
这块工作是未竟事业, 主要并不是翻译的工作比辛苦,而是官网产出的这个文档明显来自自动生成的机器人,质量比较低,如果需要把这个讲好,也需要大量的重构工作,慢慢来吧!
用到了,就梳理一部分。

5. Astro 使用小结
Astro 是一个多页面静态网站编译框架,其天生支持多个html页面的静态生成,利用强大的md,mdx,markdoc的解析支持,比较适合生成内容性网站,个人博客网站或者升级日志类网站等,当然也适合目前流行的官网介绍类网站。
其适合目标人群是:关注网站SEO,首页加载性能,定制个性化,文档输出型 的相关人员。
其采用进行子组件加载,与vue有异曲同工之妙,然后利用yaml定义在服务端进行某些鬼鬼祟祟的操作,最终生成html。
给个类似文件大家看看。
---
// ---分割的代码均在构建时执行(或服务端执行),并不回传到HTML内
import { Welcome } from 'astro:components';
import Layout from '../../layouts/Layout.astro';
import * as greatPost from '../../content/index.md';
const { Content } = greatPost;
console.log(greatPost.getHeadings());
---
<-- 以下就是html, 不过支持 js表达式{},可以使用上面定义的变量,方法 -->
<Layout><Welcome title="Welcome to Astro" /><div><p>{greatPost.frontmatter.title}</p><p>{greatPost.frontmatter.author}</p><p>{greatPost.file}</p><p>url: {greatPost.url}</p><p>url: {greatPost.url}</p></div><div>{greatPost.compiledContent()}</div><div>{greatPost.getHeadings()}</div><Content />
</Layout>
<-- 以下就是html内的js,在客户端执行 -->
<script></script>
这玩意用起来,真的感觉又回到了从前,唯一的不同点,也许就是 直接构建成了html发布吧?
大家有玩过吗?
6.总结
前端技术真是多啊,何况换在这个卷王时代,不知道各位前端小伙伴换号吗?
话说回来,一般文档类直接使用vitepress吧,折腾这个没必要。
你学废了吗?
👓都看到这了,还在乎点个赞吗?
👓都点赞了,还在乎一个收藏吗?
👓都收藏了,还在乎一个评论吗?
相关文章:
做一个FabricJS.cc的中文文档网站——面向markdown编程
📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,用爱发电&#…...
开发 + 安全:网络安全的协作方法
开发团队和安全团队之间由来已久的紧张关系一直是组织内部摩擦的根源。开发人员优先考虑速度和效率,旨在通过快节奏、迭代的开发周期快速交付功能和产品并高效前进。另一方面,安全团队努力平衡风险和创新,但必须专注于使用护栏保护敏感数据和…...
Next.js- App Router 概览
#题引:我认为跟着官方文档学习不会走歪路 一:App Router与Page Router 在 v13 版本中,Next.js 引入了一个基于 React 服务器组件 构建的新的 App Router,而在这之前,Next.js 使用的是Page Router。 目录结构 pages …...
python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改
Two-Step Vertification required: Please enter the mobile app OTPverification code: 01.因为巡检的服务器要双因子认证登录,也就是登录堡垒机时还要输入验证码。这对我的巡检查服务器的工作带来了不便。它的机制是每一次登录,算一次会话…...
【工控】线扫相机小结 第四篇
背景 这一片主要是对第三篇继续补充。话说上一篇讲到了两种模式的切换,上一篇还遗留了一个Bug,在这一篇里进行订正! 代码回顾 /// <summary>/// 其实就是打开触发/// </summary>void SetLineSacanWorkMode(){-----首先设置为帧…...
亲测解决Unpack operator in subscript requires Python 3.11 or newer
这个问题是在小虎想提前定义一个list,然后作为index list来调用另一个list里面的变量出现的问题。 环境 Ubuntu 22.04 + python 3.10 故障代码示例 NoneList = [None] * opt.spatial_dims TargetMask = Target[i] == torch.arange(1...
数据结构 ——— 堆排序算法的实现
目录 前言 向下调整算法(默认建大堆) 堆排序算法的实现(默认升序) 前言 在之前几章学习了如何用向上调整算法和向下调整算法对数组进行建大/小堆数据结构 ——— 向上/向下调整算法将数组调整为升/降序_对数组进行降序排序代码…...
On-Chip-Network之Topology
片上网络拓扑决定了网络中节点和通道之间的物理布局和连接。拓扑对整体网络性价比的影响是巨大的。拓扑决定了消息 必须经过的跳数(或路由器)以及跳数之间的互连长度,从而显著影响网络延迟。由于经过路由器和链路会产生功耗,因此 …...
2024年11月21日Github流行趋势
项目名称:twenty 项目维护者:charlesBochet, lucasbordeau, Weiko, FelixMalfait, bosiraphael项目介绍:正在构建一个由社区支持的现代化Salesforce替代品。项目star数:21,798项目fork数:2,347 项目名称:p…...
第三十八章 IOT 通信协议MQTT协议实现的中间件EMQXDocker安装与验证指南
EMQX概述以及Docker安装与验证指南 一、EMQX概述 EMQX(原名EMQ X),是一款完全开源、高度可伸缩、高可用的分布式MQTT消息服务器。它不仅支持MQTT协议,还兼容CoAP/LwM2M等多种物联网协议,是5G时代万物互联的重要消息引擎。这款软件由杭州映云科技有限公司开发,基于Erlan…...
Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复
目录 安装包 flume的部署 负载均衡测试 故障恢复 安装包 在这里给大家准备好了flume的安装包 通过网盘分享的文件:apache-flume-1.9.0-bin.tar.gz 链接: https://pan.baidu.com/s/1DXMA4PxdDtUQeMB4J62xoQ 提取码: euz7 --来自百度网盘超级会员v4的分享 ----…...
CodiMD导出pdf失败或无中文
CodiMD导出pdf失败,弹出文件保存窗口,有个pdf文件能下载,但是保存的时候提示“网站出问题了”,实际到服务器上看会发现docker崩溃了。 解决办法: 使用最新的CodiMD镜像,如nabo.codimd.dev/hackmdio/hackmd:…...
数字图像处理(2):Verilog基础语法
(1)Verilog常见数据类型: reg型、wire型、integer型、parameter型 (2)Verilog 常见进制:二进制(b或B)、十进制(d或D)、八进制(o或O)、…...
Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化
Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析:…...
爬虫重定向问题解决
一,问题 做爬虫时会遇到强制重定向的链接,此时可以手动获取重定向后的链接 如下图情况 第二个链接是目标要抓取的,但它是第一个链接重定向过去的,第一个链接接口状态也是302 二,解决方法 请求第一个链接࿰…...
Java技术复习提升 10异常
10 异常 10.1异常介绍及分类 异常捕获 选中后alttabt->选中try-catch 异常就是程序执行中不正常的情况 注意语法和逻辑错误并不是异常 异常分类有两种 error和exception error是错误 虚拟机无法解决的严重问题 exception是其他因为编程错误或者外在因素导致的一般性的问…...
真题-桂城2022年五年级
目录 GC.2022.五年级.01.拍7 输入数据 1 输出数据 1 GC.2022.五年级.02.硬币 输入数据 1 输出数据 1 答案: GC.2022.五年级.03.次大公约数 输入数据 1 输出数据 1 GC.2022.五年级.04.显示器 输入数据 1 输出数据 1 GC.2022.五年级.05.数对 输入数据 1 输…...
android 使用MediaPlayer实现音乐播放--权限请求
在Android应用中,获取本地音乐文件的权限是实现音乐扫描功能的关键步骤之一。随着Android版本的不断更新,从Android 6.0(API级别23)开始,应用需要动态请求权限,而到了android 13以上需要的权限又做了进一步…...
Web开发:ORM框架之使用Freesql的DbFrist封装常见功能
一、调用 public class Program {static string connectionstring "连接字符串(数据库名)";static void Main(string[] args){//1.连接数据库var freesql new FreeSqlBuilder().UseConnectionString(DataType.SqlServer, connectionstring…...
【多线程-第一天-多线程的执行原理-多线程的优缺点-主线程 Objective-C语言】
一、多线程的执行原理 1.单任务操作系统:同一时间只能执行一个任务 多任务操作系统:同一时间可以执行多个任务 比如,我可以一边听着酷狗,一边聊着QQ, 在单任务的操作系统里边,只有进程,没有线程, 单任务操作系统,CPU必须执行完一个任务,才能执行第二个任务, 多任…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
