简说tree-shaking
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相关推荐
- Webpack进阶(一) tree shaking与不同mode
Tree Shaking 生产环境去除没有使用到的内容(开发环境没有删除,会影响调试) 只支持ESM规范(静态引入,编译时引入),不支持CJS(动态引入,执行时引入) // webpack.confi ...
- webpack学习(四) -- css tree shaking
css tree shaking 我们和webpack(三)一样,用案例说话 安装css需要的两个loader,css-loader 和style-loader npm install css-loa ...
- demo10 关于JS Tree Shaking
1.什么是 tree shaking 借助于 es6 (es2015) 模块系统 (import 和 export) 的静态解析,webpack 能够利用 Tree Shaking 进行按需加载,移除 ...
- Webpack 实现 Tree shaking 的前世今生
作者 | 左琳 责编 | 欧阳姝黎 前言 如果看过 rollup 系列的这篇文章 - 无用代码去哪了?项目减重之 rollup 的 Tree-shaking,那你一定对 tree-shak ...
- webpack构建中tree shaking、scope Hoisting(面试题)
一.tree shaking (摇树优化) tree shaking概念: 1个模块可能有多个方法,只要其中某个方法使用了,整个文件会被打到bundle中 tree shaking 只将用到的方法打到 ...
- webpack高级应用篇(九):tree shaking(usedExports) 与 sideEffects
目录 tree shaking(usedExports) tree shaking 前 tree shaking 后 sideEffects(副作用) 解释 tree shaking 和 `sideE ...
- Tree Shaking和sideEffects配置
需要将 mode 配置设置成 development,以确定 bundle 不会被压缩: const path = require('path');module.exports = {entry: ' ...
- 【tree shaking】Tree-shaking之副作用
前言 Tree-shaking,顾名思义"摇树".webpack会在生产环境打包时"摇"掉无用的,死的代码,也就是dead code. 由于Tree-shaki ...
- 配置Tree Shaking来减少JavaScript的打包体积
译者按: 用Tree Shaking技术来减少JavaScript的Payload大小 原文: Reduce JavaScript Payloads with Tree Shaking 译者: Fun ...
- Angular 应用里的摇树优化 - tree shaking
Tree Shakeable Providers and Services in Angular Angular 最近推出了一项新功能,Tree Shakeable Providers. Tree S ...
最新文章
- 刚学会深拷贝一个对象,学妹却问我怎么深拷贝一个图
- 得到一个数组里面相同元素的个数
- node.js express项目搭建
- ds18b20温度传感器 lcd C语言,C程序控制18B20测温及LCD显示源码打包
- pmp考试中容易混淆的22组概念
- sevlet3.0上传文件功能
- db2主键自增和oracle,oracle_浅析常用数据库的自增字段创建方法汇总,DB2复制代码 代码如下:CREATEnbsp - phpStudy...
- Jquery跳出each循环
- 网页服务器和mysql服务器_实现Web服务器之间使用同一个MYSQL和相同的网页配置文件的方法...
- [react] 使用webpack打包React项目,怎么减小生成的js大小?
- 程序员从幼稚到成熟会经历哪些变化?你都知道吗?
- get请求中传json参数报400的错误_诡异 | Spark使用get_json_object函数
- 转-TabHost组件(二)(实现底部菜单导航)
- IBM参与马鞍山模式创新 为中国医疗信息化立新示范
- Linux内核分析(六) 文件系统
- 用枚举法实现单例设计模型
- win7生成ssh key配置到gitlab
- 从文件结构认识HLS
- ps cc2019 安装教程
- XSS绕过,XSS过滤速查,XSS绕过姿势
热门文章
- android 快捷支付sdk,Android 集成支付宝SDK实现快捷支付--填坑
- WPS Office之PPT动画应用技能-陈慧-专题视频课程
- Linux虚拟内存介绍,以及malloc_stats和malloc_info 监控查看内存情况
- ZZULIOJ-1103: 平均学分绩点(函数专题)(Java)
- AR.JS扫描标识播放视频
- linux c员工管理,Linux cgroup
- pytest系列教程——3、setup和teardown
- Neural Network 神经网络
- Apache 80端口被占用
- 工作五年,面试官说我只会CRUD!竟然只给我10K!