【NodeJS JS】动态加载字体的各方式及注意事项;

首先加载字体这个需求基本只存在于非系统字体,系统已有字体不需要加载即可直接使用; 

  • 方案1:创建 style 标签,写入 @font-face{font-family: 'xxx';src: url('xxx')} 等相关字体样式;将style标签添加到body里;
  • 方案2:通过 new FontFace() 进行字体加载,然后通过相关API进行检测加载情况;

 


方案1的适用场景:适合一次性加载所需字体;自己对应功能读取字体结构信息不依赖浏览器的真实加载情况;对加载字体的延迟情况无要求;

方案2的适用场景:适合完全加载好字体再执行某功能,避免字体还原显示异常(例如我项目所用的fabric库的相关字体功能);适合按需加载字体;能完全掌握字体加载流程,提高代码可读性、功能可控性;


 代码示例仅以本人electron+vite+vue3的项目应用为例,就算是在web用也简单改下就完事了,核心一点没变;

并且案例仅以本地静态字体资源为例,不做过多的其他场景的案例代码分析省点字,如果是http请求拿到的字体资源,碰到数据格式与例子不一致的情况下,自行了解如何转为所需的格式;

方案1:通过style标签加载字体


import { basename, extname } from 'path-browserify';

const localFonts = import.meta.glob('/public/fonts/*.*');

function getFontName(fontPath: string) {
    return basename(fontPath.replace(/\\/g, '/')).slice(0, -extname(fontPath).length);
}
function loadLocalFonts() {
  // 处理软件自带的字体资源
  const fontStyle = document.createElement('style');
  let fontFace = '';
  Object.keys(localFonts).forEach((font) => {
    // 打包后路径不需要/public,所以要去掉
    font = font.replace('/public', '');

    const fontName = fontStore.getFontName(font);

    fontFace += `@font-face{font-family: '${fontName}';src: url('${font}')}\n`;
  });
  fontStyle.innerText = fontFace;
  document.body.appendChild(fontStyle);
}

方案2:通过 new FontFace() 进行字体加载


import { readFileSync, readdirSync } from 'fs';
import { isArrayBuffer } from 'lodash-es';

function isFontFile(filename: string) {
  const fontExtensions = /\.(ttf|otf|woff|woff2|eot)$/i;
  return fontExtensions.test(filename);
}

  async getDownloadFont() {

    // 获取保存字体的路径,此案例是非自己项目内自带的字体,按需自己改该行代码即可;
    const filePath = await ipcRenderer.invoke('GET_FONT_PATH');

    const files = readdirSync(filePath);
    const fontList: any[] = [];
    files.forEach((val) => {
      if (isFontFile(val)) {
        const data = readFileSync(join(filePath, val).replace(/\\/g, '/'));
        const arrayBuffer = new Uint8Array(data).buffer;
        if (isArrayBuffer(arrayBuffer)) {
          fontList.push({
            path: join(filePath, val).replace(/\\/g, '/'),
            name: val,
            buffer: arrayBuffer,
          });
        }
      }
    });
    return fontList;
  }

import { basename, extname } from 'path-browserify';


function getFontName(fontPath: string) {
    return basename(fontPath.replace(/\\/g, '/')).slice(0, -extname(fontPath).length);
}
function setDownloadedFontList() {
  window.electron?.Font?.getDownloadFont().then((res: any[]) => {
    res.forEach((val) => {
        const fontName = getFontName(val.name);
        const font = new FontFace(fontName, val.buffer);
        (document as any).fonts.add(font);
        font.loaded.then(() => {
          if (document.fonts.check(`12px ${fontName}`)) {
            // 加载完成!!!
          }
        });
    });
  });
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/353747.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024017期传足14场胜负前瞻

2024017期赛事由亚洲杯2场、英总杯2场、德甲2场、意甲4场、西甲4场组成。售止时间为1月28日(周日)19点00分,敬请留意: 本期深盘场次同样适中,1.5以下赔率3场,1.5-2.0赔率6场,其他场次基本皆是平…

武汉大学齐民友教授简介

齐民友(1930年2月—2021年8月8日),男,出生于安徽省芜湖市,中国共产党优秀党员,数学家、教育家、偏微分方程专家,武汉大学原校长、数学与统计学院教授、博士生导师 。 齐民友于1948年考入武汉大…

(南京观海微电子)——OLED驱动与调试

一、OLED DDIC分类 OLED DDIC的技术方向可以分为3类:带Ram【内存】的IC、Ram-less IC和TDDI【显示&触控集成的IC】 1、带Ram的OLED DDIC OLED DDIC有两个Ram,分别是Demura Ram和Display Ram。 1、带Ram的OLED DDIC 1-1)Demura Ram&a…

课时6:编程语言逻辑

1.2.2 编程语言逻辑 学习目标 这一节,我们从 语言分类、编程逻辑、小结 三个方面来学习。 语言分类 语言分类 低级编程语言:机器:- 二进制的0和1的序列,称为机器指令。- 一般人看不懂汇编:- 用一些助记符号替代机…

Linux ---- Shell编程之函数与数组

目录 一、函数 1、函数的基本格式 2、查看函数列表 3、删除函数 4、函数的传参数 5、函数返回值 实验: 1.判断输入的ip地址正确与否 2. 判断是否为管理员用户登录 6、函数变量的作用范围 7、函数递归(重要、难点) 实验&#xff1…

山西电力市场日前价格预测【2024-01-28】

日前价格预测 预测说明: 如上图所示,预测明日(2024-01-28)山西电力市场全天平均日前电价为280.26元/MWh。其中,最高日前电价为556.88元/MWh,预计出现在18:15。最低日前电价为0.00元/MWh,预计出…

智能分析网关V4智慧机房:视频AI智能安全监管方案

一、背景分析 随着互联网的迅猛发展,机房及其配套设施的数量持续攀升,它们的运行状况对于企业运营效率和服务质量的影响日益显著。作为企业信息化的基石,机房的安全监测与管理的重要性不容忽视。它不仅关乎企业的稳定运营,同时也直…

Android Studio 提示Use app:drawableStartCompat instead of android:drawableStart

每次提交代码时,AS这个老妈子总爱唠叨一堆warning,这些Warning都在讲什么? 1.Use app:drawableStartCompat instead of android:drawableStart 在Android开发中,android:drawableStart和app:drawableStartCompat是两个用于设置…

Java多线程基础-18:线程安全的集合类与ConcurrentHashMap

Java标准库提供了很多集合类,但有一些集合类是线程不安全的,也就是说,在多线程环境下可能会出问题的。常用的ArrayList,LinkedList,HashMap,PriorityQueue等都是线程不安全的(Vector, Stack, Ha…

【C语言/数据结构】排序(选择排序,推排序,冒泡排序)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 选择排序 选择排序 ​编辑…

【开源】基于JAVA语言的学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

美睫师睫毛嫁接零基础学习,日式美睫与开花嫁接实战教学

一、教程描述 大家都说女人的钱好挣,这是因为每个女人在每年,都要花很多钱来打扮自己。本套教程是关于日式美睫和开花嫁接的,从零基础学习到店铺经营都有涉及,就做美睫和睫毛嫁接这两项业务,月收入万元以上应该问题不…

ubuntu 22.04 安装mysql-8.0.34

ubuntu 22.04 安装mysql-8.0.34 1、基础安装配置 更新软件包: sudo apt update查看可用软件包: sudo apt search mysql-server安装最新版本: sudo apt install -y mysql-server或者,安装指定版本: sudo apt inst…

202|读书笔记《金融的本质:伯南克四讲美联储》

今天跟朋友聊天💬,说已经没人看书了📖 我想, 还是会有人读书的吧。 ​ 一、美联储的起源和使命 1. 第一讲:美国南北战争结束后的40年间,美国经历了6次大的银行体系恐慌,促使其于1913年成立美联储…

第八篇【传奇开心果系列】beeware的toga开发移动应用示例:实现消消乐安卓手机小游戏

传奇开心果博文系列 系列博文目录beeware的toga开发移动应用示例系列博文目录一、项目目标二、安装依赖三、初步实现四、扩展思路五、实现游戏逻辑示例代码六、实现界面设计示例代码七、实现增加关卡和难度示例代码八、实现存档和排行榜示例代码九、实现添加特殊方块和道具示例…

C语言第十一弹---函数(下)

​ ✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 函数 1、嵌套调用和链式访问 1.1、嵌套调用 1.2、链式访问 2、函数的声明和定义 2.1、单个文件 2.2、多个文件 2.3、static 和 extern 2.3.1、static…

第六课:Prompt

文章目录 第六课:Prompt1、学习总结:Prompt介绍预训练和微调模型回顾挑战 Pre-train, Prompt, PredictPrompting是什么?prompting流程prompt设计 课程ppt及代码地址 2、学习心得:3、经验分享:4、课程反馈:5、使用Mind…

08. BI - 万字长文,银行如何做贷款违约的预测,特征处理及学习

本文为 「茶桁的 AI 秘籍 - BI 篇 第 08 篇」 文章目录 课程回顾案例分析案例实战 Hi, 你好。我是茶桁。 课程回顾 上节课,咱们讲了一个股票的指标:MACD。在趋势行情里面它应该还是有效的指标。它比较忌讳动荡行情,比如说它一会上…

###C语言程序设计-----C语言学习(5)#

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步! 一. 主干知识的学习 1.switch语句 switch语句可以处理多分支选…

ubuntu 22 安装 node,npm,vue

1:安装 nodejs sudo apt update curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt update && sudo apt install -y nodejs node -v 2:安装npm sudo npm install n -g npm -v 3:安装vite npm install vite -g 4:运行vue 把项目拷贝到…