前端的世界里没有“容易”二字

本文回顾2019年大前端技术领域的发展,React、Vue、Angular三足鼎立,状态管理、前端工程化成关键,微前端概念火热。深入探讨前端框架、状态管理工具、编程语言趋势及工程化实践。

转眼,2019年已经过去一大半了。

这半年,你过得怎么样?新的热点技术学会了吗?写的代码还有bug吗?头发还好吗?还记得年初的 Flag 吗?

640?wx_fmt=jpeg

2019年对于大前端技术领域而言变化不算太大,目前三大技术框架日趋成熟,短期内不大可能出现颠覆性的前端框架。

我将在这篇文章中,带大家盘点一下:2019高级前端必备的 TOP 级知识点。你可以看一下你自己的技术体系和当下流行的技术栈,有多大的区别,以及接下来你该如何去规划自己的学习方向。


1
框架层的更新

React,Vue,Angular依旧保持了前三,今年React发布了16.9,Vue3也即将发版,但是总体情况来看Angular在国内的开发者占有率还是偏低,这个跟当初NG1和NG2的语法巨大变革不无关系(手动捂脸)。同时像Flutter for web(Flutter已经不仅仅可以运行在Android或者iOS上,还可以运行在Windows, MacOS, Linux, Chrome OS甚至是Web上)、还有Omi(融合Web Components 、JSX、HTM、虚拟DOM、功能样式和代理合并到一个小型、高性能的框架)也是值得各位同学关注的。不过前端框架千千万,唯有原理永流传。

2
状态管理

随着前端框架的流行,组件化开发成为主流,然而随着页面复杂度越来越高,在一个组件文件中,要做UI渲染、事件处理、状态管理等等事情,于是一个文件变的越来越复杂。同时,页面组件层级变的复杂后,跨组件间的数据通信也变的很繁琐,需要将数据上提到父节点,通过property传输数据、回调方法更新父节点状态等等。这个时候状态管理也显得尤为重要。一想到状态管理大家肯定脱口而出Vuex、Redux、mobx等等。但是随着React Hooks的愈加成熟,基于Hooks版本的轻量状态管理也非常值得大家关注。https://github.com/mobxjs/mobx-react-lite

3
前端工程化

说到这里,请大家看下边这张我总结的图吧。翘首企盼的Webpack5、一个前端在前端工程化中的具体实践中,要做的工作越来越多。

640?wx_fmt=png

4
微前端

微前端简单地说,就是将一个巨无霸(Monolith)的前端工程拆分成一个一个的小工程,你也可以理解微服务前端化,每一个小项目完全具备独立的开发、运行能力。整个系统就将由这些小工程协同合作,实现所有页面的展示与交互。微前端也从最初的一个概念变为前端的新宠儿。一图胜千言吧~

640?wx_fmt=png

5
编程语言

来自statesofjs的统计,在类JS编程语言上,ES6遥遥领先,TypeScript也获得接近半数的使用量。其次是Flow、Reason、Elm和ClojureScript。不过笔者更倾向于TS吧,因为我可以用装饰器很轻松的实现依赖注入,而且像抽象类、接口、类型推断、强类型这里ES6-10还没没有。不过仁者见仁智者见智,选择TS还是ES6还是要看具体的项目而定。

640?wx_fmt=png

6
其他

      

其实整个大前端体系还有非常多需要提的比如工程化、服务端、监控、测试、跨端、等等,篇幅有限笔者写到这为止了。希望大家能够抓住当下大前端发展发展的新趋势,找一份更好的offer。

写在最后

640?wx_fmt=png

看到这里,你是不是想大喊:老子学不动了?成年人的世界没有“容易”二字,你学不动,别人学得动,你只能靠边站。但是为了给家人更好的生活,为了自己的梦想,你必须坚持下去。

引用张爱玲的一句话:中年以后的男人,时常会觉得很孤独,因为他一睁开眼,周围都是要依靠他的人,却没有他可以依靠的人。

前端技术路漫漫,成长的曲线非常的陡峭。老袁从业前端8年,冷暖自知,也希望大家能够跟上这个时代,工作顺利。

我曾经也是一名初级前端,我深知对于初级前端工程师来说,每天的工作大部分可能是搬砖,当你想跳槽涨薪的时候,你会发现自己的技术早就脱节了。

如果你想跟上前端高速发展的时代,如果你也想月薪3万不是终点,是起点,如果你也想做点改变,

真的不妨来参加为1-3年前端同学精心准备的前端训练营:

【高级前端必备的TOP级知识点】

???

大纲如下:

1.TypeScript+Webpack环境搭建

  • 构建基于TypeScript编译和运行环境

  • 构建基于tsx组件化思想Webpack环境

  • 构建TypeScript对Node.js的编译支持

2.React hooks 实战应用

  • 去 Redux 使用React hooks 完成状态管理

  • 使用React hooks+Functional components

3.集成BFF开发模式完成真假路由混用

  • 搭建基于Nest.js的后端开发环境

  • 将React项目发布至其前端进行集成

  • 完成BFF+SPA整体项目的测试环境搭建

4.Webpack开发SPA与MPA核心知识

  • 了解SPA与MPA开发的性能指标区别

  • CSS in JS & JS in CSS工程实践

  • 学习Webpack优化SPA与MPA配置区别

5.基于AST实现简版Webpack

  • 了解Webpack基础运行原理

  • 了解AST在前端开发具体用途

  • 从0到1带你手写简版的Webpack

6.Webpack5新特性尝鲜与微前端

  • 学习Webpack5最新特性和进展

  • 学习Webpack在微前端具体实现细节

备注;本课程购买后随时可看。

以为我文章写了这么多,课程肯定很贵?

本课程原价196元,领取优惠券仅需1元。

给阅读这篇文章的同学限量发放50张优惠券,

扫描下图二维码即可领取,先到先得。???

无界云图(开源在线图片编辑器源码)是由四川爱趣五科技推出的一款类似可画、创客贴、图怪兽的在线图片编辑器。该项目采用了React Hooks、Typescript、Vite、Leaferjs等主流技术进行开发,旨在提供一个开箱即用的图片编辑解决方案。项目采用 MIT 协议,可免费商用。 无界云图提供了一系列强大的图片编辑功能,包括但不限于: 素材管理:支持用户上传、删除和批量管理素材。 操作便捷:提供右键菜单,支持撤销、重做、导出图层、删除、复制、剪切、锁定、上移一层、下移一层、置顶、置底等操作。 保存机制:支持定时保存,确保用户的工作不会丢失。 主题切换:提供黑白主题切换功能,满足不同用户的视觉偏好。 多语言支持:支持多种语言,方便全球用户使用。 快捷键操作:支持快捷键操作,提高工作效率。 产品特色 开箱即用:无界云图采用了先进的前端技术,用户无需进行复杂的配置即可直接使用。 免费商用:项目采用MIT协议,用户可以免费使用和商用,降低了使用成本。 技术文档齐全:提供了详细的技术文档,包括技术文档、插件开发文档和SDK使用文档,方便开发者进行次开发和集成。 社区支持:提供了微信技术交流群,用户可以在群进行技术交流和问题讨论。 环境要求 Node.js:需要安装Node.js环境,用于运行和打包项目。 Yarn:建议使用Yarn作为包管理工具,用于安装项目依赖。 安装使用 // 安装依赖 yarn install // 启动项目 yarn dev // 打包项目 yarn build 总结 无界云图是一款功能强大且易于使用的开源在线图片编辑器。它不仅提供了丰富的图片编辑功能,还支持免费商用,极大地降低了用户的使用成本。同时,详细的文档和活跃的社区支持也为开发者提供了便利的次开发和集成条件。无论是个人用户还是企业用户,都可以通过无界云图轻
<think> 我们正在处理用户关于前端解决PDF体未嵌入问题的需求。 根据引用内容,我们可以总结以下几点关键信息: 1. 引用[1]指出体乱码通常是因为PDF未嵌入体,并建议联系创建者重新生成文件或使用在线工具修复。但用户需求是前端解决方案。 2. 引用[2]提到前端生成PDF时,非英文体容易乱码,因为前端无法访问本地体,需要配置体告诉生成引擎。 3. 引用[3]展示了pdf-lib库中嵌入自定义体的方法(加载体文件并嵌入)。 4. 引用[4]提到xhtml2pdf是Python中HTML转PDF的一个稳定方案,但这用户需要前端方案。 5. 引用[5]提到前端使用vue-pdf预览时出现体缺失导致内容缺失的问题。 用户需求是:前端解决PDF体未嵌入问题的方法。 分析:前端处理PDF体未嵌入问题通常有两种场景: 场景1:前端生成PDF(例如使用jsPDF、pdf-lib等库)时,确保嵌入所需体。 场景2:前端预览PDF时,遇到体未嵌入导致的乱码问题。 根据引用,我们可以针对这两种场景提供解决方案: 场景1:前端生成PDF时嵌入体 - 使用pdf-lib等库时,可以加载并嵌入自定义体(如引用[3]所示)。 - 步骤: 1. 获取体文件(如.ttf)的ArrayBuffer。 2. 使用库提供的embedFont方法嵌入体。 3. 在文本绘制时使用该体。 场景2:前端预览PDF时处理体缺失 - 引用[1]提到作为阅读者可以尝试用福昕阅读器调整体设置,但这属于客户端行为,前端无法控制。 - 对于前端预览组件(如vue-pdf),引用[5]表明体缺失会导致内容缺失。可能的解决方案: 1. 尝试在预览组件中指定备用体(如果组件支持)。 2. 如果PDF文件是用户上传的,可以在服务器端进行体嵌入处理(但用户要求前端解决)。 3. 使用前端PDF处理库(如pdf.js)进行渲染,pdf.js在渲染时可以尝试使用替代体,但可能无法完全解决。 由于在前端预览时,如果PDF未嵌入体,前端通常无法动态嵌入体(因为体文件可能不在前端可访问范围内,且嵌入体需要编辑PDF,而编辑PDF在前端可能性能开销大)。因此,更可行的方案是: 方案一(推荐):在生成PDF时确保嵌入体(适用于由前端生成的PDF) 方案:在服务器端对PDF进行体嵌入处理,然后前端展示处理后的PDF(需要服务器支持) 方案三:使用支持替代体的预览库,如pdf.js,并配置替代体(但无法保证与原设计一致) 针对用户需求“前端解决”,我们重点看前端生成PDF时的体嵌入,以及前端预览时的一些变通方法(可能无法完美解决)。 下面分别给出两种场景的代码示例: 场景1:前端生成PDF时嵌入体(使用pdf-lib) 场景2:前端预览时使用pdf.js并尝试指定备用体(但pdf.js本身不提供嵌入体的功能,只能尝试使用备用体渲染) 由于引用[5]中提到的vue-pdf问题,我们可以建议尝试使用pdf.js(vue-pdf基于pdf.js)并确保使用最新版本,或者尝试在服务器端处理后再返回给前端预览。 考虑到用户问题中要求前端解决,我们优先提供前端生成PDF时嵌入体的方法,因为这是最彻底的解决方案。对于预览已存在且未嵌入体的PDF,前端直接解决的能力有限。 因此,我们给出两种解决方案的说明和代码示例(如果适用): 解决方案一:前端生成PDF时嵌入体(使用pdf-lib) 解决方案前端预览PDF时使用pdf.js(并尝试加载备用体,但效果可能有限) 但注意:解决方案并不能真正嵌入体,只是尝试用备用体渲染,如果PDF中指定了未嵌入的体且备用体不匹配,则可能布局错乱。 根据以上分析,我们给出回答。 </think>针对前端解决PDF体未嵌入问题,结合引用内容的核心技术要点,以下是系统化的解决方案: ### 一、PDF生成阶段的体嵌入方案 1. **使用pdf-lib嵌入自定义体** 通过加载体文件并显式嵌入PDF,确保中文体正确渲染: ```javascript import { PDFDocument } from 'pdf-lib'; import fontKit from '@pdf-lib/fontkit'; const generatePDF = async () => { const pdfDoc = await PDFDocument.create(); pdfDoc.registerFontkit(fontKit); // 加载本地或远程中文体 const fontBytes = await fetch('SourceHanSans.ttf').then(res => res.arrayBuffer()); const customFont = await pdfDoc.embedFont(fontBytes); const page = pdfDoc.addPage(); page.drawText('你好世界', { x: 50, y: 500, font: customFont, // 关键:使用嵌入体 size: 30 }); return await pdfDoc.save(); }; ``` **注意**:需将完整体文件(如.ttf/.otf)部署到CDN或项目目录[^3]。 2. **HTML转PDF工具的体配置** 使用xhtml2pdf等工具时,需在CSS中声明中文体路径: ```css @font-face { font-family: 'CustomFont'; src: url('/fonts/SourceHanSans.otf'); } body { font-family: 'CustomFont', sans-serif; /* 强制使用嵌入体 */ } ``` 通过API指定体路径确保渲染引擎识别[^4]。 --- ### 、PDF预览阶段的应急处理方案 1. **动态体注入(基于pdf.js)** 修改PDF.js渲染器,添加备用体加载逻辑: ```javascript const loadingTask = pdfjsLib.getDocument({ url: 'document.pdf', fontExtraProperties: true }); loadingTask.promise.then(pdf => { pdf.getPage(1).then(page => { const viewport = page.getViewport({ scale: 1.5 }); const canvas = document.getElementById('pdf-canvas'); const ctx = canvas.getContext('2d'); // 注入备用体 const fontLoader = new FontFaceObserver('Noto Sans SC'); fontLoader.load().then(() => { page.render({ canvasContext: ctx, viewport, textLayer: true }); }); }); }); ``` 2. **客户端体回退策略** 在预览组件中声明本地体优先级(适用于vue-pdf等组件): ```javascript <vue-pdf :src="pdfFile" :font-mapping="{ 'SimSun': 'Microsoft YaHei', '宋体': 'PingFang SC' }"></vue-pdf> ``` --- ### 三、最佳实践建议 1. **体优化原则** - 仅嵌入必要符子集(如使用`pyftsubset`裁剪中文形) - 优先选择WOFF2格式(压缩率比TTF高30%+) - 简体中文推荐体:思源黑体、方正悠黑(文件体积<3MB) 2. **服务端协同方案** ```mermaid graph LR A[前端请求PDF生成] --> B[服务端接收] B --> C{是否含中文?} C -->|是| D[注入预设中文体] C -->|否| E[使用默认体] D --> F[返回含嵌入体的PDF] ``` --- ### 常见问题排查矩阵 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 方块乱码 | 体未嵌入 | 检查pdf-lib的embedFont调用 | | 文重叠 | 备用体尺寸不匹配 | 调整CSS的`line-height`属性 | | 部分文缺失 | 体子集不完整 | 使用`fonttools`扩展符集 | > **关键结论**:根本解决方案是在**PDF生成阶段主动嵌入体**,预览阶段的替代方案受限于浏览器体渲染机制,效果可能不一致[^2][^5]。对于企业级应用,建议结合服务端体管理中间件实现动态嵌入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值