基於webpack的前端工程化開發解決方案探索(二):代碼分割與圖片加載

1. require.ensure

  在上一章咱們已經知道經過require引入的資源,能夠經過插件讓webpack將其獨立成爲單獨的文件,而後向HTML中自動寫入路徑。那對於require.ensure狀況又會是怎樣的狀況呢?css

  咱們都知道webpack經過require.ensure來對咱們的代碼進行分割,將按需加載的代碼單獨放在的塊文件chunk中,而後在合適的時候異步加載進入文檔中。html

  在webpack中引入的提取文件插件,是否影響這一功能呢?webpack

  

   一樣的,此次咱們對上次的項目進行了改動,具體代碼能夠查看: https://github.com/xiaoyunchen/webpackgit

  

   首先,咱們在JS下新增了一個components文件夾,用於存放自定義的組件,而後定義了一個dialog組件(dialog的實現請參考以前的文章,本章將對本部分進行簡化處理)。github

  

  在dialog組件中咱們定義了dialog所需的HTML模板,CSS樣式文件,以及入口文件Index.js(若是模塊邏輯層次很複雜的話,這裏還能夠再新建兩個關於模板和樣式的子目錄)web

  咱們稍微看下index.js的內容:瀏覽器

複製代碼
 1 (function(){
 2     //加載模塊CSS
 3     require('./dialog.css');
 4     //加載模板
 5     var html=require('./dialog.html');
 6     
 7     module.exports=function(text){
 8         $('body').append(html);
 9         $('.dialog:last-child').html(text);
10     };
11     
12 })();
複製代碼

  這裏只是出於演示使用,因此實現的功能與邏輯比較簡單。就是引入了所需的模板和樣式文件,而後導出一個方法,改方法將會向body插入一個元素。app

  OK,咱們再來看下page目錄下index.js這個入口文件的變更:異步

複製代碼
 1 //引入CSS
 2 require("../../css/lib/reset.css");
 3 require("../../css/common/global.css");
 4 require("../../css/page/index.css");
 5 
 6 //增長事件
 7 $('#btn').click(function(){
 8     require.ensure(['../components/dialog/index.js'],function(require){
 9         var Dialog=require('../components/dialog/index.js');
10         new Dialog(new Date()-0);
11     });
12 });
複製代碼

  第7行,爲頁面的一個按鈕添加了點擊事件,點擊後加載dialog組件,而後生成一個dialog實例。性能

  

  再來看看webpack配置中添加了什麼內容:

  

  能夠看出配置文件並無太大的變化,這裏主要是:

  18行:增長了HTML加載器,用於加載HTML模板

  22行:引入全局jq,方便其餘JS調用

  

  在項目根目錄下運行 webpack 打包命令後,能夠看到dist/js下多了1.chunk.js文件。其實看到這裏你們也就放心了,webpack的確正確處理了這種按需加載的關係。

  

  而後運行dist/view/index.html,打開控制檯觀察資源加載。

  一開始並無加載dialog組件,點擊按鈕後,瀏覽器開始異步加載dialog組件,而後生成對應的HTML.

  

  這裏有個問題須要單獨說明下,require.ensure 被webpack編譯後在執行的時候會自動判斷該模塊已經下載,若是已經下載就不會再重複請求。

 

 

  2. 圖片加載

  藉助於url-loader這個加載器,在webpack中咱們能夠比較優雅的處理圖片加載的問題。所謂的比較優雅,是指:

  1. webpack能夠將所用到的圖片自動拷貝到輸出目錄下,一樣能夠爲其添加hash版本號

  2. 對於比較文件比較小的圖片,webpack能夠將其自動轉換了BASE64字符串進行存儲,減小一次HTTP請求

  接下來咱們來作下演示:

     

  咱們在dialog組件目錄下增長一張圖片(圖片大小15k左右),而後修改了dialog組件的模板,在其中引入了該張圖片。這樣每次咱們點擊按鈕的時候,瀏覽器都會顯示這張圖。

  

  另外咱們在 global.css進行修改,爲body添加一張背景圖片,因爲這個圖很小(1KB),因此咱們將背景圖設置爲重複。

1 body{
2     font: "微軟雅黑";
3     background: url(../../img/mask.png) repeat scroll 0 0;
4 }

  最後,咱們在webpack配置文件中,爲圖片引入url-loader加載器,同時爲其指定存放路徑和文件名:

複製代碼
1 module: {
2         loaders: [    //加載器
3             {test: /\.css$/, loader:ExtractTextPlugin.extract("style", "css") },
4             {test: /\.html$/, loader: "html" },
5             {test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192&name=./img/[hash].[ext]'}
6         ]
7     }
複製代碼

  生成的圖片存放在dist/img下,而後爲了混淆,咱們將圖片文件名設置爲其hash值。

  同時咱們配置了limit參數,當圖片大小小於這個值的時候,webpack都將會轉換爲base64字符串進行存儲。

 

  而後在項目根目錄下運行 webpack 命令進行打包,而後運行生成index.html文件:

  

  點擊ADD按鈕後瀏覽器才發起異步請求,加載了dialog組件以及咱們所引入的圖片資源,同時圖片名稱已經被設置爲hash值。

  再來看看樣式中引入的圖片:

  

    能夠看到這個背景圖已經轉換成BASE64字符串寫入css文件中,因此這裏就減小了一次圖片請求。這是一種比較經常使用的優化頁面性能的方式。

  

    上面說到webpack的這種處理方式是一種比較優雅的處理方式,那又有哪些地方不夠完善呢?

    1. 上面寫入模板中的圖片webpack能夠幫咱們處理,可是src/view目錄下的用於生成最終HTML的模板,webpack並不會對其中所引入的圖片進行提取處理,致使圖片路徑不對。

    2. 這裏只是對圖片進行了提取,其實並未對圖片進行任何優化處理,好比合並小圖標,限制圖片質量避免圖片過大等。

 

轉博客園小俠

相關文章
相關標籤/搜索