以接口请求的方式,解决移动端页面中字体文件过大的问题

需求

背景:内容发布系统(想象一下今日头条的文章)面向移动端的文章,被要求使用思源宋体的字(客户付钱买的字体),2个字体文件加起来有30MB。

PS:中文字体发展落后英文字体,最大的一个原因就是字体包太大,第二原因是字太多,所以设计字体的人也少。。。不像英文26个字母,两者不是一个量级的。

方案说明

需要技术: js, nodejs,服务器 一个,nginx

示例地址: 点我预览

github仓库:https://github.com/font-size/node-fontmin-project

核心:通过fontmin切割字体,一个原本十几MB(思源宋体)的字体通过切割基本可以达到几十KB的效果。

方案优势:

  • 整套方案由纯js实现,轻量级应用
  • 字体文件变成按需加载,量级从MB变成KB,切割后的大小不如一张普通的图
  • 对现有项目的页面改动小,对各种类型的项目兼容性好
  • 可以批量实现

实现步骤:

  1. 在服务端新增nodejs接口
  2. 前端页面新增请求post接口,根据返回的字体文件url,动态设置font-face等页面样式
  3. 示例如下

在这里插入图片描述
在这里插入图片描述
可以看到这个字体的size只有短短19.4kb,更令人惊喜的是,他是用接口实现的,也就是说,前端项目可以很方便的兼容。

从0开始架设node服务的步骤

  • 起nodejs服务,开发一个js页面
  1. 下载nodejs安装包,在服务器上(或本地)安装
  2. 新建一个目录,输入npm init,然后一路确认,生成package.json。
  3. 接着npm安装依赖 (fontmin,express,body-parser3个依赖包),代码分别是npm i fontmin --save,npm i express–save,npm i body-parser–save
  4. 开发逻辑代码(开发一个post接口)
  • nodejs代码

目录下新建express.js

// const fs = require('fs');
const fontmin = require('./fontmin')// 切割程序,后续会讲
const express = require('express');
const bodyParser = require('body-parser');
// 设置可用字体
const fonts = [
    {
   font: 'SourceHanSerifCN-Medium', name: '思源宋体'},
    {
   font: 'PangMenZhengDao', name: '庞门正道粗书体'},
    {
   font: 'RuiziGongfangMeiheiGBK', name: '锐字工房云字库美黑GBK'},
    {
   font: 'RuiziZhenyanti', name: '锐字真言体'},
    {
   font: 'YousheBiaotihei', name: '优设标题黑'},
    {
   font: 'Zihun116', name: '字魂116号-凤鸣手书'}
]

// express 实例
const app = express();

// 转化参数设置
app.use(bodyParser.json());

app.use(bodyParser.urlencoded({
   
    extended:true
}));

// post 接口
app.post('/getfontmin'
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在JavaWeb,可以通过编写过滤器解决post请求方式文乱码问题。具体步骤如下: 1. 创建一个过滤器类,实现javax.servlet.Filter接口。 2. 在过滤器类重写doFilter方法。 3. 在doFilter方法获取请求的编码方式,并将请求的数据按照该编码方式进行解码。 4. 在doFilter方法修改请求的编码方式为UTF-8,并将修改后的请求传递给下一个过滤器或Servlet进行处理。 具体代码如下: ```java import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @WebFilter(filterName = "EncodingFilter", urlPatterns = "/*") public class EncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; // 获取请求的编码方式 String encoding = request.getCharacterEncoding(); if (encoding == null) { encoding = "UTF-8"; // 默认编码方式为UTF-8 } // 将请求的数据按照指定编码方式进行解码 servletRequest.setCharacterEncoding(encoding); // 修改请求的编码方式为UTF-8 servletResponse.setContentType("text/html;charset=UTF-8"); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } } ``` 在上述代码,我们使用@WebFilter注解来指定该类为过滤器,并且设置了过滤的urlPatterns为"/*",表示对所有请求进行过滤。 在doFilter方法,我们首先获取请求的编码方式,并将请求的数据按照该编码方式进行解码。然后,我们将请求的编码方式修改为UTF-8,并将修改后的请求传递给下一个过滤器或Servlet进行处理。 需要注意的是,如果你使用了Spring框架,则可以通过在配置文件添加如下配置来解决文乱码问题: ```xml <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 在上述配置,我们使用了Spring框架提供的CharacterEncodingFilter过滤器来解决文乱码问题。可以通过在配置文件添加该过滤器来自动解决文乱码问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值