问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Next.js引入字体包踩坑记录

发布网友 发布时间:2024-10-01 09:57

我来回答

1个回答

热心网友 时间:2024-10-29 13:15

1.背景

最近项目中引用的可以商用字体包D-DIN,引入过程中遇到字体样式不生效,最终排查在webpack打包文件时出现错误,下文问踩坑过程以及解决方法

2.导入字体包

在next.js中的app.less文件下引入字体,定义全部字体变量

@font-face{font-family:'D-DIN';src:url('../assets/fonts/D-DIN.otf');};@font-face{font-family:'D-DIN-Bold';src:url('../assets/fonts/D-DIN-Bold.otf')format("opentype");};

但是在页面上,字体的样式并没有发生变化,最终在打包后的样式文件styles.chunk.css中发现url居然是[objectModule]

3.解决问题

在网上查找资料发现,webpack的loader处理url时会通过以下方式导入:

src:require('../image.png')//require()是CommonJS模块语法

这就导致了我们在上面看到的[objectModule]问题,要解决这个问题,可以在处理字体文件的file-loader中添加esModule:false属性

config.module.rules.push({test:/.otf$/,use:[{loader:'file-loader',options:{esModule:false,//这里设置为false},},],})

配置完我们重新运行项目,重新查看style.chunk.css可以发现,文件已经可以正确的被解析(.oft前的一大串经过webpack通过hash进行编译后的结果)

看到了胜利的曙光有木有,回到页面上看字体还是没有变化,还有什么地方不对!(眼神逐渐迷失),后来想到在网络请求过程中会有一个单独请求字体的Font流,点看nextwork的Font中看到居然是404

通过RequestURL发现还是webpack在打包过程中的问题,我们打包后的字体包并不在static/css文件夹下

继续优化,在file-loader的option中添加

name:对编译后的字体名截取前8位(微弱的性能优化,减小http头部长度)

publicPath:访问路径

outputPath:打包路径,将字体文件打包到fonts文件夹

PS:由于next.js框架有服务端渲染,所以需要判断isServer将fonts文件夹存放在正确的位置

config.module.rules.push({test:/.otf$/,use:[{loader:'file-loader',options:{esModule:false,//这里设置为falsename:'[hash:8].[ext]',publicPath:'/_next/static/fonts',outputPath:`${isServer?'../':''}static/fonts/`,},},],})

webpack5可以使用generator更方便

{test:/\.ttf|eot|otf|woff2?$/i,type:"asset/resource",generator:{filename:"fonts/[name].[hash:8][ext]"}}

加入以上的代码,再次重启我们的项目,发现netwotk中请求字体包已经可以正常的访问

回到页面上看字体已经生效了

4.总结

本次踩坑主要还是在webpack的配置上,webpack的配置还是必须要掌握

原文:https://juejin.cn/post/7096401699438329886
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
逃跑吧!少年 逃跑吧少年有哪些彩蛋? 逃跑吧!少年 逃跑吧少年失忆者怎么玩? 逃跑吧!少年 逃跑吧少年失忆者动作举荧光棒在哪获得? 考驾照周六有考试吗 烟台星期六可以考驾照吗 考驾照的站岗星期六星期天可以站吗 如何看待张艺谋导演的电影《满江红》被指“辱女”? 满江红艺伎叫什么 月经不来尿尿前好像憋着似的一上厕所就尿的不多 怎么学英语歌?我学不会? 想从洪洞坐火车到蚌埠。但是没有直达的。怎么到达那里呢。在 哪里中... 有没有人知道Din字体的版权是什么 玻璃微珠喷丸玻璃微珠 梦见买饼干是什么意思? 女人梦见买饼干 理财通可以买股票吗 微信理财通进阶理财是不是股票 PHIL 001哲学课也要亲自上?UCR网课学分直转攻略!*加州大学河滨分校... 生活照 如何截取一寸照片 最知心的朋友 看完,啥也别说,默默地发给你最知心的朋友吧 “抱琴何处觅锺期”的出处是哪里 “抱琴随白鹤”的出处是哪里 pcb导网表时出现的错误,这是软件哪出错了吗? QQ离线文件接受后,却打不开,提示是没有这种打开方式是怎么回事?_百度... 小清发现从市场买回来的橘子表面长出了一些青绿色的毛茸状东西,这是... 我等你回来一起建立属于自己的家园!爱你的老婆。翻译成英语 浇透水是什么意思 浇透水什么意思 华为h30t10为什么换了个里外屏就开不了机了?插充电器里时候就亮下小红 ... 华为H30-T10手机开机后一会黑屏然后会亮起来卡死在那个操作界面.恢复... 酒驾201是什么意思? 蚌埠距离山西洪洞多远,走中通快递,起步价6元,超重加多少,下来运_百度... 求LOL中文配音还原包.为什么我LOL变成英文了呀。而且死难听。求大神解决... Din字体有没有版权问题? 沈阳至重庆高铁途经哪些站_沈阳到重庆有高铁吗 中考390能上什么高中 羊毛卷适合头发多的还是少的 重庆地铁1号线可以和哪几条线路换乘 我想做一下废纸生意你说我应该怎么做呀 我想在上海回收废纸,想办理一个营业执照。不知道需要办理哪些手续 如何使用iTunes升级iPod Touch 4到iOS6并恢复备份数据? ...我一听他肚子里有声音我都害怕,请问吃什么能让他不拉啊? 汽车行驶证不是我的名字,我可以卖车险吗 Optinvent的AR智能眼镜Ora如何与Google Glass竞争? 请问谁知道R&B珍奶会所如何加盟啊?加盟电话多少?我在苏州,谢谢!!_百度... ...盘符和容量(u盘插电脑上显示usb大容量存储设备但是没有显示盘符... R&B珍奶会所(马陆店)的水蜜桃晶球好不好吃 建行余额宝限额 泰安什么地方的石锅鱼做的好吃? 正定到盖西店多少公里 公益基金是什么