如何使用Webpack進(jìn)行打包即硼?

一周伦、理解Webpack的打包過程

1.創(chuàng)建一個test目錄并進(jìn)入

mkdir test && cd test  
  1. npm 初始化傻唾,生成package.json文件
npm init -y  //如果不加-y就一路回車
  1. 安裝webpack
npm install webpack --save-dev   //會安裝到test目錄下node_modules目錄下面

4.在根目錄下新建一個hello.js文件并用webpack進(jìn)行打包

touch hello.js 
./node_modules/.bin/webpack hello.js hello.bundle.js

這樣就完成了一次最簡單的打包谷饿,./node_modules/.bin/webpack就是安裝在test目錄下的webpack命令惶我。雖然完成了一次極簡的打包,但是這樣是遠(yuǎn)遠(yuǎn)不夠的博投。

5.試著多添加一個world.js文件

world.js

export { world }   //寫一個函數(shù)并將它暴露出來
function world() {
  alert('我是world')
}

hello.js內(nèi)容

require('./world.js')  //引入world.js
world() 在hollo.js中執(zhí)行world.js中的函數(shù)

運(yùn)行打包命令

./node_modules/.bin/webpack hello.js hello.bundle.js

成功打包绸贡。這樣,hello.js就是入口文件,其它文件諸如world.js都通過ES6/Commom.js/AMD語法引入到這個入口文件里恃轩,然后打包成一個文件hello.bundle.js文件结洼。這樣,就可以實現(xiàn)模塊化編程叉跛,不僅僅是JS文件松忍,CSS、SASS筷厘、LESS鸣峭、VUE等都可以引入到入口文件里,再進(jìn)行打包酥艳,這就是模塊化摊溶,而需要做的,就是安裝針對不同類型的loader充石。

二莫换、配置文件

上面寫的內(nèi)容主要是理解,接下來為了更好地發(fā)揮webpack的功能骤铃,我們重新整理和配置webpack的文件

1. 刪除之前根目錄下除了node_modules和json文件之外的所有其它文件拉岁。
2. 在test目錄下新建src目錄,所有的源碼都放在這里惰爬,在src目錄下喊暖,分別新建script目錄和style目錄用來存放
js文件和樣式文件。

3. 在test目錄下新建dist目錄撕瞧,作為打包以后的輸出文件的存放目錄陵叽。
4. 在test目錄下新建index.html文件,用script標(biāo)簽引入dist/bundle.js文件丛版。
5. 在test目錄下新建webpack.config.js作為配置文件巩掺。

三、配置webpack.config.js

webpack.config.js是webpack的配置文件页畦,在我們運(yùn)行webpack打包命令的時候锌半,它會自動去尋找這個文件,然后根據(jù)這個文件里的具體配置來進(jìn)行打包寇漫。

  1. webpack.config.js內(nèi)容
var path = require('path')                                      //引入path

module.exports = {                                              //注意這里是exports不是export
  entry: './src/script/main.js',                                 //入口文件
  output: {                                                       //輸出文件
    path: path.resolve(__dirname,'dist'),                      //輸出文件的目錄
    filename: 'bundle.js'                                        //輸出文件的名稱
  }
}

運(yùn)行打包命令

./node_modules/.bin/webpack                     //有了配置文件以后直接輸入命令即可刊殉,它會自動找配置文件

如果我們有多個配置文件,比如還有一個webpack.dev.config.js文件州胳,webpack默認(rèn)運(yùn)行的文件是webpack.config.js记焊,但是想要讓它運(yùn)行另一個配置文件應(yīng)該怎么辦呢?辦法如下:

./node_modules/.bin --config webpack.dev.config.js               //使用--config參數(shù)就行了

這里還有一個問題栓撞,就是每次運(yùn)行webpack命令遍膜,都要寫./node_modules/.bin/webpack這樣一長串碗硬,可不可心簡化呢?當(dāng)然是可以的。只需要package.json文件里寫一個script就行了。

屏幕快照 2017-08-18 上午12.03.43.png

這樣囱稽,只要我們運(yùn)行npm build就相當(dāng)于執(zhí)行了webpack命令,而npm會非常智能地從node_modules里找這個命令翰意。
當(dāng)然,這個命令還可以繼續(xù)優(yōu)化信柿。我們發(fā)現(xiàn)冀偶,每次打包以后,bundle.js的文件都會非常大渔嚷,如果讓它變小呢进鸠?那就使用./node_modules/.bin/webpack -p這個命令 -p就是出版的意思,這樣它就會自動壓縮形病,所以我再改一下package.json文件客年。

屏幕快照 2017-08-18 上午12.09.08.png

這樣,再次運(yùn)行npm run build就相當(dāng)于運(yùn)行了./node_modules/.bin/webpack -p了漠吻。我們可以明顯地發(fā)現(xiàn)量瓜,bundle.js的體積被壓縮了。

  1. 運(yùn)行打包命令時可以使用的其它參數(shù)
./node_modules/.bin/webpack --progress --display-modules --display-reason --colors  //看到過程侥猩、顯示模塊、顯示打包原因抵赢、看到顏色變化
四欺劳、多頁面進(jìn)行打包時webpack.config.js的配置方法
var path = require('path')

module.exports = {                            //注意這里是exports不是export
  entry: {                                             //這里entry寫成了對象,這樣的話就可以寫多個入口文件分別打包
    main: './src/script/main.js',       
    a: './src/script/a.js'
  },
  output: {
    path: path.resolve(__dirname,'dist'),
    filename: '[name]-[hash]-bundle.js'                  //這里[name]-[hash]-bundle.js通過name和hash來區(qū)分不同的
  }
}

這樣的話铅鲤,就可以把多個入口文件打包成不同文件名和不同哈希值的JS文件划提,并且都放在dist目錄下。

但是這里卻有一個很大的問題邢享,那就是每次打包都會新生成一次打包文件鹏往,這些文件如何放到HMTL里呢?總不能每打一次包就手動更改一次吧骇塘?為了解決這個問題伊履,就需要使用一個插件:html-webpack-plugin。用這個插件動態(tài)生成HTML文件并且把相應(yīng)的打包文件放到里面款违。

npm安裝插件

npm install html-webpack-plugin --save-dev

改寫webpack.config.js文件:

var path = require('path')
var HtmlWebpackPlugin = require('html-webpack-plugin')                //Common.js語法引入插件

module.exports = {             //注意這里是exports不是export
  entry: {
    main: './src/script/main.js',
    a: './src/script/a.js'
  },
  output: {
    path: path.resolve(__dirname,'dist'),
    filename: '[name]-[hash]-bundle.js'
  },
  plugins: [                                             //使用插件
    new HtmlWebpackPlugin({                              //因為要生成兩個不同的html文件唐瀑,所以要new兩次
      filename: 'index.html',                                //filename指定生成html文件名
      template: 'index.html',                               //template指定打包參照的模板
      chunks: ['main']                    //chunks參數(shù)指定要把哪個入口文件打包后嵌入到HTML里,可以是一個也可以是多個
    }),
    new HtmlWebpackPlugin({
      filename: 'a.html',
      template: 'a.html',
      chunks: ['a']
    })
  ]
}

運(yùn)行打包命令后插爹,我們可以看到在dist目錄下哄辣,生成兩個打包的JS文件和HTML文件请梢,而打開a.html里面就內(nèi)嵌了a開頭的打包的js文件。而參照的template就是根目錄下index.html和a.html文件力穗。

屏幕快照 2017-08-18 上午9.51.19.png
五毅弧、使用loaders來加載資源(這一部分很重要)

webpack可以將各種各樣的資源,包括CSS/SASS/LESS/PNG/JPG/JPEG等都進(jìn)行打包当窗,只是它需要應(yīng)用不同的loader够坐。

安裝loaders

npm install --save-dev babel-loader babel-core babel-preset-es2015  //這是將es6轉(zhuǎn)換為es5所必須的
npm install --save-dev postcss-loader css-loader style-loader autoprefixer cssnano    //安裝相應(yīng)loader和插件
npm install --save-dev less less-loader    //安裝less和less-loader
npm install --save-dev sass sass-loader  //安裝sass和sass-loader
npm install --save-dev file-loader url-loader

在使用postcss-loader的時候有點復(fù)雜,先在要目錄下新建一個postcss.config.js文件超全,如下:

module.exports = {
  plugins: {                                //這里可以使用各種各樣的插件咆霜,postcss非常強(qiáng)大
    'autoprefixer': {},                 //這個插件用來給CSS文件添加前綴
    'cssnano': {}                        //這個插件用來壓縮CSS
  }
}

在webpack.config.js的配置文件配置loader:

var path = require('path')
var HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {             //注意這里是exports不是export
  entry: {
    main: './src/script/main.js',
    a: './src/script/a.js'
  },
  output: {
    path: path.resolve(__dirname,'dist'),
    filename: '[name]-[hash]-bundle.js'
  },
  module: {
    loaders: [                                                    //loaders在這里
      { test: /\.js$/,                                             //針對js文件里可能出現(xiàn)的es6語法轉(zhuǎn)換
        exclude: path.resolve(__dirname, 'node_modules'),         //不檢測的路徑,這里用path改為了絕對路徑
        include: path.resolve(__dirname, 'src'),                  //檢測的路徑嘶朱,注意這里是絕對路徑蛾坯,寫相對路徑會報錯。
        loader: 'babel-loader',
        query: {
          presets: ['es2015']                   //這個參數(shù)可以寫在這里疏遏,也可以在根目錄下建一個.babelrc或者寫在package.json里
        } 
      },
      {
        test:/\.css$/,
        use: [                                                                   //這里寫法和上面不太一樣脉课,但是效果相同
          {loader: 'style-loader' },                                     //效果依然是從右往左,先是postcss-loader
          {loader: 'css-loader', options: {importLoaders: 1}},     //這個css-loader寫了一個參數(shù)财异,是為了讓@import 進(jìn)來的CSS也同樣可以通過postcss-loader
          {
            loader: 'postcss-loader',
            options: {
              plugins: (loader) => [
                require('autoprefixer')({ broswers: ['last 5 versions'] }),     //這里給插件添加參數(shù)
                require('cssnano')()
              ]
            }
          }
        ]
      },
      {
      test: /\.less$/,
      loader: 'style-loader!css-loader!postcss-loader!less-loader'     //這里postcss-loader必須放在less和css之間
      },
      {
      test: /\.scss$/,
      loader: 'style-loader!css-loader!postcss-loader!sass-loader'
      },
      {
        test: /\.(jpg|png|gif|svg$)/,           //對于一些圖片文件的加載倘零,可以使用file-loader和url-loader
        use: [                                 //對于CSS中的url可以正常加載沒問題,對于組件里的就需要用到require語法
          {                                     //如果是在根目錄index.html那個img的話戳寸,那就沒辦法了呈驶,要么轉(zhuǎn)換成背景圖片,要么就使用import導(dǎo)入到入口的JS文件里疫鹊,再用JS方法加上去
            // loader: 'file-loader',
            loader: 'url-loader',          //url-loader和file-loader的區(qū)別在于袖瞻,可以指定一個limit參數(shù),小于它就用base-64位編碼
            options: {
              limit: 200000,
              // name: 'images/[name].[ext]',
            }
          }
        ]
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: 'index.html',
      chunks: ['main']

    }),
    new HtmlWebpackPlugin({
      filename: 'a.html',
      template: 'a.html',
      chunks: ['a']

    })
  ]
}

對于index.html里圖片url路徑的問題拆吆,要么轉(zhuǎn)化成背景圖片聋迎,要么import到入口JS文件里再用JS的辦法添加,其它沒有辦法枣耀。

六霉晕、最后,還有一個server和watch捞奕,不想寫了牺堰,文檔上寫的很清楚呢
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市颅围,隨后出現(xiàn)的幾起案子萌焰,更是在濱河造成了極大的恐慌,老刑警劉巖谷浅,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扒俯,死亡現(xiàn)場離奇詭異奶卓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)撼玄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門夺姑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掌猛,你說我怎么就攤上這事盏浙。” “怎么了荔茬?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵废膘,是天一觀的道長。 經(jīng)常有香客問我慕蔚,道長丐黄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任孔飒,我火速辦了婚禮灌闺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坏瞄。我一直安慰自己桂对,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布鸠匀。 她就那樣靜靜地躺著蕉斜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缀棍。 梳的紋絲不亂的頭發(fā)上宅此,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音睦柴,去河邊找鬼诽凌。 笑死毡熏,一個胖子當(dāng)著我的面吹牛坦敌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痢法,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狱窘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了财搁?” 一聲冷哼從身側(cè)響起蘸炸,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尖奔,沒想到半個月后搭儒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體穷当,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年淹禾,在試婚紗的時候發(fā)現(xiàn)自己被綠了馁菜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡铃岔,死狀恐怖汪疮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毁习,我是刑警寧澤智嚷,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站纺且,受9級特大地震影響盏道,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隆檀,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一摇天、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恐仑,春花似錦泉坐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至歧斟,卻和暖如春纯丸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背静袖。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工觉鼻, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人队橙。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓坠陈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捐康。 傳聞我的和親對象是個殘疾皇子仇矾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺,特此分享以備自己日后查看解总,也希望更多的人看到...
    小小字符閱讀 8,164評論 7 35
  • 寫在開頭 先說說為什么要寫這篇文章, 最初的原因是組里的小朋友們看了webpack文檔后, 表情都是這樣的: (摘...
    Lefter閱讀 5,286評論 4 31
  • 最近在學(xué)習(xí) Webpack,網(wǎng)上大多數(shù)入門教程都是基于 Webpack 1.x 版本的,我學(xué)習(xí) Webpack 的...
    My_Oh_My閱讀 8,180評論 40 247
  • GitChat技術(shù)雜談 前言 本文較長贮匕,為了節(jié)省你的閱讀時間,在文前列寫作思路如下: 什么是 webpack花枫,它要...
    蕭玄辭閱讀 12,691評論 7 110
  • 早安刻盐,孩子們掏膏!今天是7月20日。今天我們跟著一只飛盤去冒險敦锌。它經(jīng)歷了些什么壤追?最后選擇做回飛盤,它為什么快樂供屉? 羅強(qiáng)...
    銀杏兒_9fbc閱讀 2,870評論 0 1