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>
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com