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 相关文章推荐
window.onload 加载完毕的问题及解决方案(上)
Jul 09 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
Jul 09 Javascript
JS关键字球状旋转效果的实例代码
Nov 29 Javascript
利用函数的惰性载入提高javascript代码执行效率
May 05 Javascript
JavaScript实现输入框(密码框)出现提示语
Jan 12 Javascript
解析jquery easyui tree异步加载子节点问题
Mar 08 Javascript
vue使用Axios做ajax请求详解
Jun 07 Javascript
将jquery.qqFace.js表情转换成微信的字符码
Dec 01 jQuery
原生JavaScript实现todolist功能
Mar 02 Javascript
JS实现读取xml内容并输出到div中的方法示例
Apr 19 Javascript
react-navigation之动态修改title的内容
Sep 26 Javascript
node中IO以及定时器优先级详解
May 10 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&mysql(六)
2006/10/09 PHP
global.php
2006/12/09 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
PHP使用token防止表单重复提交的方法
2016/04/07 PHP
php中序列化与反序列化详解
2017/02/13 PHP
PDO::query讲解
2019/01/29 PHP
nodejs实用示例 缩址还原
2010/12/28 NodeJs
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
javascript动态加载三
2012/08/22 Javascript
JQuery 图片滚动轮播示例代码
2014/03/24 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
2016/06/01 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
基于JavaScript实现报警器提示音效果
2017/10/27 Javascript
使用vue制作探探滑动堆叠组件的实例代码
2018/03/07 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
2018/10/12 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
基于python绘制科赫雪花
2018/06/22 Python
基于Python实现扑克牌面试题
2019/12/11 Python
django rest framework serializer返回时间自动格式化方法
2020/03/31 Python
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
PHP两种查询函数array/row的区别
2013/06/03 面试题
中专毕业生的自我鉴定
2013/12/01 职场文书
幼儿教师思想汇报
2014/01/10 职场文书
生物科学专业职业规划书范文
2014/02/11 职场文书
个性发展自我评价
2014/02/11 职场文书
文明上网主题班会
2015/08/14 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python
oracle数据库去除重复数据
2022/05/20 Oracle