webpack中的不足--Tree-shaking

最新推荐文章于 2025-06-23 13:24:56 发布
杨过悔 最新推荐文章于 2025-06-23 13:24:56 发布
阅读量1.5k 收藏
点赞数
分类专栏: Nodejs笔记
Nodejs笔记 专栏收录该内容
21 篇文章
订阅专栏
本文介绍如何使用Webpack 2和Babel 6进行树摇以去除未使用的导出,通过具体示例展示了配置过程及效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.2ality.com/2015/12/webpack-tree-shaking.html


Tree-shaking with webpack 2 and Babel 6

Labels: babel, dev, javascript, jsmodules, webpack

Rich Harris’ module bundler Rollup popularized an important feature in the JavaScript world: tree-shaking, excluding unused exports from bundles. Rollup depends on the static structure of ES6 modules (imports and exports can’t be changed at runtime) to detect which exports are unused.

Tree-shaking for webpack is currently in beta. This blog post explains how it works. The project we are going to examine is on GitHub: tree-shaking-demo

How webpack 2 eliminates unused exports

webpack 2, a new version that is in beta, eliminates unused exports in two steps:

  • First, all ES6 module files are combined into a single bundle file. In that file, exports that were not imported anywhere are not exported, anymore.

  • Second, the bundle is minified, while eliminating dead code. Therefore, entities that are neither exported nor used inside their modules do not appear in the minified bundle. Without the first step, dead code elimination would never remove exports (registering an export keeps it alive).

Unused exports can only be reliably detected at build time if the module system has a static structure. Therefore, webpack 2 can parse and understand all of ES6 and only tree-shakes if it detects an ES6 module. However, only imports and exports are transpiled to ES5. If you want all of the bundle to be in ES5, you need a transpiler for the remaining parts of ES6. In this blog post, we’ll use Babel 6.

Input: ES6 code

The demo project has two ES6 modules.

helpers.js with helper functions:

    // helpers.js
    export function foo() {
        return 'foo';
    }
    export function bar() {
        return 'bar';
    }

main.js, the entry point of the web application:

    // main.js
    import {foo} from './helpers';
    
    let elem = document.getElementById('output');
    elem.innerHTML = `Output: ${foo()}`;

Note that the export bar of module helpers is not used anywhere in this project.

Output without tree-shaking

The canonical choice for Babel 6 is to use the preset es2015:

    {
        presets: ['es2015'],
    }

However, that preset includes the plugin transform-es2015-modules-commonjs, which means that Babel will output CommonJS modules and webpack won’t be able to tree-shake:

    function(module, exports) {
    
        'use strict';
    
        Object.defineProperty(exports, "__esModule", {
            value: true
        });
        exports.foo = foo;
        exports.bar = bar;
        function foo() {
            return 'foo';
        }
        function bar() {
            return 'bar';
        }
    
    }

You can see that bar is part of the exports, which prevents it being recognized as dead code by minification.

Output with tree-shaking

What we want is Babel’s es2015, but without the plugin transform-es2015-modules-commonjs. At the moment, the only way to get that is by mentioning all of the preset’s plugins in our configuration data, except for the one we want to exclude. The preset’s source is on GitHub, so it’s basically a case of copying and pasting:

    {
        plugins: [
            'transform-es2015-template-literals',
            'transform-es2015-literals',
            'transform-es2015-function-name',
            'transform-es2015-arrow-functions',
            'transform-es2015-block-scoped-functions',
            'transform-es2015-classes',
            'transform-es2015-object-super',
            'transform-es2015-shorthand-properties',
            'transform-es2015-computed-properties',
            'transform-es2015-for-of',
            'transform-es2015-sticky-regex',
            'transform-es2015-unicode-regex',
            'check-es2015-constants',
            'transform-es2015-spread',
            'transform-es2015-parameters',
            'transform-es2015-destructuring',
            'transform-es2015-block-scoping',
            'transform-es2015-typeof-symbol',
            ['transform-regenerator', { async: false, asyncGenerators: false }],
        ],
    }

If we build the project now, module helpers looks like this inside the bundle:

    function(module, exports, __webpack_require__) {
    
        /* harmony export */ exports["foo"] = foo;
        /* unused harmony export bar */;
    
        function foo() {
            return 'foo';
        }
        function bar() {
            return 'bar';
        }
    }

Only foo is an export now, but bar is still there. After minification, helpers looks like this (I’ve added line breaks and whitespace to make the code easier to read):

    function (t, n, r) {
        function e() {
            return "foo"
        }
    
        n.foo = e
    }

Et voilà – no more function bar!

Further reading

  • webpack example: harmony-unused
  • Configuring Babel 6


确定要放弃本次机会?
福利倒计时
: :

立减 ¥

普通VIP年卡可用
立即使用
杨过悔
关注 关注
  • 0
    点赞
  • 踩
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  • 分享
    复制链接
    分享到 QQ
    分享到新浪微博
    扫一扫
  • 举报
    举报
专栏目录
webpack 使用外部的库_吊打面试官系列之Webpack的Tree Shaking实战解密
weixin_30428981的博客
12-30 668
天下武功,唯快不破!最新版的 antd 以及 vue 都对 Tree Shaking 提供了支持。我们内部的组件在支持这部分功能时,也专门梳理了相关的特性。这是四月份写的文章了,长时间不用就会忘,复习一下!JS 文件绝大多数需要通过网络进行加载,然后执行。DCE(dead code elimination)可以使得加载文件的大小更小,整体执行时间更短。tree shaking就是通常用...
webpack tree shaking 踩坑
qq_34356563的博客
12-14 1292
首先描述一下问题场景 一个项目中webpack升级到4.x.x版本后在development模式下项目是完全正常工作的,但是在production模式下没有把antd的css文件打包进去。 项目中webpack和antd的版本如下: antd:3.4.5 webpack:4.27.0 项目中我们是这样引入antd的样式文件的: import 'antd/dist/antd.css'; ...
参与评论 您还未登录,请先 登录 后发表或查看评论
web前端培训 | Tree shaking问题排查
weixin_45695430的博客
05-25 327
背景 在自研打包工具的过程中,发现有时会碰到不同的编译工具处理相同的代码,其大小差距可能很大,追查下来大部分是和不同工具对代码优化的处理方式不同所致。目前大部分js打包工具都支持的一种优化即tree shaking,但是不幸的是tree shaking没有比较标准的定义,各个打包工具的tree shaking实现又不尽相同。 术语 Tree shaking在不同工具里的意义不太统一,为了统一后续讨论,我们规范各个术语。 minify:编译优化手段,指在不影响代码语义的情况下,尽可能的减小程序的体积,
webpack 的 Tree Shaking 实现机制
最新发布
luckucu的博客
06-23 400
webpack 的 tree shaking 本质依赖于 ES Module 静态分析、sideEffects 配置和生产模式下的压缩插件,可高效移除未用代码,减少产物体积。设置/使用不当会导致 tree shaking 失效,是前端构建优化中必须关注的知识点。
Webpack 4 教程 - 7. 通过“tree shaking”减少打包的尺寸
weixin_34221775的博客
10-23 412
在这一部分的webpack 4 教程中,我们继续进一步考虑优化。我们要学习“tree shaking”是啥以及如何使用。你会学到在webpack 4中使用“tree shaking”技术有什么要求,它能带来什么好处。开始吧! Webpack 4 Tree Shaking 首先,我们回答“tree shaking”是啥技术以及它能带来什么好...
webpack-TreeShaking原理理解
qq_32944491的博客
01-20 623
面试题会问,梳理答案
harmonyos2-webpack-tree-shaking:webpack2tree-shaking编译研究
07-01
tree-shaking,但由于现有的 production 环境,不得不使用 babel 语法转换器,在配置 .babelrc 时,跟 webpack 1 还是有所差别。 此项目只是对 webpack tree-shaking 技术的验证实验。 介于webpack2正式发布,官方也...
Webpack: Tree-shaking 删除无用模块
Wang的专栏
07-04 1435
从前文,我们了解到 Webpack 从模块解析,到 Chunk 封装,到合并生成最终 Bundle 整个运行过程,接下来我们可以开始关注一些高频使用功能的底层实现,加深理解。例如,Tree-Shaking 就是一个不错的例子,它能充分优化产物代码,使用频率颇高,并且底层实现逻辑比较复杂,需要持续读取、修改 ModuleGraph 对象的状态;需要通过函数定制打包结果,等等,实现逻辑几乎贯穿了 Webpack 整个构建过程。
typescript-webpack-tree-shaking:使用Typescript和Webpack进行树状摇动的示例
02-06
使用Typescript和Webpack的摇树示例 该存储库显示了如何配置Typescript和Webpack来启用摇树。 如果它们具有ES2015模块格式,它将消除死代码。 可以在app/文件夹中找到源代码,在该目录中,主文件car.js并未使用...
babel-webpack-tree-shaking:Babel和Webpack的树状摇动示例
01-30
Babel和Webpack的摇树示例 该存储库显示了如何配置Babel和Webpack来启用摇树。 如果它们具有ES2015模块格式,它将消除死代码。 可以在app/文件夹中找到源代码,在该目录中,主文件car.js并未使用engine.js所有依赖...
webpack4 CSS Tree Shaking的使用
10-18
在webpack4中实现CSS Tree Shaking的关键知识点涵盖了模块打包优化、CSS处理与Tree Shaking原理、webpack插件和loader的使用,以及PurifyCSS工具的应用。以下将详细解读这些知识点: **webpack4 CSS Tree Shaking的...
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
10-19
主要介绍了webpack 如何使用tree-shaking(摇树优化),本文介绍了什么是tree-shaking,commonJS 模块,es6 模块,怎么使用tree-shaking等,具体操作步骤大家可查看下文的详细讲解,感兴趣的小伙伴们可以参考一下。
【译】如何在 Webpack 2 中使用 tree-shaking
weixin_34304013的博客
08-22 252
原文地址:How to do proper tree-shaking in Webpack 2 原文作者:Gábor Soós 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:薛定谔的猫 校对者:lsvih、lampui 如何在 Webpack 2 中使用 tree-shaking tree-shaking 这个术语首先源自 Rollup -- ...
1分钟了解 Tree-shaking
杏子
11-24 2423
Tree-shaking 中文译为摇晃之后的树,用在 webpack 打包中。其功能是移除 JavaScript 上下文中未引用的代码。比如在项目中引用了一个模块 antd 。但其实只使用到了 Button 组件、Input 组件、Form 组件等。那么 webpack 在打包后会消除掉以上组件之外的其他 antd 组件。从而减小打包体积,以此达到性能优化的目的。
16. webpack优化配置-tree shaking 剔除无用的代码
草木红的博客
08-18 990
tree shaking只需注意下面的前提即可,无需其他配置。 前提: 1. 必须使用ES6模块化 2.webpack配置文件中的mode开启production环境 注意:package.json文件添加sideEffects配置来实现哪些文件需要进行tree shaking。 “sideEffects”:false 所有代码都可以进行tree shaking,css文件可能直接被删除。 “sideEffects”:["*.css"] css文件不要进行tree shaking 入口文件inde
Webpack十大缺点:当过度工程化遇上简单的静态页面
青轩桃李能几何,流光欺人忽蹉跎
10-19 614
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6🍨🕠 牛客高级专题作者、在牛客打造高质量专栏🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程尽管 Webpack 是一个功能强大且广泛使用的模块打包工具,但它也有一些缺点。
webpack和Vite的优缺点和区别
qq_50260510的博客
07-15 4668
本文讲了webpack和Vite的优缺点和区别哦
【我不熟悉的javascript】什么是treeshake?
有一棵树的博客
10-09 563
什么是treeshake?
TypeScript 发布 4.9 beta
淘系技术
10-17 1133
TypeScript 已于 2022.09.23 发布 4.9 beta 版本,你可以在 4.9 Iteration Plan 查看所有被包含的 Issue 与 PR。如果想要抢先体验新特性,执行:$npminstalltypescript@beta来安装 beta 版本的 TypeScript,或在 VS Code 中安装 JavaScript and TypeScript Nightly...
杨过悔

博客等级

码龄12年
435
原创
88
点赞
177
收藏
71
粉丝
关注
私信

热门文章

  • hist的使用 52467
  • 使用BCryptPasswordEncoder管理密码 28404
  • pymatlib常用函数之figure,plot,subplot,show 18077
  • css 关于ul在div里居中且平铺的问题 17466
  • BAT脚本如何自动执行 adb shell 以后的命令 13393

分类专栏

  • Golang
    2篇
  • 嵌入式安卓系统开发
    6篇
  • UNIX操作系统
    9篇
  • 抽象编程
    6篇
  • ARM9编程笔记
    2篇
  • Android编程笔记
    26篇
  • MySql编程笔记
    2篇
  • JavaScript编程笔记
    21篇
  • Hibernate编程笔记
    17篇
  • Jsp编程笔记
    9篇
  • Struts编程笔记
    7篇
  • Spring编程笔记
    8篇
  • Jquery编程笔记
    4篇
  • Java编程笔记
    23篇
  • html编程笔记
    16篇
  • CSS开发笔记
    3篇
  • Linux配置笔记
    37篇
  • Linux编程笔记
    10篇
  • SSH编程笔记
    2篇
  • .Net Asp编程笔记
    2篇
  • .Net MVC编程笔记
    11篇
  • C#编程笔记
    1篇
  • EJB编程笔记
    5篇
  • JSF编程笔记
  • Spring MVC编程笔记
    15篇
  • JPA编程笔记
    1篇
  • Maven编程笔记
    3篇
  • JqueryUI编程笔记
    7篇
  • GIT代码托管
    4篇
  • SpringMVC4官方doc之旅
    8篇
  • Bootstrap学习笔记
    1篇
  • Scala学习笔记
    28篇
  • Activator配置笔记
    2篇
  • Play编程笔记
    25篇
  • Qt编程笔记
    6篇
  • ScalaQuery查询
    1篇
  • websock编程
  • Akka编程
    17篇
  • C++笔记
    17篇
  • 汇编课本知识整理
  • slick知识
    8篇
  • 从FP中理解scala
    27篇
  • 数据结构与算法
    1篇
  • pyThon
    24篇
  • py CGI笔记
    5篇
  • Haskell
    16篇
  • JEE知识点整理
    6篇
  • scalaTest
    2篇
  • 程序设计风格
    9篇
  • spring sec笔记
    3篇
  • scalaZ笔记
    3篇
  • JSON笔记
    2篇
  • spray笔记
    9篇
  • mongoDB笔记
    11篇
  • Hadoop笔记
    41篇
  • PHP笔记
    3篇
  • py matlab笔记
    6篇
  • pyQt笔记
    1篇
  • 源码编译笔记
    3篇
  • 安卓NDK
    43篇
  • 数据崛起之MapReduce
  • 数据崛起之并行并发
  • Spark笔记
    32篇
  • 高级函数
  • Jaxrs框架REST
    6篇
  • opengl笔记
    4篇
  • com编程
  • sqoop笔记
    2篇
  • openstack笔记
    5篇
  • webserver笔记
    2篇
  • pyspark记录
    3篇
  • docker笔记
    4篇
  • Nodejs笔记
    21篇
  • 机器学习笔记
    2篇
  • Ant学习笔记
    2篇
  • 构建完善reactjs应用
  • scalaJS
    1篇

展开全部 收起

上一篇:
Meta http-equiv属性详解(转)
下一篇:
CODING的同化思维

最新评论

  • BAT脚本如何自动执行 adb shell 以后的命令

    书写华章: 请问是quectel 杨梅吗表情包

  • 使用BCryptPasswordEncoder管理密码

    喝汽水的猫^: 要引入spring-boot-starter-security这个依赖是吗?

  • 四大机器学习降维算法:PCA、LDA、LLE、Laplacian Eigenmaps

    彭于晏的圈外正牌女友: 图片失效了,能再更新一次吗?非常感谢🙏

  • Hbase用户权限

    weixin_47810079: 如何设置密码呢

  • scrapy避免直接输出unicode

    润年: 很好,谢谢作者

大家在看

  • 超简单!手把手教你安装Photoshop 2024
  • AI的下一个竞争焦点——世界模型
  • 机器学习实战篇--TF-IDF实战--名著红楼梦的文本数据处理 1008
  • 基于RAG检索增强生成的法律咨询系统(vue+springboot+flask+AI算法) 93
  • 【MySQL学习|黑马笔记|Day6】视图(基本语法、检查选项、更新、作用),存储过程(基本语法、变量、if、参数、case、循环、游标、条件处理程序),存储函数及其相关案例与比较

最新文章

  • 使用Golang快速开发web应用
  • Golang Web开发高效率工具开源发布 !!!!!!, GO代码生成器, 并发, 权限, 生成器, 认证, XML配置
  • promise.all 与 async task unit中throw的牵扯。。。。。。。
2020年2篇
2017年22篇
2016年156篇
2015年453篇
2014年79篇

目录

展开全部

收起

相关专栏

前端面试题合集

专栏

13 人学习

每日更新前端最新面试题,React、Vue、小程序、JavaScript、HTML5、CSS、uniapp、ES6、前端工程化、性能优化等热点面试题~~~

webpack-bundle-analyzer如何具体分析打包结果?

前端工程化之从“零”开始学习webpack

专栏

0 人学习

不要只专注于业务,更要注重自己的架构能力。跟我一起从“零”学习webpack吧!

理论篇四:Webpack的Tree Shaking机制的原理是什么

AI架构开发实战

专栏

0 人学习

AI架构开发实战

Rollup vs Webpack:谁才是Tree Shaking的最佳实践者?

目录

展开全部

收起

上一篇:
Meta http-equiv属性详解(转)
下一篇:
CODING的同化思维

分类专栏

  • Golang
    2篇
  • 嵌入式安卓系统开发
    6篇
  • UNIX操作系统
    9篇
  • 抽象编程
    6篇
  • ARM9编程笔记
    2篇
  • Android编程笔记
    26篇
  • MySql编程笔记
    2篇
  • JavaScript编程笔记
    21篇
  • Hibernate编程笔记
    17篇
  • Jsp编程笔记
    9篇
  • Struts编程笔记
    7篇
  • Spring编程笔记
    8篇
  • Jquery编程笔记
    4篇
  • Java编程笔记
    23篇
  • html编程笔记
    16篇
  • CSS开发笔记
    3篇
  • Linux配置笔记
    37篇
  • Linux编程笔记
    10篇
  • SSH编程笔记
    2篇
  • .Net Asp编程笔记
    2篇
  • .Net MVC编程笔记
    11篇
  • C#编程笔记
    1篇
  • EJB编程笔记
    5篇
  • JSF编程笔记
  • Spring MVC编程笔记
    15篇
  • JPA编程笔记
    1篇
  • Maven编程笔记
    3篇
  • JqueryUI编程笔记
    7篇
  • GIT代码托管
    4篇
  • SpringMVC4官方doc之旅
    8篇
  • Bootstrap学习笔记
    1篇
  • Scala学习笔记
    28篇
  • Activator配置笔记
    2篇
  • Play编程笔记
    25篇
  • Qt编程笔记
    6篇
  • ScalaQuery查询
    1篇
  • websock编程
  • Akka编程
    17篇
  • C++笔记
    17篇
  • 汇编课本知识整理
  • slick知识
    8篇
  • 从FP中理解scala
    27篇
  • 数据结构与算法
    1篇
  • pyThon
    24篇
  • py CGI笔记
    5篇
  • Haskell
    16篇
  • JEE知识点整理
    6篇
  • scalaTest
    2篇
  • 程序设计风格
    9篇
  • spring sec笔记
    3篇
  • scalaZ笔记
    3篇
  • JSON笔记
    2篇
  • spray笔记
    9篇
  • mongoDB笔记
    11篇
  • Hadoop笔记
    41篇
  • PHP笔记
    3篇
  • py matlab笔记
    6篇
  • pyQt笔记
    1篇
  • 源码编译笔记
    3篇
  • 安卓NDK
    43篇
  • 数据崛起之MapReduce
  • 数据崛起之并行并发
  • Spark笔记
    32篇
  • 高级函数
  • Jaxrs框架REST
    6篇
  • opengl笔记
    4篇
  • com编程
  • sqoop笔记
    2篇
  • openstack笔记
    5篇
  • webserver笔记
    2篇
  • pyspark记录
    3篇
  • docker笔记
    4篇
  • Nodejs笔记
    21篇
  • 机器学习笔记
    2篇
  • Ant学习笔记
    2篇
  • 构建完善reactjs应用
  • scalaJS
    1篇

展开全部 收起

目录

评论
被折叠的  条评论 为什么被折叠? 到【灌水乐园】发言
查看更多评论
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值