【前端小妙招】妙用 module/nomodule 技术实现优雅降级和性能优化

原创
01/19 00:22
阅读数 145

小伙伴们晚上好,欢迎来到前端小妙招。相信大家都知道我们平时写的代码需要经过语法转化和插入polyfill处理才能在生产上使用。但是如果实际运行的代码都是低版本代码,岂不是用新浏览器会加载大量根本用不上的代码?如果用高版本浏览器访问,能够直接运行高版本浏览器的语法,就可以大大减小在高版本浏览器下的包体积。

 

使用script type等于module可以让支持 ES module的浏览器运行,不支持  ES module 的浏览器忽略。

使用script no module可以让支持 ES module 的浏览器忽略,不支持 ES module 的浏览器运行。

我们可以利用以上特性写个打包方案输出两个版本,用不同的配置进行使用。

 

在中低版本中,我们需要通过模块化运行时来管理模块,我们把代码转化为AMD 或 system JS,然后用 amd 或 systemjs 的加载器进行加载模块。

我们看效果。

Nice

这里我自己写了一个AMD加载器,以提升性能。

 

高版本中,转化为 es2015。

但是es2015不支持动态import,而且我们需要有预加载功能,这里我们基于ESM写一个模块化运行时,功能包括含预加载的动态import和Safari 10 no module polyfill。

这样我们就在高版本省去了 Promise、Map、Set的打入和Class、箭头函数的转化等。

我们看看最终效果

这是高版本,这是中低版本

Nice

 

中低版本我们也可以按照这个思路进一步细分

 

IE8 到 IE9 有巨大的差异,我们用条件注释再分为低中两个版本。

低版本不会打入其不支持的功能,中版本也不会打入已支持的功能。

还可以用别名插件让低版本使用低版本实现的相关库(比如 anu js)

我们引入个 React 看看效果

Nice

 

通过这种方式使用CSS,我们也可以通过不同版本的 PostCSS 配置打出不同版本的 CSS 可以减少加载的代码。

我们随便写一个CSS,

注意看,低版本自动加入了CSS Hack,中版本自动补全了浏览器前缀。

 

不得不说工程化真是太有用了。

好了,本期视频就到这啦,喜欢的小伙伴可以点击订阅收藏和关注,我们下次见了,拜拜。 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部