云音乐大前端专栏

从浏览器渲染原理谈动画性能优化

2022-01-17

设备硬件性能的提升、浏览器内核的升级给在网页端实现流畅动画提供了可能。目前,常规设备的刷新频率是 60HZ,也就是说,如果要让用户感受不到明显卡顿,浏览器的渲染流水线需要每秒输出 60 张图片(60 FPS)。本文会从基础的渲染树出发,介绍浏览器渲染流水线,以及常用的优化动画性能的方法。

rrweb 带你还原问题现场

2022-01-06

为了快速定位并解决CMS使用过程中遇到的问题,开发了问题一键上报插件,用于还原问题现场。本文会简要阐述问题上报插件的设计,以问题上报插件作为一个入口去探索rrweb库的实现原理,主要会从事件监听、DOM 序列化、自定义计时器三方面去着重阐述。

Android隐私合规静态检查(二)

2021-12-27

之前分享了一篇关于 Android 隐私静态合规检查的文章,今天我们继续分享一下如何针对 so 调用、查找隐私方法调用入口等场景进行静态检查工作。

LOOK直播活动地图生成器方案

2021-12-14

在最近的活动开发中,笔者完成了一款大富翁的游戏。其技术细节暂且忽略,在这里主要想探讨下地图绘制的问题。在整个地图中,有很多的组成路径的方格以及作为房产的方格,如果一个个手动去调整位置,工作量是很大的。因此需要一个方案能够帮助我们快速确定方格在地图中的位置。下面便是笔者所采用的方法。

Eggjs 入门解构

2021-12-02

Eggjs虽然提供了入门教程,但是有大量的约定俗成,对于理解上有一定的成本和门槛。本文以快速入门的例子通过不同的角度进行解读,阐述相关编程思想,希望能帮助大家能更好的掌握这一框架

Android 隐私合规静态检查

2021-11-01

目前,国内对应用程序安全隐私问题监管变的越来越严格。各个应用市场对APP上架也有比较严格的检查。云音乐今年也在Google Play上上架了一些海外的社交类业务。Google Play在审核应用的时候,也有相应的政策。当我们每次遇到问题的时候,需要根据检查方的信息对一些代码逻辑进行排查。笔者开发了一个辅助定位隐私API调用的静态检查工具。在这里进行一个简单的分享。

AGP 升级之旅

2021-09-02

本文将介绍 AGP 由 3.5.0 升级到 4.1.3 的适配过程,对遇到的问题进行分析,并给出相应的解决方案。

Android 开发,如何写出符合规范的异常处理代码?

2021-08-13

本文介绍了 Java 和 Kotlin 相关的异常知识,对于现实开发中经常遇到的一些关于异常处理的问题(如何抛出异常,如何捕捉异常,Java 和 Kotlin 异常对齐),并阐明了云音乐对这块的态度和规范。

官方揭秘!你的颜色是这样算出来的……

2021-05-31

想知道刷屏朋友圈的颜色测试 H5 是如何开发出来的吗?想知道测试结果又是如何计算的吗?本次活动的核心开发人员将为大家揭秘颜色测试活动的技术细节。

Objects in v8

2021-04-27

当要深入了解 v8 内部的内存管理细节时,首先需要了解对象在 v8 中的处理方式,本文将结合源码对 v8 中的对象处理进行简单介绍

Wakeup in XNU

2021-04-14

苹果在 iOS 中加入了新的性能指标`wakeup`,这里让我们来看看其原理与解决思路。

前端单元测试技术方案总结

2021-03-03

单元测试的技术方案很多,不同工具之间有互相协同,也存在功能重合,给我们搭配测试方案带来不小的困难,而且随着 ES6, TypeScript 的出现,单元测试又增加了很多其他步骤,完整配置起来往往需要很大的时间成本。

WKWebView 请求拦截探索与实践

2021-01-28

在苹果推出 WebKit 后,UIWebView 正在退出历史舞台,WKWebView 凭借着速度快、占用内存小等优势逐渐的被大家广泛使用。云音乐在 WebView 上的使用要求有离线包加载以及免流等能力,这一切都得依赖请求拦截能力。本文总结了我们在实现 WKWebView 请求拦截的一些经验,希望能帮助到正在研究该方面的同学。

Flutter 图片控件适配之路

2021-01-13

在我们接入 Flutter 技术的时候,必然会用到大量的图片,本文将讨论构建一个图片控件的方案与优化过程。

剖析 lottie-web 动画实现原理

2021-01-07

lottie-web 可以帮我们实现非常炫酷的动画效果,那么它是如何实现的呢?笔者对动画实现和原理做了一次梳理,整理了下面的文档供大家参考。

Poplayer 云音乐优化实践

2020-12-30

Poplayer 名词来自阿里的一篇文章,结合 Android 场景来看,其实就是页面上层再加一层,称作 Poplayer。通过Poplayer 层我们可以将一些临时业务交由这一层去处理维护,而这一层又交由 WebView 去承载,在增加动态性的同时又不影响既有稳定业务。

React 事件系统工作原理

2020-12-23

React 为我们提供了一套虚拟的事件系统,这套虚拟事件系统是如何工作的,笔者对源码做了一次梳理,整理了下面的文档供大家参考。

漫谈 React Fiber

2020-12-16

本文来自于内部分享,整理成文,涉及两部分内容,ReactFiber 和 Custom Renderer,探究一些 Fiber 的起因及 Fiber 衍生产物 Custom Renderer 的实施。

聊聊RN中Android提供View的那些坑

2020-12-02

最近笔者研究 Android 中使用自定义 View 提供原生组件给 React Native(下面统一写成 RN) 端的时候,遇到一些实际问题,在这里从 RN 的一些工作机制入手,分享一下问题的原因和解决方案。

如何基于 TypeScript 实现控制反转

2020-11-25

IoC(Inversion of Control)控制反转,是面向对象编程中的一种设计原则,用来降低计算机代码之间的耦合度。本文通过梳理控制反转的概念,优势以及基于 TypeScript 的实现,为大家在日常编码中写出可维护性更高的代码提供一些参考。

云音乐 React Native 优化实践之拆包与预热

2020-11-12

随着 React Native 技术在云音乐业务中广泛的应用,一些比较重要的功能也开始采用 React Native 的方案来进行了,这就给 React Native 页面的打开速度提出了更高的要求,本次优化采用拆包与预热方案,让我们来看看是如何实现的吧。

函数式编程进阶:应用函子

2020-11-06

当你开始学习函数式编程的时候,你肯定听说过“纯函数”,“副作用”,“柯里化”等概念,本章将从这些基础概念入手开始,开始讲解把一个函数装进 “Box” 中的理念,然后引出“应用函子”的概念,并给出实际的应用案例。

前端组件化埋点的实践

2020-10-30

在流量红利逐渐消失的现在,数据的采集、分析和精细化的运营显得更加重要,所以埋点在互联网产品中是很常见的,它可以更好的辅助我们去迭代、完善产品功能。

网易云音乐 iOS 14 小组件实战手册

2020-10-26

苹果在今年的 WWDC20 上发布了小组件(WidgetKit),支持在 iOS、iPadOS 主屏幕展示动态信息和个性化内容。作者刚刚完成云音乐小组件的初版开发工作,本文从实际开发的角度谈谈小组件开发的方方面面,希望能给大家带来帮助。

聊聊 JavaScript 的并发、异步和事件循环

2020-10-19

JavaScript 作为天生的单线程语言,社区经常聊 JavaScript 就聊异步、聊 Event Loop,看起来它们好像难舍难分,实际上可能只有五毛钱的关系。本文把这些串起来讲讲,希望能给读者带来一些收获,如果能消除一些误解那就最好了。

UIButton 状态新解

2020-10-14

UIButton 做为 iOS 开发中最常用的控件,它的状态只有 normal、highlighted、selected、disabled 吗?

字体构造与文字垂直居中方案探索

2020-09-09

文字垂直居中是一个 CSS 常见的操作,可是我们平时的方法其实并没有达到真正意义上的垂直居中。本文将介绍字体的相关概念,并说明如何找到真正居中的位置。

云音乐 React Native 体系建设与发展

2020-09-02

本文介绍了云音乐引入 React Native 0.33 版本历史,RN 自动部署平台和离线包服务平台实现,0.33 版本如何升级到 0.6 版本,业界首个 RN codemod 框架推出,三端方案落地,基础设施完善,RN 现状及未来规划。

用「增量」思想提升代码检查和打包构建的效率

2020-08-26

当一个前端工程代码量越来越大时,开发发布流程中代码检查、构建的时间也越来越久。本文将介绍用「增量」思想提升代码检查、打包构建环节的速度,从而实现开发过程的效率提升。

面向复杂场景的表单解决方案

2020-08-20

表单涉及到联动、校验、布局等复杂场景,经常是开发者的需要耗费精力去解决的点,虽然传统的开发表单的方式已经足够的灵活但是依然有提效的空间,所以针对复杂的表单开发场景我们总结了一套表单开发方案

React Fiber 源码解析

2020-08-11

React Fiber 由来已久,是 React 设计思想的一个典型表现。了解 Fiber 原理对我们更好理解 React 运行机制以及后续版本的新增特性,比如异步渲染能力等都有很大的帮助。本文基于 React v16 的源码,输出一些理解,希望对你也有帮助。

Web 端 APNG 播放实现原理

2020-08-06

在云音乐的直播开发中会常遇到动画播放的需求,每个需求的应用场景不同,体积较小的动画大都采用 APNG 格式。

React Native 实现自定义下拉刷新组件

2020-07-21

Web 应用如果要更新列表数据,一般会选择点击左上角刷新按钮,或使用快捷键 Ctrl+F5,进行页面资源和数据的全量更新。如果页面提供了刷新按钮或是翻页按钮,也可以点击只做数据更新。但移动客户端屏幕寸土寸金,无论是加上一个刷新按钮,还是配合越来越少的手机按键来做刷新操作,都不是十分便捷的方案。

实现一个简单的基于 WebAssembly 的图片处理应用

2020-07-01

本文希望通过 Rust 敲一敲 WebAssembly 的大门。作为一篇入门文章,期望能够帮你了解 WebAssembly 以及构建一个简单的 WebAssembly 应用。在不考虑IE的情况,目前大部分主流的浏览器已经支持 WebAssembly,尤其在移动端,主流的UC、X5内核、Safari等都已支持。读完本文,希望能够帮助你将 WebAssembly 应用在生产环境中。

互动直播中的前端技术 -- 即时通讯

2020-06-08

在疫情期间,上班族开启了远程办公,体验了各种远程办公软件。老师做起了主播,学生们感受到了被钉钉支配的恐惧,歌手们开启了在线演唱会,许多综艺节目也变成了在线直播。在这全民互动直播的时期,我们来聊聊互动直播中的即时通讯技术在前端中的使用。

React Hooks 最佳实践

2020-05-22

在过去的几个月里,React Hooks 在我们的项目中得到了充分利用。在实际使用过程中,我发现 React Hooks 除了带来简洁的代码外,也存在对其使用不当的情况。这篇文章中,我想总结我过去几个月来对 React Hooks 使用,分享我对它的看法以及我认为的最佳实践,供大家参考。

Node.js 应用日志切割原理与踩坑实践

2020-05-09

2019 年初的时候,我们业务组上线了一个新的 Node.js 应用,主要提供C端的 API 服务。 随着应用流量的逐渐增加,线上监控平台会偶发性报警,提示磁盘 disk_io 平均等待时间超出 1000ms,随后观察发现磁盘 IO 每秒写字节量突然飙高,但很快又下降。

Node CLI 工具的插件方案探索

2020-04-28

CLI 工具作为开发者们亲密无间的好伙伴,996 风雨无阻地陪伴着我们进行日常的开发工作。身为前端开发,你一定也亲自开发过一套属于你自己的 CLI 小工具!

从零搭建中后台框架的核心流程

2020-04-17

随着 React 生态的快速发展,社区基于 React 的状态管理方案层出不穷,这意味着很多方案开发者依然要做很多选择,没有约定的团队,沟通成本和跨团队协作成本,以及长期的维护是非常高的,这时候统一一套开发模式就显得尤为重要。

Web 视频播放的那些事儿

2020-04-07

对于视频的在线播放,按视频内容的实时性可以分为点播(VOD)和直播(Live Streaming)。现如今在 Web 环境下需要进行视频播放时,通常可以使用 video 标签,通过它将视频播放的各个环节都托管给浏览器。

从全局播放到单例模式

2020-03-24

本文以音频能力中的全局播放为切入点,探讨单例模式在前端业务中的应用。文中代码均为 React 组件内代码。

Three.js 动效方案

2020-03-17

Three.js(下面简称 Three) 作为一个 3D 库,不仅减少了我们学习 OpenGL 和 WebGL 的成本,还大大提升了前端在可视化上给用户带来更多的真实、沉浸式的体验。众所周知,Three 更多的是用 3D 模型 + 投影相机 + 用户交互的方式来构建一个「3D 世界」。

支持动态路由的 React Server Side Rendering 实现

2020-02-28

服务端渲染有很多坑会踩,针对路由本文提出一种解决方案,在服务端不使用中心化的路由配置,结合 Code Splitting ,通过一次预渲染,获取当前 URL 对应的模块名和数据获取方法。

前端 DSL 实践指南(上)—— 内部 DSL

2020-02-20

本文作者由于工作经历上的特殊性,积累了一些关于前端 DSL 的实践经验(主要是外部 DSL),在所维护的开源项目中也有一些体现,同时作者在社区也有过一些不成体系的回答如《如何写一个类似 LESS 的编译工具》。这次我会尝试从前端开发的视角来完整探讨下 DSL 这个「难以细说」的议题。

捕获 React 异常

2020-01-14

韩国某著名男子天团之前在我们平台上架了一张重磅数字专辑,本来是一件喜大普奔的好事,结果上架后投诉蜂拥而至。部分用户反馈页面打开就崩溃,紧急排查后发现真凶就是下面这段代码。

用 Web 实现一个简易的音频编辑器

2020-01-09

市面上,音频编辑软件非常多,比如 cubase、sonar 等等。虽然它们功能强大,但是在 Web 上的应用却显得心有余而力不足。因为 Web 应用的大多数资源都是存放在网络服务器中的,用 cubase 这些软件,首先要把音频文件下载下来,修改完之后再上传到服务器,最后还要作更新操作,操作效率极其低下。如果能让音频直接在 Web 端进行编辑并更新到服务器,则可以大大提高运营人员的工作效率。下面就为大家介绍一下如何运用 Web 技术实现高性能的音频编辑器。

函数式编程进阶:杰克船长的黑珍珠号

2019-12-30

本系列文章适合拥有扎实的 JavaScript 基础和有一定函数式编程经验的人阅读,本文的目的是结合 JavaScript 的语言特性来讲解范畴论的一些概念和逻辑在编程中的实际应用。

「圣诞特辑」纯前端实现人脸识别自动佩戴圣诞帽

2019-12-25

叮叮当,叮叮当,吊儿个郎当,一年一度的圣诞节到咯,我不由的回想起了前两年票圈被圣诞帽支配的恐惧。对于懒人的我来说,自己调整一个圣诞帽子佩戴还是太麻烦了。于是我就想了,有没有什么办法能让我的头像自动佩戴上圣诞帽呢?还真给我想到了,这就是今天的主题,用纯前端的方式给你做一个自动佩戴圣诞帽的网站。

从 Fetch 到 Streams —— 以流的角度处理网络请求

2019-12-23

流在开发中是一个很常见的概念。有了流,在处理大文件时就不再需要等待整个数据获取完毕后才处理数据,而是可以一段一段地拿到数据,在获得数据的同时直接解析数据。这样既可以高效利用 CPU 等资源,还减少了存放整个数据的内存占用。不过在过去,客户端 JavaScript 上都没有流的概念,而随着 Streams API 在各大浏览器上的逐步实现,我们终于可以使用原生的 API 以流的角度来看待数据了,例如从 fetch 请求上可以得到一个网络流。

开发高质量服务端 API

2019-12-17

如果使用了 Node.js 作为服务端开发语言,我们肯定要开发 API 接口。本文用一个示例需求,来讲述一下如何高效开发高质量的服务端 API 接口。

云原生基础及调研

2019-12-09

本文仅用于简单普及,达到的目的是给没接触过或者很少接触过这方面的人一点感觉,阅读起来会比较轻松,作者深知短篇幅文章是不可能真正教会什么的,所以也不会出现 RTFM 的内容。

前端领域的 Docker 与 Kubernetes

2019-11-27

看完本文希望读者能够了解到,Docker 的基本原理,Kubernetes 是怎么工作的, 对于前端 Kubernetes 有哪些优势与玩法。

使用 svrx 实现更优雅的接口 Mock

2019-11-20

目前 Web 开发普遍都切换到了前后端分离的开发模式。虽然在工程和职能上已经分离了,但在实际工作中,前后端在开发进度上往往会出现不一致的情况,此时就会极大地影响开发效率。 接口 mock 在此时就发挥出了巨大价值,它磨平了这个时间差,最终实现高效的前后端分离开发。

Lighthouse 测试内幕

2019-11-12

云音乐前端性能监控平台,底层使用了 Lighthouse 进行审计评分,在实践过程中我们积累了一些 Lighthouse 内部实现的研究经验,希望通过这篇文章可以分享给各位读者。

JavaScript 中的位运算和权限设计

2019-11-07

先简单回顾下位运算,平时用的少,相信不少人和我一样忘的差不多了,根据位运算的特点,设计一个权限系统(添加、删除、判断等)

从零实现自定义 JSON Parser

2019-10-31

Zergling 是我们团队自研的埋点管理平台,默认的数据格式有点特殊,需要一个自定义的 json parser 来规范输入问题,总的分为词法分析和语法分析两部分

Web Audio在音频可视化中的应用

2019-09-26

本文有两个关键词:`音频可视化`和`Web Audio`。前者是实践,后者是其背后的技术支持。 Web Audio 是很大的知识点,本文会将重点放在**如何获取音频数据**这块。

Web 应用的撤销重做实现

2019-08-22

前不久,我参与开发了团队中的一个 web 应用,过程中让用户能够进行操作的**撤销、重做**会提高编辑效率,大大提高用户体验,而本文要讲的正是在这个功能实现中的探索与总结。