1.什么是tree-shaking

webpack 2 的到来带来的最棒的新特性之一就是tree-shaking 。tree-shaking源自于rollup.js,先如今,webpack 2也有类似的做法。
webpack 里的tree-shaking的到来不得不归功于es6规范的模块。为什么这么说,如今的前端模块规范很多,比较出流行的比如commonJS , AMD , es6 ,我简单的说一下commonJS和es6模块的区别。
commonJS 模块
commonJS的模块规范在Node中发扬光大,总的来说,它的特性有这几个:
1.动态加载模块
commonJS和es6的最大区别大概就在于此了吧,commonJS模块的动态加载能够很轻松的实现懒加载,优化用户体验。
2.加载整个模块
commonJS模块中,导出的是整个模块。
3.每个模块皆为对象
commonJS模块都被视作一个对象。
4.值拷贝
commonJS的模块输出和 函数的值传递相似,都是值的拷贝
es6 模块
1.静态解析
即在解析阶段就确定输出的模块,所以es6模块的import一般写在被引入文件的开头。
2.模块不是对象
在es6里,每个模块并不会当做一个对象看待
3.加载的不是整个模块
在es6模块中经常会看见一个模块中有好几个export 导出
4.模块的引用
es6模块中,导出的并不是模块的值拷贝,而是这个模块的引用
在结合es6模块和commonJS模块的区别之后,我们知道es6的特点是静态解析,而commonJS模块的特点是动态解析的,因此,借于es6模块的静态解析,tree-shaking的实现才能成为可能。
在webpack中,tree-shaking指的就是按需加载,即没有被引用的模块不会被打包进来,减少我们的包大小,缩小应用的加载时间,呈现给用户更佳的体验。
2.怎么使用tree-shaking
说了这么多那到底如何使用tree-shaking呢?
webpack默认es6规范编写的模块都能使用tree-shaking。这是什么意思呢?下面来看个例子。
首先奉上我的demo目录如下:
├─dist
└─index.html
├─node_modules
└─...
├─src
├─scripts
├─assets
├─webpack.config.js
└─package.json
dist用来存放打包好的代码
src相反的用来存放源文件
src里的scripts目录用来存放js脚本文件,assets用来存放静态资源文件
以下几条命令过后开始我们的tree-shaking之旅
npm install --save-dev webpack webpack-dev-server
webpack.config.js
const webpack = require('webpack')
const path = require('path')
module.exports = {
entry:'./src/scripts/main.js',
output:{
path:path.resolve(__dirname,'dist/'),
filename:'main.bundle.js'
},
plugins:[
new webpack.HotModuleReplacementPlugin()
],
devServer:{
port:4200,
contentBase:path.resolve(__dirname,'dist/'),
historyApiFallback:true,
hot:true
}
}
接下来是main.js,直接引入了sayHello
import { sayHello } from './greeter.ts';
sayHello();
相应的main.js的依赖greeter.js
export function sayHello(){
alert('hello')
}
export function sayWorld(){
alert('world')
}
在dist目录下有个index.html 用来引入打包后的bundle
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript" src="./main.bundle.js"></script> </body> </html>
以上就是整个demo的代码,接下来的事情我们直接webpack打包试试看
去掉打包后冗长的代码只看chunk传参的部分:
[
/* 0 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__person__ = __webpack_require__(1);
Object(__WEBPACK_IMPORTED_MODULE_0__person__["a" /* sayHello */])();
/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return sayHello; });
/* unused harmony export sayWorld */
function sayHello(){
alert('hello');
}
function sayWorld(){
alert('world');
}
/***/ })
/******/ ]
我们关注这一行
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return sayHello; });
实际上只return了一个sayHello。
因此我们现在只需要压缩一下整个Js代码,就能把没引用的sayWorld剔除。
键入以下命令进行压缩
webpack --optimize-minimize
由于压缩后的代码只有一行了,我们移步尾部:
function(e,n,r){"use strict";function t(){alert("hello")}r.d(n,"a",function(){return t})}]);
可以看到sayWorld函数已经被成功剔除。
我们启动webpack-dev-server
webpack-dev-server
在浏览器中输入
http://localhost:4200
每次都需要在命令行里输入参数,岂不是很麻烦,还有没有其他更好的办法呢?
(1)我们可以把这串命令放入package.json的scripts字段,然后通过npm start来自动执行
(2)其实–optimize-minimize的底层实现是一个插件UglifyJsPlugin,因此,我们可以直接在webpack.config.js里配置它
在webpack.config.js里配置插件
const path = require('path');
const webpack = require('webpack');
module.exports = {
entry:'./src/scripts/main.js',
output:{
filename:'main.bundle.js',
path:path.join(__dirname,'dist')
},
plugins:[
new webpack.optimize.UglifyJsPlugin(), // <----------- 压缩js
new webpack.HotModuleReplacementPlugin()
],
devServer:{
port:4200,
historyApiFallback:true,
hot:true,
contentBase:path.join(__dirname,"dist/")
}
}
然后我们webpack打包
即看到同样的效果
function(e,n,r){"use strict";function t(){alert("hello")}r.d(n,"a",function(){return t})}]);
在tree-shaking触发打包后,仅仅是撇开了模块的引用,但还是要结合压缩工具来进行,这才是完整的一次tree-shaking
那如果是typescript该怎么使用tree-shaking呢?
3.如何在typescript里使用tree-shaking
要在webpack里使用ts,首先我们必须安装tsc
npm install --save-dev typescript
之后我们需要解析ts文件的loader
npm install --save-dev ts-loader
然后在webpack.config.js进行配置
const webpack = require('webpack')
const path = require('path')
module.exports = {
entry:'./src/scripts/main.ts',
output:{
path:path.resolve(__dirname,'dist/'),
filename:'main.bundle.js'
},
module:{
rules:[
{
test:/\.ts$/,
use:['ts-loader']
}
]
},
plugins:[
new webpack.optimize.UglifyJsPlugin(),
new webpack.HotModuleReplacementPlugin()
],
devServer:{
port:4200,
contentBase:path.resolve(__dirname,'dist/'),
historyApiFallback:true,
hot:true
}
}
献上我的两份文件main.ts , greeter.ts (这两份文件除了后缀名基本没有改动)
main.ts
import { sayHello } from './greeter.ts';
sayHello();
greeter.ts
export var sayHello = function(){
alert('hello')
}
export var sayWorld = function(){
alert('world')
}
之后我们需要做的是,创建一个tsconfig.json的配置文件供tsc解析,这时,坑来了。
下面是我的tsconfig.json文件
{
"compilerOptions":{
"target":"es5",
"sourceMap":true
},
"exclude":[
"./node_modules"
]
}
好像没有什么不对
接着我们webpack
看下打包压缩后的代码的最后一部分:
"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.sayHello=function(){alert("hello")},n.sayWorld=function(){alert("world")}}]);
sayWorld居然还是存在!!!怎么回事,为什么没有被触发tree-shaking优化?
这是因为tsc编译后的代码为es5 ,而正因如此,tsc默认使用了commonJS的规范来加载模块,因此并没有触发tree-shaking,那我们要怎么做?
修改一下tsconfig.json,把target改为es6即可!
{
"compilerOptions":{
"target":"es6",
"sourceMap":true
},
"exclude":[
"./node_modules"
]
}
再次打包
看一下打包后的bundle
function(e,n,r){"use strict";r.d(n,"a",function(){return t});var t=function({alert("hello")}}]);
果然是触发了tree-shaking
开启webpack-dev-server
webpack-dev-server
可以看到成功打印hello
以上就是我对webpack tree-shaking的总结,希望对大家的学习有所帮助
# webpack
# tree
# shaking
# tree-shaking的优化
# webpack使用tree
# Tree Shaking实现方法指南
# Tree-Shaking 机制快速掌握
# tree shaking功能及使用原理详细解析
# tree shaking对打包体积优化及作用
# webpack的tree shaking的实现方法
# Vue中的Tree-Shaking介绍及原理
# 加载
# 的是
# 我们可以
# 可以看到
# 两份
# 都是
# 是一个
# 这是
# 来了
# 也有
# 就在
# 有个
# 特点是
# 的说
# 说了
# 都能
# 这么多
# 我对
# 中有
# 要在
相关文章:
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在腾讯云服务器上快速搭建个人网站?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
建站主机选购指南与交易推荐:核心配置解析
装修招标网站设计制作流程,装修招标流程?
网站制作价目表怎么做,珍爱网婚介费用多少?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何选择高性价比服务器搭建个人网站?
如何在Windows环境下新建FTP站点并设置权限?
如何用腾讯建站主机快速创建免费网站?
免费网站制作appp,免费制作app哪个平台好?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
定制建站哪家更专业可靠?推荐榜单揭晓
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
大同网页,大同瑞慈医院官网?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
高防服务器租用首荐平台,企业级优惠套餐快速部署
如何在IIS中新建站点并配置端口与物理路径?
深圳网站制作案例,网页的相关名词有哪些?
如何用PHP快速搭建高效网站?分步指南
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
建站主机类型有哪些?如何正确选型
高防服务器如何保障网站安全无虞?
专业公司网站制作公司,用什么语言做企业网站比较好?
招贴海报怎么做,什么是海报招贴?
高端企业智能建站程序:SEO优化与响应式模板定制开发
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
建站之星如何助力企业快速打造五合一网站?
如何在Windows虚拟主机上快速搭建网站?
如何快速生成高效建站系统源代码?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
专业商城网站制作公司有哪些,pi商城官网是哪个?
为什么Go需要go mod文件_Go go mod文件作用说明
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
建站之星×万网:智能建站系统+自助建站平台一键生成
微信推文制作网站有哪些,怎么做微信推文,急?
*服务器网站为何频现安全漏洞?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
宝塔Windows建站如何避免显示默认IIS页面?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何挑选优质建站一级代理提升网站排名?
香港服务器租用费用高吗?如何避免常见误区?
如何通过虚拟主机快速搭建个人网站?
如何批量查询域名的建站时间记录?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
盘锦网站制作公司,盘锦大洼有多少5G网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。