webpack进阶篇(二十一):Tree Shaking的使用和原理分析

简介: webpack进阶篇(二十一):Tree Shaking的使用和原理分析

说明

玩转webpack课程学习笔记。


tree shaking(摇树优化)

概念:1 个模块可能有多个⽅法,只要其中的某个⽅法使⽤到了,则整个⽂件都会被打到 bundle ⾥⾯去,tree shaking 就是只把⽤到的⽅法打⼊ bundle ,没⽤到的⽅法会在 uglify 阶段被擦除掉。


使⽤:

  • webpack 默认⽀持,在 .babelrc ⾥设置 modules: false 即可
  • production mode的情况下默认开启

要求:必须是 ES6 的语法,CJS 的⽅式不⽀持



DCE (Dead code elimination)


  • 代码不会被执⾏,不可到达
  • 代码执⾏的结果不会被⽤到
  • 代码只会影响死变量(只写不读)
if (false) {
  console.log('这段代码永远不会执行');
}


Tree-shaking 原理


利⽤ ES6 模块的特点:


  • 只能作为模块顶层的语句出现
  • import 的模块名只能是字符串常量
  • import binding 是 immutable(不可改变的) 的

代码擦除: uglify 阶段删除⽆⽤代码



例子

1、在search文件夹里添加tree-shaking.js文件

export function kaimo666() {
  return 'this kaimo666';
}
export function kaimo777() {
  return 'this kaimo777';
}


2、在search文件夹里引用index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './search.less';
import logo from './images/logo.png';
console.log(logo);
import '../../common/index.js';
import { kaimo666 } from './tree-shaking.js';
class Search extends React.Component {
  render() {
    debugger;
    return <div className="search-text">
      凯小默的博客666
      <img src={ logo } />
    </div>
  }
}
ReactDOM.render(
  <Search/>,
  document.getElementById('root')
)


3、修改配置mode为none

module.exports = {
  mode: 'none',
}


4、none下的效果

20200701204151722.png



5、修改配置mode为production

module.exports = {
  mode: 'production',
}


6、production下的效果

image.png


7、配置mode为production情况下,引用并且使用kaimo666这个函数

import React from 'react';
import ReactDOM from 'react-dom';
import './search.less';
import logo from './images/logo.png';
console.log(logo);
import '../../common/index.js';
import { kaimo666 } from './tree-shaking.js';
class Search extends React.Component {
  render() {
    const kaimo = kaimo666();
    return <div className="search-text">
      { kaimo }
      凯小默的博客666
      <img src={ logo } />
    </div>
  }
}
ReactDOM.render(
  <Search/>,
  document.getElementById('root')
)


8、引用并且使用kaimo666效果,发现kaimo777没有引用进来

20200701204229679.png


9、也可以试试添加无用代码打包,不会被打包进去

import React from 'react';
import ReactDOM from 'react-dom';
import './search.less';
import logo from './images/logo.png';
console.log(logo);
import '../../common/index.js';
import { kaimo666 } from './tree-shaking.js';
// 无用代码
if (false) {
  kaimo666();
}
class Search extends React.Component {
  render() {
    return <div className="search-text">
      凯小默的博客666
      <img src={ logo } />
    </div>
  }
}
ReactDOM.render(
  <Search/>,
  document.getElementById('root')
)





目录
相关文章
|
5月前
|
缓存 前端开发 数据可视化
Webpack Bundle Analyzer:深入分析与优化你的包
Webpack Bundle Analyzer是一款可视化工具,帮助分析Webpack构建结果,找出占用空间较大的模块以便优化。首先需安装Webpack和Webpack Bundle Analyzer,接着在`webpack.config.js`中配置插件。运行Webpack后,会在`dist`目录生成`report.html`,展示交互式图表分析包大小分布。为优化可采用代码分割、Tree Shaking、压缩插件、加载器优化、模块懒加载、代码预热、提取公共库、使用CDN、图片优化、利用缓存、避免重复模块、使用Source Maps、优化字体和图标、避免全局样式污染以及优化HTML输出等策略。
178 3
|
2月前
|
监控 前端开发 JavaScript
Webpack 中 HMR 插件的工作原理
【10月更文挑战第23天】可以进一步深入探讨 HMR 工作原理的具体细节、不同场景下的应用案例,以及与其他相关技术的结合应用等方面的内容。通过全面、系统地了解 HMR 插件的工作原理,能够更好地利用这一功能,为项目的成功开发提供有力保障。同时,要不断关注技术的发展动态,以便及时掌握最新的 HMR 技术和最佳实践。
|
2月前
|
缓存 前端开发 JavaScript
Webpack 动态加载的原理
【10月更文挑战第23天】Webpack 动态加载通过巧妙的机制和策略,实现了模块的按需加载和高效运行,提升了应用程序的性能和用户体验。同时,它也为前端开发提供了更大的灵活性和可扩展性,适应了不断变化的业务需求和技术发展。
|
2月前
|
缓存 前端开发 JavaScript
webpack 原理
【10月更文挑战第23天】Webpack 原理是一个复杂但又非常重要的体系。它通过模块解析、依赖管理、加载器和插件的协作,实现了对各种模块的高效打包和处理,为现代前端项目的开发和部署提供了强大的支持。同时,通过代码分割、按需加载、热模块替换等功能,提升了应用程序的性能和用户体验。随着前端技术的不断发展,Webpack 也在不断演进和完善,以适应不断变化的需求和挑战。
|
3月前
|
缓存 前端开发 JavaScript
Webpack 打包的基本原理
【10月更文挑战第5天】
|
5月前
webpack——通过webpack-bundle-analyzer分析项目包占比情况
webpack——通过webpack-bundle-analyzer分析项目包占比情况
46 2
webpack——通过webpack-bundle-analyzer分析项目包占比情况
|
4月前
|
JavaScript 前端开发
手写一个简易bundler打包工具带你了解Webpack原理
该文章通过手写一个简易的打包工具bundler,帮助读者理解Webpack的工作原理,包括模块解析、依赖关系构建、转换源代码以及生成最终输出文件的整个流程。
|
5月前
|
缓存 前端开发 JavaScript
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
242 1
|
8月前
|
API 开发工具 开发者
webpack热更新原理
Webpack的Hot Module Replacement(HMR)提升开发效率,无需刷新页面即可更新模块。开启HMR需在配置中设`devServer.hot: true`。Webpack构建时插入HMR Runtime,通过WebSocket监听并处理文件变化。当模块改变,Webpack发送更新到浏览器,HMR Runtime找到对应模块进行热替换,保持应用状态。开发者可利用`module.hot` API处理热替换逻辑。
|
8月前
|
前端开发 测试技术 开发者
深入理解 Webpack 热更新原理:提升开发效率的关键
深入理解 Webpack 热更新原理:提升开发效率的关键