Webpack使用方法與個(gè)人心得

1.什么是webpack

webpack是近期最火的一款模塊加載器兼打包工具戚啥,它能把各種資源袒啼,例如JS(含JSX)年叮、coffee具被、樣式(含less/sass)、圖片等都作為模塊來(lái)使用和處理只损。

我們可以直接使用 require(XXX) 的形式來(lái)引入各模塊一姿,即使它們可能需要經(jīng)過(guò)編譯(比如JSX和sass),但我們無(wú)須在上面花費(fèi)太多心思跃惫,因?yàn)?webpack 有著各種健全的加載器(loader)在默默處理這些事情叮叹。

你可以不打算將其用在你的項(xiàng)目上,但沒(méi)有理由不去掌握它爆存,因?yàn)橐越?Github 上各大主流的(React相關(guān))項(xiàng)目來(lái)說(shuō)蛉顽,它們倉(cāng)庫(kù)上所展示的示例已經(jīng)是基于 webpack 來(lái)開(kāi)發(fā)的,比如 React-Boostrap 和 Redux先较。

webpack的官網(wǎng)是 http://webpack.github.io/ 携冤,文檔地址是 http://webpack.github.io/docs/

2.webpack 的優(yōu)勢(shì)

其優(yōu)勢(shì)主要可以歸類為如下幾個(gè):

  1. webpack 是以 commonJS 的形式來(lái)書(shū)寫(xiě)腳本滴闲勺,但對(duì) AMD/CMD 的支持也很全面曾棕,方便舊項(xiàng)目進(jìn)行代碼遷移。
  2. 能被模塊化的不僅僅是 JS 了菜循。
  3. 開(kāi)發(fā)便捷翘地,能替代部分 grunt/gulp 的工作,比如打包癌幕、壓縮混淆衙耕、圖片轉(zhuǎn)base64等。
  4. 擴(kuò)展性強(qiáng)勺远,插件機(jī)制完善臭杰,特別是支持 React 熱插拔(見(jiàn) react-hot-loader )的功能讓人眼前一亮。

3.搭建webpack環(huán)境

指定版本安裝

npm install -g webpack@1.12.3

安裝最新版

npm install -g webpack

初始化倉(cāng)庫(kù)

npm init -y

下載webpack服務(wù)

npm install -g webpack-dev-server

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

4.使用測(cè)試

在項(xiàng)目中新建一個(gè)文件夾

mkdir test && cd test

目錄結(jié)構(gòu)如下

webpack.config.js

  • entry 入口文件 讓webpack用哪個(gè)文件作為項(xiàng)目的入口
  • output 出口 讓webpack把處理完成的文件放在哪里
  • module 模塊 要用什么不同的模塊來(lái)處理各種類型的文件
module.exports = {
    // 入口文件
    entry: {
        "bundle01": "./main01.js",
        "bundle02": "./main02.js"
    },
    output: {
        filename: "[name].js"
    }
}

index.html

    <script src="bundle01.js"></script>
    <script src="bundle02.js"></script>

main01.js

document.write("<h1>Hello webpack</h1>");

main02.js

document.write("<p>hah</p>");

啟動(dòng)服務(wù)

webpack-dev-server

瀏覽器輸入localhost:8080

5.安裝loader

使用loader谚中,改變頁(yè)面內(nèi)容,瀏覽器會(huì)自動(dòng)刷新

babel-loader

Babel 是一個(gè) JavaScript 編譯器,可以將ES6語(yǔ)法轉(zhuǎn)換為ES5語(yǔ)法宪塔。

babel的安裝

npm install -g babel-cli

npm install --save-dev babel-core babel-loader babel-preset-es2015

目錄結(jié)構(gòu)如下

babel的使用

webpack.config.js

module.exports = {
    entry: "./main.js",
    output: {
        filename: "babel.js"
    },
    module: {
        loaders: [{
            // 匹配文件格式
            test: /\.js$/,
            // 排除的文件
            exclude: /node_modules/,
            // 需要用到的loader
            loader: "babel-loader"
        }]
    }
}

index.html

    <script src="babel.js"></script>

main.js

import test from "./test.js";
// 等同于
// var test = require("./test.js");

document.write(test.fun1());
document.write(test.fun2());

test.js

function fun1() {
    return "hello es6";
}

function fun2() {
    return "config ok";
}

module.exports = {
    fun1: fun1,
    fun2: fun2
}

json-loader

安裝

npm install --save-dev json-loader

目錄結(jié)構(gòu)如下

json-loader的使用

webpack.config.js

module.exports = {
    // 入口文件
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    module: {
        loaders: [{
            test: /\.json$/,
            exclude: /node_modules/,
            loader: "json-loader"
        }]
    }
}

index.html

<script src="bundle.js"></script>

main.js

// require 引入模塊(js/json/css/less/sass/img)
var test = require("./test.json");

document.write(test.name);
document.write(test.age);

test.json

{
    "name": "qzy",
    "age": 20
}

css-loader

注意: 安裝css-loader必須依賴style-loader模塊

css-loader將引入的css生成目標(biāo)文件

style-loader將生成的目標(biāo)文件生成標(biāo)簽插入到頁(yè)面中

安裝

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

css-loader的使用

目錄結(jié)構(gòu)如下

webpack.config.js

module.exports = {
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    module: {
        loaders: [{
            test: /\.css$/,
            exclude: /node_modules/,
            loader: "style-loader!css-loader"
        }]
    }
}

//或者

module.exports = {
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    module: {
        loaders: [{
            test: /\.css$/,
            exclude: /node_modules/,
            loaders: ["style-loader","css-loader"]
        }]
    }
}

index.html

<script src="bundle.js"></script>

main.js

var test = require("./test.css");
document.write("hello css-loader");

test.css

body{
    color: #f00;
}

效果如下

less-loader

注意磁奖,安裝less-loader必須依賴less,style-loader某筐、css-loader三個(gè)模塊

安裝

npm install --save-dev less-loader less

目錄結(jié)構(gòu)如下

less-loader的使用

webpack.config.js

module.exports = {
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    module: {
        loaders: [{
            test: /\.css$/,
            exclude: /node_modules/,
            loaders: ["style-loader", "css-loader", "less-loader"]
        }]
    }
}

index.html

<script src="bundle.js"></script>

main.js

var test = require("./test.less");

document.write("hello less-loader");

test.less

@color : blue;

body{
    color: @color;
    background: #ccc;
}

這樣敲代碼爽多了比搭,less不用手動(dòng)編譯,只需要保存文件瀏覽器就自動(dòng)刷新了南誊,簡(jiǎn)直是太棒了身诺!

打包靜態(tài)資源(如:圖片)

npm install --save-dev url-loader file-loader image-loader

目錄結(jié)構(gòu)如下

url-loader的使用

webpack.config.js

module.exports = {
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    module: {
        loaders: [{
            test: /\.(png|jpg|gif)$/,
            exclude: /node_modules/,
            // limit指定文件大小
            loader: "url-loader?limit=8192"
        }]
    }
}

index.html

<body>
    <!-- 防止找不到body -->
    <script src="bundle.js"></script>
</body>

main.js

var img = new Image();
img.src = require("./icon.png");
img.width = 500;
document.body.appendChild(img);

效果

6.使用plugin

代碼壓縮

npm install --save-dev webpack

webpack.config.js

var webpack = require("webpack");
var uglifyJsPlugin = webpack.optimize.UglifyJsPlugin;

module.exports = {
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    plugins: [
        new uglifyJsPlugin({
            compress: {
                warnings: false
            }
        })
    ]
}

index.html

<script src="bundle.js"></script>

main.js

document.write("hello world");
/*

占位占位

*/
document.write(a());

function a() {
    var fsdfsdf = "haha";
    return fsdfsdf;
}


var sdfdsfs;

效果:

可以看出代碼已經(jīng)壓縮過(guò)了

公共模塊的提取

CommonsChunkPlugin

作用: 將所有的依賴庫(kù)打包為一個(gè)文件

webpack.config.js

var webpack = require("webpack");
...

module.exports = {
    entry: {
        // 入口文件
        app: "./src/main.js",
        // 依賴的文件
        vendor: [
            "jquery",
            "director" //路由
        ]
    },
    output: {
        path: __dirname + 'dist',
        filename: "bundle.js"
    },
  
    ...
  
    plugins: [
        // 將 entry.vendor 數(shù)組中的所有依賴文件打包為vendor.js
        new webpack.optimize.CommonsChunkPlugin('vendor', 'vendor.js')
    ]
}

index.html

<script src="vendor.js"></script>
<script src="bundle.js"></script>

自動(dòng)打開(kāi)瀏覽器

npm install --save-dev open-browser-webpack-plugin

webpack.config.js

var openBrowserPlugin = require("open-browser-webpack-plugin");

module.exports = {
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    plugins: [
        new openBrowserPlugin({
            url: "http://localhost:8080"
        })
    ]
}

運(yùn)行webpack-dev-server會(huì)自動(dòng)打開(kāi)瀏覽器

參考資料

一小時(shí)包教會(huì) —— webpack 入門指南

Webpack傻瓜式指南

webpack-doc

webpack.github.io

webpack-china

babel官網(wǎng)

阮一峰Babel 入門教程

用webpack的CommonsChunkPlugin提取公共代碼的3種方式

npmjs : open-browser-webpack-plugin

Comparison of Build Tools

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抄囚,隨后出現(xiàn)的幾起案子霉赡,更是在濱河造成了極大的恐慌,老刑警劉巖幔托,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穴亏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡重挑,警方通過(guò)查閱死者的電腦和手機(jī)嗓化,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谬哀,“玉大人刺覆,你說(shuō)我怎么就攤上這事∈芳澹” “怎么了谦屑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)劲室。 經(jīng)常有香客問(wèn)我伦仍,道長(zhǎng),這世上最難降的妖魔是什么很洋? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任充蓝,我火速辦了婚禮,結(jié)果婚禮上喉磁,老公的妹妹穿的比我還像新娘谓苟。我一直安慰自己,他們只是感情好协怒,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布涝焙。 她就那樣靜靜地躺著,像睡著了一般孕暇。 火紅的嫁衣襯著肌膚如雪仑撞。 梳的紋絲不亂的頭發(fā)上赤兴,一...
    開(kāi)封第一講書(shū)人閱讀 52,793評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音隧哮,去河邊找鬼桶良。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沮翔,可吹牛的內(nèi)容都是我干的陨帆。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼采蚀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疲牵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起榆鼠,我...
    開(kāi)封第一講書(shū)人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纲爸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后璧眠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缩焦,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年责静,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袁滥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灾螃,死狀恐怖题翻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腰鬼,我是刑警寧澤嵌赠,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站熄赡,受9級(jí)特大地震影響姜挺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜彼硫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一炊豪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拧篮,春花似錦词渤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至礁凡,卻和暖如春高氮,著一層夾襖步出監(jiān)牢的瞬間慧妄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工纫溃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腰涧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓紊浩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親疗锐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坊谁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容