大家好,很高兴又见面了,我是高级前端进阶,由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发! 高级前端进阶前言 corejs作者DenisPushkarev最近发表了一篇长文《So,whatsnext?》,他表示最近发生的事情让自己颇有感慨,于是用很大篇幅讲述了自己的开源经历和遭遇以及心态变化。 从Denis的经历来看,放弃高薪工作来维护corejs完全就是为爱发电,即使corejs的用户数达到了惊人的量级,但鲜有人愿意为他投入的时间和精力支付酬劳。 Denis表示,自己曾在GitHub和npm的主页README中发布过筹款信息,但最后一个月只收到了57美元的捐赠。为此,他还在corejs的CLI中添加了相应的求职信息,却引来了许多不友好的回应。因此,作者有可能考虑闭源corejs!具体事情的脉络可以参考文末的资料,本文不再深入展开,将会将重点放在corejs,即这个核心的库上面。1。什么是corejs? 什么是corejs? Corejs是JavaScript的模块化标准库。包括ECMAScript的Polyfill到ES2023,主要囊括:Promise、Symbol、Collections、Iterators、TypedArrays,、类型数组以及许多其他特性、ECMAScript提案、一些跨平台的WHATWGW3C特性和提案等等。 将上面的简短介绍拆开来看,主要包括以下核心特性:Corejs是JavaScript标准库中最流行和最通用的polyfill,它为最新的ECMAScript标准和提案提供支持,从古老的ES5功能到迭代器等前沿功能,以及与ECMAScript密切相关的Web平台功能,如structuredClone等等。Corejs是最复杂和最全面的polyfill项目。corejs包含大约5000个复杂程度不同的polyfill模块(NPM文件数量显示为3331),从Object。hasOwn或Array。prototype。at到URL、Promise或Symbol等等。Corejs最大限度地模块化:可以允许开发者仅加载需要的功能,而且可以不污染全局命名空间。Corejs不是一个框架,其专为与工具集成而设计,并提供了为此所需的一切。例如:babelpolyfill、babelpresetenv、babeltransformruntime,类似的SWC功能都基于corejs,而且最重要的是开发无感,开箱即用。2。Corejs的开发者数据 从Github的数据来看,corejs项目已经创建超过了10年时间,最新版本为2。28。0,Github上的star数量达到了19。6k,fork数据也达到了1。5k。 corejs的github数据 从NPM的月下载数据来看,在2022年1月左右corejs月下载量达到了惊人的2亿,即使按周维度来看,NPM的周下载量在最近一周也达到了惊人的35,114,396,即3500W左右。 corejs每月下载量 将corejs的下载周期拉长到最近一年,从下图可以看出下载量基本是趋于平缓的(除了2022年12月的一个低谷)。 corejs最近一年下载量 从以上开发者数据来看,corejs确实是前端界的璀璨明珠,如果将其闭源,那么将会有太多项目受到影响。根据GithubGits的2023026号的官方数据,目前corejs的项目依赖量是惊人的,达到了9369个,在所有库的项目依赖量中排名33位(第一名是lodash,确实是比较诧异)。 corejs的项目依赖量数据3。Corejs使用示例3。1全局引入importcorejsactual;Promise。resolve(42)。then(itconsole。log(it));42Array。from(newSet(〔1,2,3〕)。union(newSet(〔3,4,5〕)));〔1,2,3,4,5〕〔1,2〕。flatMap(it〔it,it〕);〔1,1,2,2〕(function(i){while(true)yieldi;})(1)。drop(1)。take(5)。filter(itit2)。map(itit2)。toArray();〔9,25〕structuredClone(newSet(〔1,2,3〕));newSet(〔1,2,3〕)3。2按需引入 也允许开发者仅加载所需的功能:importcorejsactualpromise;importcorejsactualset;importcorejsactualiterator;importcorejsactualarrayfrom;importcorejsactualarrayflatmap;importcorejsactualstructuredclone;Promise。resolve(42)。then(itconsole。log(it));42Array。from(newSet(〔1,2,3〕)。union(newSet(〔3,4,5〕)));〔1,2,3,4,5〕〔1,2〕。flatMap(it〔it,it〕);〔1,1,2,2〕(function(i){while(true)yieldi;})(1)。drop(1)。take(5)。filter(itit2)。map(itit2)。toArray();〔9,25〕structuredClone(newSet(〔1,2,3〕));newSet(〔1,2,3〕)3。3不污染全局变量 在没有全局命名空间污染的情况下使用Corejs:importPromisefromcorejspureactualpromise;importSetfromcorejspureactualset;importIteratorfromcorejspureactualiterator;importfromfromcorejspureactualarrayfrom;importflatMapfromcorejspureactualarrayflatmap;importstructuredClonefromcorejspureactualstructuredclone;Promise。resolve(42)。then(itconsole。log(it));42from(newSet(〔1,2,3〕)。union(newSet(〔3,4,5〕)));〔1,2,3,4,5〕flatMap(〔1,2〕,it〔it,it〕);〔1,1,2,2〕Iterator。from(function(i){while(true)yieldi;}(1))。drop(1)。take(5)。filter(itit2)。map(itit2)。toArray();〔9,25〕structuredClone(newSet(〔1,2,3〕));newSet(〔1,2,3〕) 更多关于corejs的用法可以参考文末的资料。4。本文总结 本文主要和大家介绍下这两天前端圈的大事,即corejs作者通过readme来表达自己遭遇的变故,以及corejs目前开源遇到的诸多问题。同时对Corejs是什么,corejs怎么用做了简单的介绍。如果有兴趣,文末的参考资料提供了大量优秀文档以供学习。 参考资料 https:www。oschina。netnews228389corejsmaintainersowhatsnext https:www。npmjs。compackagecorejs https:github。comzloirockcorejsblobmasterREADME。md https:github。comzloirockcorejsreadme