webpack的tree shaking的实现方法


Posted in Javascript onSeptember 18, 2019

webpack的tree shaking

util.js

export const a = () => {
 console.log("a123456方法");
};
export const b = () => {
 console.log("b123456方法");
};

main.js

import {a} from './utils';
a();

sideEffects

一般而言,上述代码,在 webpack 进行 tree shaking 能够不打包 function b 的代码,这是因为 webpack 对代码进行了分析, b 没有引用不会打包。

但是npm包中,通过这种方式去引用,你会发现 tree shaking 并没有生效, 这是因为webpack无法识别你的代码是否存在副作用,故而无法执行tree shaking ,解决方法是给你的npm包 package.json 加上 sideEffects: false ,告诉webpack是无副作用的, webpack 可以放心处理。

什么是副作用( side effect ),即你的函数会对外部变量造成影响,比如

function a() {}
a.location = window.location
a.location.hash = 'll'

这就是一个副作用函数,所以编写纯函数

es6

如果你的npm包使用了es6的特性,比如类,最终你打包出来的代码只打包了成了es5的,那么恭喜你,基本上你的npm包和 tree shaking 无缘了。

es6转es5(babel),会产生大量的副作用,所以基本上大部分包都提供es6版本的代码, tree shaking 交给你本地的webpack去处理。

当然也不是完全没有办法,antd老大哥就开发了一个babel-plugin-import,实现精确引用的代码的方式,但是你必须将每个模块单独分成一个文件。

总结

基本上tree shaking的解决方法就是导出es6模块,同时标明自己是无副作用的,如果加上babel-plugin-import就更完美了

rollup的一个提案蛮有趣的!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery打造PHP的AJAX表单提交实例
Nov 03 Javascript
JS子父窗口互相操作取值赋值的方法介绍
May 11 Javascript
jQuery实现的动态伸缩导航菜单实例
May 07 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
Apr 23 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
May 03 Javascript
AngularJS入门教程之服务(Service)
Jul 27 Javascript
WebPack基础知识详解
Jan 16 Javascript
jQuery Masonry瀑布流布局神器使用详解
May 25 jQuery
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
Dec 11 jQuery
VuePress 快速踩坑小结
Feb 14 Javascript
JavaScript实现简单计算器功能
Dec 19 Javascript
javascript实现画板功能
Apr 12 Javascript
js实现窗口全屏示例详解
Sep 17 #Javascript
js实现简单页面全屏
Sep 17 #Javascript
js模拟F11页面全屏显示
Sep 17 #Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
Sep 17 #Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
Sep 17 #Javascript
Cordova(ionic)项目实现双击返回键退出应用
Sep 17 #Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
Sep 17 #Javascript
You might like
PHP如何得到当前页和上一页的地址?
2006/11/27 PHP
php使用PDO方法详解
2014/12/27 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
javascript 写类方式之四
2009/07/05 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
学习JavaScript的最佳方法分享
2011/10/21 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
JS实现数字格式千分位相互转换方法
2016/08/01 Javascript
vue.js 初体验之Chrome 插件开发实录
2017/05/13 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
[00:19]CN DOTA NEVER DIE!VG夺冠rOtK接受采访
2019/12/23 DOTA
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
python pandas 对series和dataframe的重置索引reindex方法
2018/06/07 Python
利用Python实现kNN算法的代码
2019/08/16 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
Numpy 多维数据数组的实现
2020/06/18 Python
Python用access判断文件是否被占用的实例方法
2020/12/17 Python
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
HTML5调用手机发短信和打电话功能
2020/04/29 HTML / CSS
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
美国家居装饰购物网站:Amanda Lindroth
2020/03/25 全球购物
教师实习期自我鉴定
2013/10/06 职场文书
大学生优秀的自我评价分享
2013/10/22 职场文书
会计专业毕业生自我鉴定
2013/10/29 职场文书
弘扬职业精神演讲稿
2014/03/20 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
字典算法实现及操作 --python(实用)
2021/03/31 Python
MySQL 8.0 驱动与阿里druid版本兼容问题解决
2021/07/01 MySQL
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers