tree-shaking是前端领域一个比较常见的词了,在项目中有什么用呢?这个之前一直没搞明白,通过翻阅众多博文,自己在项目中试验了一下,弄清其大致流程,这里就做了个简单记录。

先看一段代码

// app.jsexport function A(a, b) {return a + b
}export function B(a, b) {return a + b
}// index.jsimport {A} from '/app.js'A(1, 2)// 当index.js引用了app.js的A函数,如果tree-shaking起了作用,B函数是不会被打包进最后的bundle的。

然鹅,在webpack的官网有一句话: rlies on the structure of ES2015 modules syntax , i.e.import an export,翻译一下就是tree-shaking依赖ES6的模块输入输出语法,如果你的模块引入方式是require等,tree-shaking是不会起作用的。

在开发打包中,我们常用的是babel, webpack,uglifyJs这三样神器,而tree-shaking就是在第一步起作用的,在webpack对js文件处理的过程中,先是babel-loader去处理js文件,处理过后,webpack进行打包处理,最后由ugligyJs进行代码压缩。babel的配置文件中有一项配置很关键,就是preset:

{"presets": [["env", {"modules": false  //关键点}],"stage-2","react"]
}

在这个配置里面env的options中有一个modules: false,这个是指示babel如何去处理import和export的关键,默认处理成require形式,如果加上此option,那么babel就不会把import转变成requier形式,为webpack进行tree-shaking创造了条件。

综上所述,简单来说tree-shaking就是删除项目中无用的代码,压缩项目体积。

webpack对文件tree-shaking的过程如下:

在认定某块无用后,会在处理过后写下一段注释,uglifyJs会根据这段注释去删除代码


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

在tree-shaking学习的过程中,可以对class进行tree-shaking,是比较有意思的,找了一个demo,支持tree-shaking:

1.首先使用loader去处理,实验阶段的代码,编译成es代码,这样webpack内部的编译器才能正确识别代码。


module: {
rules: [{test: /\.js$/,use: [{loader: 'babel-loader',options: {presets: ['babel-preset-stage-2', 'babel-preset-react']}},'eslint-loader'],exclude: /node_modules/}
]
}

2.通过webpack打包,并对代码进行tree-shaking,在打包完成的bundle后,和输出的文件之前,对最后的bundle进行兼容性处理。

plugins: [new UglifyJSPlugin(),  //  uglify要在babelPugin的前面new BabelPlugin({  //在这个插件内部进行最后bundle的兼容性处理test: /\.js$/,babelOptions: {presets: [env]}}),new webpack.DefinePlugin({'process.env.NODE_ENV': JSON.stringify('production')}),new HtmlWebpackPlugin({template: 'index.html'}),]

最后总结步骤:

1.先编译实验性质代码为标准代码,会涉及到babel-preset-stage-x插件

2.webpack打包代码并进行tree-shaking识别

3.uglifyjs进行代码压缩,并根据webpack标识删除多余代码

4.对最后的代码进行兼容性处理涉及到babel-preset-env插件

第三方类库的tree-shaking

在研究了许多第三方类库后,基本得出的结论是,tree-shaking是不能对大部分的第三方类库进行的。

简说tree-shaking相关推荐

  1. Webpack进阶(一) tree shaking与不同mode

    Tree Shaking 生产环境去除没有使用到的内容(开发环境没有删除,会影响调试) 只支持ESM规范(静态引入,编译时引入),不支持CJS(动态引入,执行时引入) // webpack.confi ...

  2. webpack学习(四) -- css tree shaking

    css tree shaking 我们和webpack(三)一样,用案例说话 安装css需要的两个loader,css-loader 和style-loader npm install css-loa ...

  3. demo10 关于JS Tree Shaking

    1.什么是 tree shaking 借助于 es6 (es2015) 模块系统 (import 和 export) 的静态解析,webpack 能够利用 Tree Shaking 进行按需加载,移除 ...

  4. Webpack 实现 Tree shaking 的前世今生

    作者 | 左琳       责编 | 欧阳姝黎 前言 如果看过 rollup 系列的这篇文章 - 无用代码去哪了?项目减重之 rollup 的 Tree-shaking,那你一定对 tree-shak ...

  5. webpack构建中tree shaking、scope Hoisting(面试题)

    一.tree shaking (摇树优化) tree shaking概念: 1个模块可能有多个方法,只要其中某个方法使用了,整个文件会被打到bundle中 tree shaking 只将用到的方法打到 ...

  6. webpack高级应用篇(九):tree shaking(usedExports) 与 sideEffects

    目录 tree shaking(usedExports) tree shaking 前 tree shaking 后 sideEffects(副作用) 解释 tree shaking 和 `sideE ...

  7. Tree Shaking和sideEffects配置

    需要将 mode 配置设置成 development,以确定 bundle 不会被压缩: const path = require('path');module.exports = {entry: ' ...

  8. 【tree shaking】Tree-shaking之副作用

    前言 Tree-shaking,顾名思义"摇树".webpack会在生产环境打包时"摇"掉无用的,死的代码,也就是dead code. 由于Tree-shaki ...

  9. 配置Tree Shaking来减少JavaScript的打包体积

    译者按: 用Tree Shaking技术来减少JavaScript的Payload大小 原文: Reduce JavaScript Payloads with Tree Shaking 译者: Fun ...

  10. Angular 应用里的摇树优化 - tree shaking

    Tree Shakeable Providers and Services in Angular Angular 最近推出了一项新功能,Tree Shakeable Providers. Tree S ...

最新文章

  1. 刚学会深拷贝一个对象,学妹却问我怎么深拷贝一个图
  2. 得到一个数组里面相同元素的个数
  3. node.js express项目搭建
  4. ds18b20温度传感器 lcd C语言,C程序控制18B20测温及LCD显示源码打包
  5. pmp考试中容易混淆的22组概念
  6. sevlet3.0上传文件功能
  7. db2主键自增和oracle,oracle_浅析常用数据库的自增字段创建方法汇总,DB2复制代码 代码如下:CREATEnbsp - phpStudy...
  8. Jquery跳出each循环
  9. 网页服务器和mysql服务器_实现Web服务器之间使用同一个MYSQL和相同的网页配置文件的方法...
  10. [react] 使用webpack打包React项目,怎么减小生成的js大小?
  11. 程序员从幼稚到成熟会经历哪些变化?你都知道吗?
  12. get请求中传json参数报400的错误_诡异 | Spark使用get_json_object函数
  13. 转-TabHost组件(二)(实现底部菜单导航)
  14. IBM参与马鞍山模式创新 为中国医疗信息化立新示范
  15. Linux内核分析(六) 文件系统
  16. 用枚举法实现单例设计模型
  17. win7生成ssh key配置到gitlab
  18. 从文件结构认识HLS
  19. ps cc2019 安装教程
  20. XSS绕过,XSS过滤速查,XSS绕过姿势

热门文章

  1. android 快捷支付sdk,Android 集成支付宝SDK实现快捷支付--填坑
  2. WPS Office之PPT动画应用技能-陈慧-专题视频课程
  3. Linux虚拟内存介绍,以及malloc_stats和malloc_info 监控查看内存情况
  4. ZZULIOJ-1103: 平均学分绩点(函数专题)(Java)
  5. AR.JS扫描标识播放视频
  6. linux c员工管理,Linux cgroup
  7. pytest系列教程——3、setup和teardown
  8. Neural Network 神经网络
  9. Apache 80端口被占用
  10. 工作五年,面试官说我只会CRUD!竟然只给我10K!