webpack學習筆記

如果你是新手,已經了解什么是CommonJS/AMD以及gulp等,請參照過程,一步一步來,請盡量使用復制粘貼來處理文件內容(因為代碼比較簡單,理解就好,減少不必要的抄寫同時也能避免一些低級錯誤),以理解學會使用為主。

學習過程僅供參考。入門學習,建議有基礎的就不必看了。
對webpack的理解,官網有圖描述,這里就不抄了。https://webpack.github.io/
使用gitbash進行操作。(Windows系統)

以實現一個 webpack 的 Hello World為例,滿足以下功能:

  1. CSS 用 Less 或 SCSS 實現
  2. 圖片使用 Webpack 引入、壓縮
  3. JS 使用 ES Modules 語法,然后用 Babel 轉為 ES 5
  4. 所有代碼都要最小化(壓縮)
  5. 要有緩存控制(GitHub 自帶功能)也就是說文件名應該是 bundle-xxxxxxxxxxx.js*

一.安裝webpack

a.當前目錄安裝

注意:要在當前目錄安裝首先要保證目錄下有``package.json``文件,如果當前目錄文件為空,請執行npm init。
安裝webpack

$ npm install --save-dev webpack    //本地安裝webpack

安裝結束之后,執行

$ ./node_modules/.bin/webpack --help

可執行未報錯,則說明安裝成功。

b. 全局安裝webpack
$ npm install -g webpack    //全局安裝webpack

安裝結束之后,執行

$ webpack --help

,可執行未報錯,則說明安裝成功。
最后執行git init命令,初始化git倉庫。新建.gitignore文件,并且在里面加上一行 node_modules,然后再把已有文件,git addgit commit。

二.webpack怎么用?(如何學習?copy--run--modify)

webpack是一個模塊打包器。
關于模塊,webpack支持CommonJS/AMD這兩種大家比較熟悉的模塊加載方式。ES Modules加載模塊方式webpack也支持。

(1). copy--官網示例https://webpack.js.org/guides/getting-started/
官網示例.png

跟著示例,創建目錄文件

$ touch index.html
$ mkdir src
$ touch src/index.js
$ vi index.html       //copy--官網index.html文件內容
$ vi src/index.js     //copy--官網index.js文件內容

然后根據指引創建bundle.js

$ mkdir dist
$ mv index.html dist
$ npm install --save lodash   //安裝一個操作數組的庫,以便index.js使用這個庫

安裝lodash之后,便可以在index.js中直接使用import的方式來引用lodash庫。

index.js

參考官網內容copy。
index.html也需要修改

index.html

然后運行本地webpack

$ ./node_modules/.bin/webpack src/index.js dist/bundle.js

查看bundle.js是否創建成功

$ ll dist
index.html     bundle.js   //創建成功
(2).run--瀏覽器中打開index.html,查看是否報錯。
$ open dist/index.html

如若需要將本目錄初始化為git倉庫,建議執行git init,創建.gitignore文件,并且在里面加上一行 node_modules,以防止你把這個目錄上傳到 GitHub 上。

插播:可修改package.json文件

package.json

打包時,執行命令npm run build既可。

到了這里,示例過程其實很簡單,就是webpacklodash的js模塊打包,不用放在html中去單獨引入模塊了。

(3).modify--安裝jQuery,使用jQueryindex.js并且實現打包

接下來就是modify(修改),安裝jQuery,在index.js 中引入,并使用jQuery的語法寫index.js中的語句。

$ npm i -S jquery

然后改寫src/index.js

import _ from 'lodash';
import $ from 'jquery';

function component() {
  var $div = $('<div/>')

    // Lodash, currently included via a script, is required for this line to work
      $div.html(_.join(['Hello', 'webpack'], ' '));

        return $div;
    }

    $(document.body).append(component());

然后打包,查看頁面是否報錯。

$ npm run build
$ open dist/index.html

插播 :如何引用本地js文件?
首先創建一個js文件,操作如下:

$ touch src/amyli.js
$ vi src/amyli.js   //文件內容copy下面提供的代碼

amyli.js

let name = 'amyli';
let age = '18';
let gender = 'female';

function sayHi() {
    console.log('Hi,I am ${name}')
}

export {
name,
age,
gender,
sayHi
}    //輸出對象

與此同時,index.js中的引入方式:

import _ from 'lodash';
import $ from 'jquery';
import * as AmyLi from './AmyLi.js';

AmyLi.sayHi();

function component() {
  var $div = $('<div/>')

    // Lodash, currently included via a script, is required for this line to work
      $div.html(_.join(['Hello', 'webpack'], ' '));

        return $div;
    }

    $(document.body).append(component());

import用法
export用法
然后執行打包

$ npm run build

至此,大家通過上面的示例操作,對webpack的一個基本的打包過程,應該就有所了解了。簡而言之,三步走:

  1. 本地安裝模塊,
  2. 引入模塊到index.js或者main.js
  3. webpack打包到目標發布文件。

同理可猜測,css/less/sass/圖片等引入過程與之基本相似。

由于項目中每次進行打包的均是項目的相關文件,單個文件的操作就比較反人類了。那么接下來就化繁為簡的去了解webpack配置。

三.著名的webpack配置

官方示例:

webpack.config.js創建

操作如下:

$ touch webpack.config.js
$ vi webpack.config.js      //粘貼官網示例文件內容
$ ./node_modules/.bin/webpack --config webpack.config.js  //打包時執行配置文件設置

當前的配置文件內容比較容易看懂,主要是對輸入輸出進行相關配置,可逐句讀過并理解。

package.json文件中稍作修改

"build": "webpack"

執行打包命令

npm run build

看了這么久,接下來,終于要開始使用webpack實現去本文開頭提到的5個功能了。不要心急,有了上面做基礎,你會發現下面就很容易了。

示例中,在index.js中引入js類的模塊時,webpack通過webpack.config.js知道如何處理js,編譯之后打包成一個瀏覽器支持的js文件。
而其他類型的文件,幾乎都有加載器可以使用,我們可根據需要安裝加載器,然后進行配置,來告訴webpack如何進行打包。

1.css打包

具體操作如下:

$ touch index.css
$ vi index.css

index.css

body{
    background: #ddd;
    color: red;
    display: flex;
}

index.js

import _ from 'lodash';
import $ from 'jquery';
import './index.css'

function component() {
  var $div = $('<div/>')

    // Lodash, currently included via a script, is required for this line to work
      $div.html(_.join(['Hello', 'webpack'], ' '));

        return $div;
    }

    $(document.body).append(component());

webpack.config.js

var path = require('path');

module.exports = {
    // 入口  main.js
    entry: './src/index.js',
    //輸出
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        loaders: [
            {
                test: /\.css$/,
                loader:'style-loader!css-loader!autoprefixer-loader'  //3個loader
            }
        ]
    }
};

//前兩個loader是告訴webpack如何打包css,具體效果打開index.html查看css,最后一個loader,給相關css屬性加前綴,還可以設置兼容版本等。

然后執行

$ npm run build

結果報錯,提示安裝loader。

打包報錯.png

按照提示,配置參數,安裝loader

$ npm i -D style-loader
$ npm i -D css-loader
$ npm i -D autoprefixer-loader

再次執行

$ npm run build

打包未報錯,打開index.html,查看css樣式是否成功引入。
一般執行下來順利,css便能成功打包在瀏覽器可執行。

2.圖片打包壓縮

將xxx.png文件放入src文件夾中。
打開編輯index.js

import _ from 'lodash';
import $ from 'jquery';
import './index.css'     
//import png from './1.jpg'

var img1 = document.createElement("img");  
img1.src = require("./1.jpg");       //img1.src = png; 
document.body.appendChild(img1);

function component() {
  var $div = $('<div/>')

    // Lodash, currently included via a script, is required for this line to work
      $div.html(_.join(['Hello', 'webpack'], ' '));

        return $div;
    }

    $(document.body).append(component());

webpack.config.js

var path = require('path');

module.exports = {
    // 入口  main.js
    entry: './src/index.js',
    //輸出
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        loaders: [
            {
                test: /\.css$/,
                loader:'style-loader!css-loader!autoprefixer-loader'
            },
            {
                test: /\.(png|jpg)$/,
                //loader: 'url-loader?limit=8192'
                loaders: [
                    'file-loader?hash=sha512&digest=hex&name=[hash].[ext]',
                    'image-webpack-loader?bypassOnDebug&optimizationLevel=7&interlaced=false'
                ]
            }
        ]
    }
};
//這里處理圖片的loader給配置了圖片壓縮功能的loader

安裝配置所需loader

$ npm i -D url-loader
$ npm i -D file-loader
$ npm i - D image-webpack-loader

執行build

$ npm run build

未報錯,打開index.html,查看是否成功加載圖片。
加載成功并做了壓縮。

3.sass/scss打包

首先要使用sass需要先安裝sass。

$ export SASS_BINARY_SITE="https://npm.taobao.org/mirrors/node-sass"
//先設置指定下載sass地址(歷史問題)
$ nmp i -D node-sass
//安裝中

index.js

import _ from 'lodash';
import $ from 'jquery';
import './index.sass'

var img1 = document.createElement("img");
img1.src = require("./1.jpg");
document.body.appendChild(img1);

function component() {
  var $div = $('<div/>')

    // Lodash, currently included via a script, is required for this line to work
      $div.html(_.join(['Hello', 'webpack'], ' '));

        return $div;
    }

    $(document.body).append(component());

index.sass

body{
  background: #ddd;
  color: white;
  display: flex;
  div{
    background: border-box;
  }
}

webpack.config.js

var path = require('path');

module.exports = {
    // 入口  main.js
    entry: './src/index.js',
    //輸出
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        loaders: [
            {
                test: /\.sass$/,
                loaders: [
                    'style-loader',
                    'css-loader',
                    'autoprefixer-loader',
                    'sass-loader'
                ]
            },
            {
                test: /\.(png|jpg)$/,
                //loader: 'url-loader?limit=8192'
                loaders: [
                    'file-loader?hash=sha512&digest=hex&name=[hash].[ext]',
                    'image-webpack-loader'
                ]
            }

        ]
    }
};

安裝所需加載器,sass-loader,并打包

$ npm i -D sass-loder
$ npm run build

打包成功后,打開index.html,查看樣式是否編譯成功。
成功了,說明你抄對了。

看了這么多我們大概也能了解到為何需要去設置配置文件了。無非是各種類型的文件的各種打包,在配置文件中設置打包文件的加載器,下載與配置相應的loader進行安裝,以便打包的時候使用。

webpack --help中有webpack --watch命令:
Watch the filesystem for changes,方便開發時,打包項目文件。
有興趣的新手可以體驗一下。

4.所有代碼都要最小化(壓縮)--自動刷新&發布

要實現自動刷新,先安裝webpack-dev-server

$ npm install webpack-dev-server  //安裝server

配置server的目標文件
webpack.config.js

var path = require('path');

module.exports = {
    // 入口  main.js
    entry: './src/index.js',
    //輸出
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    devServer: {
        contentBase: path.join(__dirname, "dist"),    //目標文件夾
        compress: true,                           //是否壓縮:是
        port: 9000                            //設置端口
    },                  //配置server的目標文件
    module: {
        loaders: [
            {
                test: /\.scss$/,
                loaders: [
                    'style-loader',
                    'css-loader',
                    'autoprefixer-loader',
                    'sass-loader'
                ]
            },
            {
                test: /\.(png|jpg)$/,
                //loader: 'url-loader?limit=8192'
                loaders: [
                    'file-loader?hash=sha512&digest=hex&name=[hash].[ext]',
                    'image-webpack-loader'
                ]
            }

        ]
    }
};

執行命令行

$  ./node_modules/.bin/webpack-dev-server

輸入命令后,項目運行,打開http://localhost:9000,本地修改項目文件時,瀏覽器會自動刷新頁面。

最后一步:發布deploy
當項目需要進行發布的時候,目前的編譯打包雖然已經完成,但細心的童鞋會發現,dist中的文件其實很大。webpack提供了webpack -p命令行來做最后的項目文件最小化。

$ webpack -p   //最小化項目文件,用作生產環境

執行之后再打開index.html,發現加載的bundle.js,比build之后的更加小。也更加符合生產環境的需求。

最后提交代碼git add,git commit,git push到遠程倉庫。

5.緩存控制

為了生成緩存的bundle.js,通常做法就是文件名+hash,配置中可以直接進行配置。
webpack.config.js

var path = require('path');

module.exports = {
    // 入口  main.js
    entry: './src/index.js',
    //輸出
    output: {
        filename: 'bundle-[hash].js',     //具有緩存控制的輸出
        path: path.resolve(__dirname, 'dist')
    },
    devServer: {
        contentBase: path.join(__dirname, "dist"),
        compress: true,
        port: 9000
    },
    module: {
        loaders: [
            {
                test: /\.scss$/,
                loaders: [
                    'style-loader',
                    'css-loader',
                    'autoprefixer-loader',
                    'sass-loader'
                ]
            },
            {
                test: /\.(png|jpg)$/,
                //loader: 'url-loader?limit=8192'
                loaders: [
                    'file-loader?hash=sha512&digest=hex&name=[hash].[ext]',
                    'image-webpack-loader'
                ]
            }

        ]
    }
};

與此同時,當bundle.js文件名有了hash之后,每次修改hash都不同。路徑手動去改就比較麻煩了。這里我們可以使用插件來自動生成index.html文件,路徑也隨之自動生成。操作入下:
安裝插件:html-webpack-plugin

$ npm i -D html-webpack-plugin

webpack.config.js

ar path = require('path');
var HtmlwebpackPlugin = require('html-webpack-plugin');

module.exports = {
    // 入口  main.js
    entry: './src/index.js',
    //輸出
    output: {
        filename: 'bundle-[hash].js',
        path: path.resolve(__dirname, 'dist')
    },
    devServer: {
        contentBase: path.join(__dirname, "dist"),
        compress: true,
        port: 9000
    },
    plugins: [
        new HtmlwebpackPlugin({
            title: "webpack-demo",   //設置生成的html,title
            filename: "index.html"    //html命名
        })
    ],
    module: {
        loaders: [
            {
                test: /\.scss$/,
                loaders: [
                    'style-loader',
                    'css-loader',
                    'autoprefixer-loader',
                    'sass-loader'
                ]
            },
            {
                test: /\.(png|jpg)$/,
                //loader: 'url-loader?limit=8192'
                loaders: [
                    'file-loader?hash=sha512&digest=hex&name=[hash].[ext]',
                    'image-webpack-loader'
                ]
            }

        ]
    }
};

刪除dist/index.html之后

$ webpack -p   //打包、最小化

執行結果

發布.png

打開index.html,這時候觀察bundle.js是否成功引入。

引入成功.png

至此,關于webpack的一些基本用法就講到這里了。還有一些webpack插件,大家可以去看看阮一峰webpack教程。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容

  • Webpack 是一個前端資源加載/打包工具。它將根據模塊的依賴關系進行靜態分析,然后將這些模塊按照指定的規則生成...
    EarthChen閱讀 403評論 0 1
  • 什么是Webpack? 按照官方文檔的解釋,Webpack就是個模塊打包工具,將模塊及其依賴打包生成靜態資源。在W...
    Www劉閱讀 682評論 2 10
  • 這是我第二次學習webpack了,初見他時,我是一臉懵逼的,這次再見時,稍微輕松了一點,現在寫下這份學習筆記,用來...
    ruby0922閱讀 316評論 0 0
  • 在現在的前端開發中,前后端分離、模塊化開發、版本控制、文件合并與壓縮、mock數據等等一些原本后端的思想開始...
    Charlot閱讀 5,464評論 1 32
  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,214評論 7 35