WebPack常用功能介紹

來源:互聯網
上載者:User

標籤:element   exp   多個   變數   複製   uglifyjs   ade   目錄結構   web   

概述

Webpack是一款使用者打包前端模組的工具。主要是用來打包在瀏覽器端使用的javascript的。同時也能轉換、捆綁、打包其他的靜態資源,包括css、image、font file、template等。個人認為它的優點就是易用,而且常用功能基本都有,另外可以通過自己開發loader和plugin來滿足自己的需求。這裡就盡量詳細的來介紹下一些準系統的使用。

上一篇已經介紹如何安裝了,這裡就不再重複了。

運行webpack

webpack需要編寫一個config檔案,然後根據這個檔案來執行需要的打包功能。我們現在來編寫一個最簡單的config。建立一個檔案,命名為webpack-config.js。config檔案實際上就是一個Commonjs的模組。內容如下:

var webpack = require(‘webpack‘);var path = require(‘path‘);var buildPath = path.resolve(__dirname,"build");var nodemodulesPath = path.resolve(__dirname,‘node_modules‘);var config = {    //入口檔案配置    entry:path.resolve(__dirname,‘src/main.js‘),    resolve:{        extentions:["","js"]//當requrie的模組找不到時,添加這些尾碼    },    //檔案匯出的配置    output:{        path:buildPath,        filename:"app.js"    }}module.exports = config;

  我的目錄結構是這樣的:

webpack    |---index.html    |---webpack-config.js    |---src         |---main.js         |---js              |---a.js

  main.js檔案內容如下:

var a = require(‘./js/a‘);a();console.log(‘hello world‘);document.getElementById("container").innerHTML = "<p>hello world</p>";

  a.js檔案內容如下:

module.exports = function(){    console.log(‘it is a ‘);}

  然後我們執行如下的命令:

webpack --config webpack-config.js --colors

  這樣我們就能在目錄裡面看到一個新產生的目錄build,目錄結構如下:

webpack    |---index.html    |---webpack-config.js    |---build         |---app.js

  然後引用app.js就Ok啦。main.js和模組a.js的內容就都打包到app.js中了。這就示範了一個最簡單的把模組的js打包到一個檔案的過程了。

如何壓縮輸出的檔案
plugins: [    //壓縮打包的檔案    new webpack.optimize.UglifyJsPlugin({      compress: {        //supresses warnings, usually from module minification        warnings: false      }    })]

  

如何copy目錄下的檔案到輸出目錄

copy檔案需要通過外掛程式"transfer-webpack-plugin"來完成。

安裝:

npm install transfer-webpack-plugin  -save

var TransferWebpackPlugin = require(‘transfer-webpack-plugin‘);//其他節點省略    plugins: [    //把指定檔案夾下的檔案複製到指定的目錄    new TransferWebpackPlugin([      {from: ‘www‘}    ], path.resolve(__dirname,"src"))  ]

  

打包javascript模組

支援的js模組化方案包括:

  • ES6 模組

    import MyModule from ‘./MyModule.js‘;

  • CommonJS

    var MyModule = require(‘./MyModule.js‘);

  • AMD

    define([‘./MyModule.js‘], function (MyModule) {});

ES6的模組需要配置babel-loader

打包靜態資源

安裝css-loader和style-loader

npm install css-loader --save -devnpm install style-loader --save -dev

  

var config = {    entry:path.resolve(__dirname,‘src/main.js‘),    resolve:{        extentions:["","js"]    },    output:{        path:buildPath,        filename:"app.js"    },    module:{        loaders:[{            test:/\.css$/,            loader:‘style!css‘,            exclude:nodemodulesPath        }]    }}

  style-loader會把css檔案嵌入到html的style標籤裡,css-loader會把css按字串匯出,這兩個基本都是組合使用的。打包完成的檔案,引用執行後,會發現css的內容都插入到了head裡的一個style標籤裡。如果是sass或less配置方式與上面類似。

 

可以通過url-loader把較小的圖片轉換成base64的字串內嵌在產生的檔案裡。安裝:

npm install url-loader --save -dev

  config配置:

var config = {    entry:path.resolve(__dirname,‘src/main.js‘),    resolve:{        extentions:["","js"]    },    output:{        path:buildPath,        filename:"app.js"    },    module:{        loaders:[{            test:/\.css$/,            loader:‘style!css‘,//            exclude:nodemodulesPath        },        { test:/\.png$/,loader:‘url-loader?limit=10000‘}//限制大小小於10k的        ]    }}

  

公用的模組分開打包

這需要通過外掛程式“CommonsChunkPlugin”來實現。這個外掛程式不需要安裝,因為webpack已經把他包含進去了。接著我們來看設定檔:

var config = {    entry:{app:path.resolve(__dirname,‘src/main.js‘),            vendor: ["./src/js/common"]},//【1】注意這裡    resolve:{        extentions:["","js"]    },    output:{        path:buildPath,        filename:"app.js"    },    module:{        loaders:[{            test:/\.css$/,            loader:‘style!css‘,            exclude:nodemodulesPath        }        ]    },    plugins:[        new webpack.optimize.UglifyJsPlugin({             compress: {                warnings: false             }        }),        //【2】注意這裡  這兩個地方市用來配置common.js模組單獨打包的        new webpack.optimize.CommonsChunkPlugin({            name: "vendor",//和上面配置的入口對應            filename: "vendor.js"//匯出的檔案的名稱        })    ]}

  執行webpack會產生app.js和vendor.js兩個檔案.

多個入口
var config = {        entry:{        m1:path.resolve(__dirname,‘src/main.js‘),         m2:path.resolve(__dirname,‘src/main1.js‘),        vendor: ["./src/js/common"] //【1】注意這裡    },//注意在這裡添加檔案的入口    resolve:{        extentions:["","js"]    },    output:{        path:buildPath,        filename:"[name].js"//注意這裡使用了name變數    }    }

  

 

webpack-dev-server

在開發的過程中個,我們肯定不希望,每次修改完都手動執行webpack命令來偵錯工具。所以我們可以用webpack-dev-server這個模組來取代煩人的執行命令。它會監聽檔案,在檔案修改後,自動編譯、重新整理瀏覽器的頁面。另外,編譯的結果是儲存在記憶體中的,而不是實體的檔案,所以是看不到的,因為這樣會編譯的更快。它就想到與一個輕量的express伺服器。安裝:

npm install webpack-dev-server --save -dev

  config配置:

var config = {    entry:path.resolve(__dirname,‘src/main.js‘),    resolve:{        extentions:["","js"]    },    //Server Configuration options    devServer:{        contentBase: ‘‘,  //靜態資源的目錄 相對路徑,相對於當前路徑 預設為當前config所在的目錄        devtool: ‘eval‘,        hot: true,        //自動重新整理        inline: true,            port: 3005            },    devtool: ‘eval‘,    output:{        path:buildPath,        filename:"app.js"    },    plugins: [        new webpack.HotModuleReplacementPlugin(),//這個好像也是必須的,雖然我還沒搞懂它的作用        new webpack.NoErrorsPlugin()    ]}

  

 執行命令:

webpack-dev-server --config webpack-dev-config.js  --inline --colors

  

預設訪問地址: http://localhost :3000/index.html(根據配置會不一樣)

有一點需要聲明,在index.html(引用匯出結果的html檔案)裡直接引用“app.js”,不要加父級目錄,因為此時app.js在記憶體裡與output配置的目錄無關:

<script type="text/javascript" src="app.js"></script>

  

具體參考:http://webpack.github.io/docs/webpack-dev-server.html 

WebPack常用功能介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.