1. 程式人生 > >Webpack2 tree shaking 之旅

Webpack2 tree shaking 之旅

背景:最近webpack升級了2.0的版本,支援程式碼靜態依賴解析打包了。嚇得我趕緊弄個小demo出來試試水。本文預設讀者都有一定的webpack使用經驗,沒使用過webpack的同學最好先看下相關文件。

靜態依賴打包可以去掉很多無用的程式碼,減少檔案體積。下面兩張圖片是樓主打包的兩個檔案,一個是使用tree shaking,一個是沒使用的,都是為了引用一個方法encodeHTML。對比下生成檔案的差異。

普通require模式引入

 

es6 tree shaking

 

可以看到tree shaking 只打包了我們需要的那個方法。樓主的demo支援打包多頁面,地址在最下面,各位小夥伴可以自己

clone下來看看。

看完了tree shaking的效果,下面我們來討論以下幾點

1. 如何開啟webpack2tree shaking功能

2. Webpack2配置注意事項

3. ES6模組編寫注意事項

4.  一些配置優化點

如何開啟webpack2tree shaking功能

首先,只有es6模組才能使用webpack2做靜態依賴解析。因為現在大部分瀏覽器還不支援es6模組語法,所以我們得下載babel,利用babel對程式碼進行編譯。正常使用Babel 6來轉換,一般設定presets: ['es2015']。但是這種方式使用的 transform-es2015-modules-commonjs外掛意味著

Babel會將es6模組通過commonJs模組轉換輸出,然後webpack 2就不能進行tree-shaking分析了。我的辦法是修改babel的設定

//關鍵程式碼,只有去掉babel的cjs模組,才能做tree shaking打包
test: /\.js$/,
loader:'babel',
query: {
    cacheDirectory: true,
    plugins: [
        'transform-es2015-template-literals',
        'transform-es2015-literals',
        'transform-es2015-function-name',
        'transform-es2015-arrow-functions',
        'transform-es2015-block-scoped-functions',
        'transform-es2015-classes',
        'transform-es2015-object-super',
        'transform-es2015-shorthand-properties',
        'transform-es2015-computed-properties',
        'transform-es2015-for-of',
        'transform-es2015-sticky-regex',
        'transform-es2015-unicode-regex',
        'check-es2015-constants',
        'transform-es2015-spread',
        'transform-es2015-parameters',
        'transform-es2015-destructuring',
        'transform-es2015-block-scoping',
        'transform-es2015-typeof-symbol',
        ['transform-regenerator', {async: false, asyncGenerators: false}]
]
}
exclude: /node_modules/

Webpack2配置注意事項

Webpack2相對webpack1做了一些配置的更改,更改的配置比較多,這裡只是簡單的介紹下幾個影響構建的部分

Resolve option

webpack1中,檔案路徑查詢的resolve.root屬性被刪除了,取代的是resolve.module屬性。

Plugins

//webpack.optimize.OccurenceOrderPlugin外掛不再需要配置
//ExtractTextPlugin配置方式變更, ExtractTextPlugin需要更新到2.0版本。新老配置方式對比:
Webpack1 : ExtractTextPlugin.extract('css!postcss!sass')
Webpack2: ExtractTextPlugin.extract({
                    fallbackLoader: "style-loader",
                    loader: "css-loader?minimize"
                })
//CommonsChunkPlugin配置方式變更
Webpack1:CommonsChunkPlugin('common/common','js/[name].js')
Webpack2:CommonsChunkPlugin({name:'commonFile',filename:'js/[name].[hash:8].js' })

HMR communication

Webpack 1 中,更新訊號用的是Web Messaging APIpostMessage)。而Webpack 2將使用一個標準的事件觸發器來傳遞事件訊號。這表示WebSocket必須內聯到打包檔案中。webpack-dev-server必須使用新版本

更多配置可以看樓主的demo和下文參考資料中的連結

ES6模組編寫注意事項

Webpack2支援新的非同步載入模組方法System.import。使用這個方法可以返回一個promise物件,模組載入失敗可以被捕獲,支援動態模組名,每個動態模組都會產生新的chunk檔案。非同步載入的檔案,沒必要分別匯出模組的方法。

示例程式碼

function route(path, query) {
   return System.import("./routes/" + path + "/route")
        .then(route => new route.Route(query));
}

這會為每種可能的路徑組合都建立一個對應的chunk

非非同步的模組,使用export關鍵字,匯出函式和變數,在構建時,才可以分析依賴進行構建。

示例程式碼

export function encodeHTML(str) {
    if (typeof str == 'string') {
        var ar = ['&', '&', '<', '<', '>', '>', '"', '"'];
        for (var i = 0; i < ar.length; i += 2) {
            str = str.replace(new RegExp(ar[i], 'g'), ar[1 + i]);
        }
        return str;
    }
    return str;
}
 
export var a = ['hello world'];
 
//引用
import {encodeHTML} from 'util/string_es6'

一些配置優化點

UglifyJsPlugin配置output.max_line_len屬性,指定壓縮檔案的單行最大長度,方便在線上程式碼出現js問題的時候可以快速定位到出錯的程式碼位於哪一行。

webpack.DllPlugin打包不怎麼改動的檔案,提高構建速度。

babel打包預設會加上use strict,如果使用了argument.calleejs程式碼。會導致一些語法錯誤。可以使用外掛babel-plugin-transform-remove-strict-mode或者用gulp全域性替換下。

demo地址:https://github.com/xyc-cn/webpack2-demo/tree/master

參考資料

相關推薦

Webpack2 tree shaking

背景:最近webpack升級了2.0的版本,支援程式碼靜態依賴解析打包了。嚇得我趕緊弄個小demo出來試試水。本文預設讀者都有一定的webpack使用經驗,沒使用過webpack的同學最好先看下相關文件。 靜態依賴打包可以去掉很多無用的程式碼,減少檔案體積。下面兩張圖片是樓

釋放webpack tree-shaking潛力webpack-deep-scope-analysis-plugin

在上週末廣州舉辦的 feday 中, webpack 的核心開發者 Sean 在介紹 webpack 外掛系統原理時, 隆重介紹了一箇中國學生於 Google 夏令營, 在導師 Tobias 帶領下寫的一個 webpack 外掛, https://github.com/vin

原來rollup這麼簡單 tree shaking

> 大家好,我是小雨小雨,致力於分享有趣的、實用的技術文章。 > 內容分為翻譯和原創,如果有問題,歡迎隨時評論或私信,希望和大家一起進步。 > 分享不易,希望能夠得到大家的支援和關注。 #### 計劃 rollup系列打算一章一章的放出,內容更精簡更專一更易於理解 目前打算分為以下幾章: - [rol

【Linux探索】第一部分第三課:測試並安裝Ubuntu

u盤 nco 過程 sans ubunt windows u盤啟動盤 系統 .com 內容簡單介紹 1、第一部分第三課:測試並安裝Ubuntu 2、第一部分第四課預告:磁盤分區 測試並安裝Ubuntu 大家好,經過前兩個比較偏理論(是否

F# (上)

簡單 ssi arp compile posit slist change 縮進 類型 寫在前面的話 解答一下在上一篇文章《在Visual Studio中入門F#》中有人的提問,   1. 問:是準備寫 F# 系列嗎?    答:當然不是,本人也是剛剛學習 F#,只是

C#多線程(1)——介紹和基本概念

隔離 cnblogs 影響 3-0 同時 ima 並行 logic mes 閱讀目錄 一、多線程介紹 二、Join 和Sleep 三、線程怎樣工作 四、線程和進程 五、線程的使用和誤用 原文地址:C#多線程之旅(1)——介紹和基本概念 C#多線程之旅目錄: C#

【SSH】一步步學習Hibernate框架(一):關於持久化

stc localhost 對象 schema hbm.xml java let pass [] 在不引用不論什麽框架下,我們會通過平庸的代碼不停的對數據庫進行操作,產生了非常多冗余的可是又有規律的底層代碼,這樣頻繁的操作數據庫和大量的底層代碼的反復

ios學習---指針也不難

ror 邏輯 初始化 維數 賦值運算 等價 格式 沒有 本質 1、認識指針#include <stdio.h> //基本數據類型作為函數參數傳遞是值傳遞 //void moveFront(int x ,int y) //{ // x = x + 2;

css重構(一)

rdquo lan set 變化 部分 網站 一個 寬度 lang css重構之旅 >前言: 今年我大一,馬上就要大二了。從高三畢業暑假到大學的這一年馬上過去,馬上迎來大二生活.學習前端也有將近一年了。一昧去追求那些視覺的效果和相對高端和新穎的技術,反而忽略了最基礎

C#多線程(3)

它的 logs 更新 nth 使用 targe result 右下角 介紹 閱讀目錄 代碼下載 一、介紹 二、通過TPL進入線程池 三、不用TPL進入到線程池 v博客前言 先交代下背景,寫《C#多線程之旅》這個系列文章主要是因為以下幾個原因:1.多線程在C/S和

Avalon探索

lin .html list eight -h ide ava avalonjs 案例 avalon2是一款基於虛擬DOM與屬性劫持的 迷你、 易用、 高性能 的 前端MVVM框架, 擁有超優秀的兼容性, 支持移動開發, 後端渲染, WEB Component式組件開發,

一次失敗的PHP擴展開發

erro 一個 google 討論 c++開發 .com center goroutine text 一次失敗的PHP擴展開發之旅 By warezhou 2014.11.19 緣起 經過不斷的持續叠代。我們部門的協程版網絡框架(CoSvrFrame)最終出爐了!

Nodejs開始

nod 任務 div -a -m trac 能夠 javascrip watermark web前端是一個門檻低,但精通起來比較難的行業,由於它涉及的範圍比較廣,也許在十年前。我光靠切圖,就能找到一個好的職位,可是如今,僅僅會切圖。我們非常

Floyd 洛谷P1078 文化

floyd std 編號 sizeof fig scan 數據 mem 自信 P1078 文化之旅 題目描述 有一位使者要遊歷各國,他每到一個國家,都能學到一種文化,但他不願意學習任何一 種文化超過一次(即如果他學習了某種文化,則他就不能到達其他有這種文化的國家)。不

【Linux探索】第四部分第三課:文件傳輸,瀟灑同步

命令行 上傳文件 文件夾 images lsh wget命令 ace 目標 wechat 內容簡單介紹 1、第四部分第三課:文件傳輸。瀟灑同步 2、第四部分第四課:分析網絡。隔離防火 文件傳輸。瀟灑同步 這一課的內容相

OC對象 weak弱引用實現分析

interface anywhere function address target Runtime源碼分析帶你了解OC實現過程。其中參考了大量的大神的代碼以及文獻裏面也有個人的見解歡迎拍磚歡迎交流。兩種常見使用場景/// [email protected]/* */ XX :

一、WCF學習-創建第一個服務

img image pub 頁面 添加服務 ets art idt null WCF基本介紹:http://baike.baidu.com/link?url=TGjLYt3HS4dt4-hIiGRknLy6udRsZ52QxJz9cmRKlR4NXbP9rCZDsKn2fD

夢幻成仙,誅滅外掛——《夢幻誅仙手遊》的阻擊外掛

超過 ext 客戶端 left ron 相加 功能 出現 成本 隨著智能手機的全面普及和市場泛娛樂化,移動遊戲行業發展迅猛,無論是市場收入還是用戶規模,手遊在遊戲市場上已經占據了半壁江山。如此火熱的市場吸引了大量外掛、輔助工作室等非法盈利團隊,嚴重影響了遊戲的收益、平衡,縮

我的Java開發學習------&gt;Workspace in use or cannot be created, choose a different one.--錯誤解決的方法

原因 tracking size ons create rac 分享 target mono 今天使用Eclipse時,突然卡死了。然後我強制關閉了Eclipse,再又一次打開的時候就報錯了,錯誤例如以下: Workspace in use or cann

Javahibernate(3)——第一個hibernate的樣例

數據庫方言 自由 article 存儲 代理 mit rup 方便 post  在解說樣例之前。我們首先來理解一下hibernate的工作原理。理解原理將會幫助我們更好地理解hibernate和運用hibernate。  1. 原理圖   利用hibe