webpack入門

1 webpack介紹

使用vue.js開發(fā)大型應(yīng)用需要使用webpack打包工具溢豆,Webpack 是一個(gè)前端資源的打包工具,它可以將js蜡秽、image府阀、css等資源當(dāng)成一個(gè)模塊進(jìn)行打包。


image.png

從圖中我們可以看出芽突,Webpack 可以將js试浙、css、png等多種靜態(tài)資源 進(jìn)行打包寞蚌,使用webpack有什么好處呢田巴?
1、模塊化開發(fā)
程序員在開發(fā)時(shí)可以分模塊創(chuàng)建不同的js挟秤、 css等小文件方便開發(fā)壹哺,最后使用webpack將這些小文件打包成一個(gè)文件,減少了http的請(qǐng)求次數(shù)艘刚。
webpack可以實(shí)現(xiàn)按需打包管宵,為了避免出現(xiàn)打包文件過(guò)大可以打包成多個(gè)文件。

2、 編譯typescript箩朴、ES6等高級(jí)js語(yǔ)法
隨著前端技術(shù)的強(qiáng)大岗喉,開發(fā)中可以使用javascript的很多高級(jí)版本,比如:typescript炸庞、ES6等钱床,方便開發(fā),
webpack可以將打包文件轉(zhuǎn)換成瀏覽器可識(shí)別的js語(yǔ)法燕雁。

3诞丽、CSS預(yù)編譯
webpack允許在開發(fā)中使用Sass 和 Less等原生CSS的擴(kuò)展技術(shù)鲸拥,通過(guò)sass-loader拐格、less-loader將Sass 和 Less的語(yǔ)法編譯成瀏覽器可識(shí)別的css語(yǔ)法。

webpack的缺點(diǎn):
1刑赶、配置有些繁瑣
2捏浊、文檔不豐富

1.1安裝webpack

1.1.2 安裝Node.js

webpack基于node.js運(yùn)行,首先需要安裝node.js撞叨。

image.png

為什么會(huì)有node.js金踪?
傳統(tǒng)意義上的 JavaScript 運(yùn)行在瀏覽器上,Chrome 使用的 JavaScript 引擎是 V8牵敷,Node.js 是一個(gè)運(yùn)行在服務(wù)端的框架胡岔,它的底層就使用了 V8 引擎,這樣就可以使用javascript去編寫一些服務(wù)端的程序枷餐,這樣也就實(shí)現(xiàn)了用javaScript去開發(fā) Apache + PHP 以及 Java Servlet所開發(fā)的服務(wù)端功能靶瘸,這樣做的好處就是前端和后端都采用javascript,即開發(fā)一份js程序即可以運(yùn)行在前端也可以運(yùn)行的服務(wù)端毛肋,這樣比一個(gè)應(yīng)用使用多種語(yǔ)言在開發(fā)效率上要高怨咪,不過(guò)node.js屬于新興產(chǎn)品,一些公司也在嘗試使用node.js完成一些業(yè)務(wù)領(lǐng)域润匙,node.js基于V8引擎诗眨,基于事件驅(qū)動(dòng)機(jī)制,在特定領(lǐng)域性能出色孕讳,比如用node.js實(shí)現(xiàn)消息推送匠楚、狀態(tài)監(jiān)控等的業(yè)務(wù)功能非常合適。
下邊我們?nèi)グ惭bNode.js:
1厂财、下載對(duì)應(yīng)你系統(tǒng)的Node.js版本:
https://nodejs.org/en/downloa
2芋簿、選安裝目錄進(jìn)行安裝
默認(rèn)即可
安裝完成檢查PATH環(huán)境變量是否設(shè)置了node.js的路徑。
3蟀苛、測(cè)試
在命令提示符下輸入命令
node ‐v
會(huì)顯示當(dāng)前node的版本

1.1.3 安裝NPM(記得環(huán)境變量哦重點(diǎn))

1益咬、自動(dòng)安裝NPM
npm全稱Node Package Manager,他是node包管理和分發(fā)的工具,使用NPM可以對(duì)應(yīng)用的依賴進(jìn)行管理幽告,NPM的功能和服務(wù)端項(xiàng)目構(gòu)建工具maven差不多梅鹦,我們通過(guò)npm 可以很方便地下載js庫(kù),打包js文件冗锁。
node.js已經(jīng)集成了npm工具齐唆,在命令提示符輸入 npm -v 可查看當(dāng)前npm版本

image.png

2、設(shè)置包路徑
包路徑就是npm從遠(yuǎn)程下載的js包所存放的路徑冻河。
使用 npm config ls 查詢NPM管理包路徑(NPM下載的依賴包所存放的路徑)
image.png

NPM默認(rèn)的管理包路徑在C:/用戶/[用戶名]/AppData/Roming/npm/node_meodules箍邮,為了方便對(duì)依賴包管理,我們將管理包的路徑設(shè)置在單獨(dú)的地方叨叙,本教程將安裝目錄設(shè)置在node.js的目錄下锭弊,創(chuàng)建npm_modules和
npm_cache,執(zhí)行下邊的命令:
本教程安裝node.js在D:\develop\node.js\js下所以執(zhí)行命令如下:
npm config set prefix "D:\develop\node.js\npm_modules"(要自己創(chuàng)建這個(gè)目錄)
npm config set cache "D:\develop\node.js\npm_cache"
此時(shí)再使用 npm config ls 查詢NPM管理包路徑發(fā)現(xiàn)路徑已更改
image.png

3擂错、安裝cnpm
npm默認(rèn)會(huì)去國(guó)外的鏡像去下載js包味滞,在開發(fā)中通常我們使用國(guó)內(nèi)鏡像,這里我們使用淘寶鏡像
下邊我們來(lái)安裝cnpm:
有時(shí)我們使用npm下載資源會(huì)很慢钮呀,所以我們可以安裝一個(gè)cnmp(淘寶鏡像)來(lái)加快下載速度剑鞍。
輸入命令,進(jìn)行全局安裝淘寶鏡像爽醋。
npm install -g cnpm --registry=https://registry.npm.taobao.org

安裝后蚁署,我們可以使用以下命令來(lái)查看cnpm的版本
cnpm -v


image.png

nrm ls 查看鏡像已經(jīng)指向taobao


image.png

使nrm use XXX切換 鏡像
如果nrm沒(méi)有安裝則需要進(jìn)行全局安裝:cnpm install -g nrm
1.1.4 安裝webpack

webpack安裝分為本地安裝和全局安裝:

本地安裝:僅將webpack安裝在當(dāng)前項(xiàng)目的node_modules目錄中,僅對(duì)當(dāng)前項(xiàng)目有效蚂四。
全局安裝:將webpack安裝在本機(jī)光戈,對(duì)所有項(xiàng)目有效,全局安裝會(huì)鎖定一個(gè)webpack版本证杭,該版本可能不適用某個(gè)項(xiàng)目田度。全局安裝需要添加 -g 參數(shù)。

1)本地安裝:
image.png

新建webpack進(jìn)入目錄
npm install --save-dev webpack 或 cnpm install --save-dev webpack

npm install --save-dev webpack-cli (4.0以后的版本需要安裝webpack-cli)

2)全局安裝加-g解愤,如下:
全局安裝就將webpack的js包下載到npm的包路徑下镇饺。
npm install webpack -g 或 cnpm install webpack -g

3)安裝webpack指定的版本:
進(jìn)入webpack目錄,運(yùn)行:cnpm install --save-dev webpack@3.6.0
全局安裝:npm install webpack@3.6.0 -g或 cnpm install webpack@3.6.0 -g

在cmd狀態(tài)輸入webpack送讲,出現(xiàn)如下提示說(shuō)明 webpack安裝成功:


image.png

1.2.0 入門程序

通過(guò)入門程序?qū)崿F(xiàn)對(duì)js文件的打包奸笤,體會(huì)webpack是如何對(duì)應(yīng)用進(jìn)行模塊化管理。
對(duì)上邊1+1=2的例子使用webpack進(jìn)行模塊化管理

1.2.1 定義模塊
創(chuàng)建webpacktest01目錄哼鬓,將vue.min.js及vue_02.html拷貝到目錄下监右。

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF‐8">
    <title></title>
    <script src="vue.min.js"></script>
</head>
<body>

<div id="app">

    <!--{{name}}-->
    <!--v-text可以解決網(wǎng)速慢出現(xiàn)表達(dá)式的問(wèn)題-->
    <a v-bind:href="url">
    <span v-text="name"></span>
    </a>
    <input type="text" v-model="num1">+
    <input type="text" v-model="num2">=
    <span v-text="result"></span>
    <!--<span v-text="Number.parseInt(num1)+Number.parseInt(num2)"></span>-->
    <!--{{Number.parseInt(num1)+Number.parseInt(num2)}}-->
    <button v-on:click="change">計(jì)算</button>

</div>

</body>

    <script>

        var vm = new Vue({
            el:"#app",
            data:{
                name:"hha",
                num1:0,
                num2:0,
                result:0,
                url:"http://www.baidu.com"
            },
            methods:{
                change:function () {
                    this.result= Number.parseInt(this.num1)+Number.parseInt(this.num2)
                    alert(this.result)
                }
            }
        });

    </script>

</html>

1、定義model01.js
在webpacktest01目錄下創(chuàng)建model01.js
將本程序使用的加法運(yùn)算的js方法抽取到一個(gè)js文件异希,此文件就是一個(gè)模塊

// 定義add函數(shù)
function add(x, y) {
    return x + y
}
// function add2(x, y) {
// return x + y+1
// }
// 導(dǎo)出add方法

module.exports.add = add;
// module.exports ={add,add2};//如果有多個(gè)方法這樣導(dǎo)出
// module.exports.add2 = add2//如果有多個(gè)方法也可以這樣導(dǎo)出

2健盒、定義main.js
在webpacktest01目錄下創(chuàng)建main.js,main.js是本程序的js主文件,包括如下內(nèi)容:
1扣癣、在此文件中會(huì)引用model01.js模塊
2惰帽、引用vue.min.js(它也一個(gè)模塊)
3、將html頁(yè)面中構(gòu)建vue實(shí)例的代碼放在main.js中父虑。
main.js的代碼如下

var {add} = require("./model01.js")
var Vue = require("./vue.min.js")

var vm = new Vue({
    el:"#app",
    data:{
        name:"hha",
        num1:0,
        num2:0,
        result:0,
        url:"http://www.baidu.com"
    },
    methods:{
        change:function () {
            this.result= Number.parseInt(this.num1)+Number.parseInt(this.num2)
            alert(this.result)
        }
    }
});

1.2.2 打包測(cè)試
上邊將mode01.js模塊及main.js主文件編寫完成该酗,下邊使用webpack對(duì)這些js文件進(jìn)行打包
1、進(jìn)入程序目錄士嚎,執(zhí)行webpack main.js build.js 呜魄,這段指令表示將main.js打包輸出為 build.js文件
執(zhí)行完成,觀察程序目錄是否出現(xiàn)build.js莱衩。
2爵嗅、在html中引用build.js

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF‐8">
    <title></title>
</head>
<body>

<div id="app">

    <!--{{name}}-->
    <!--v-text可以解決網(wǎng)速慢出現(xiàn)表達(dá)式的問(wèn)題-->
    <a v-bind:href="url">
    <span v-text="name"></span>
    </a>
    <input type="text" v-model="num1">+
    <input type="text" v-model="num2">=
    <span v-text="result"></span>
    <!--<span v-text="Number.parseInt(num1)+Number.parseInt(num2)"></span>-->
    <!--{{Number.parseInt(num1)+Number.parseInt(num2)}}-->
    <button v-on:click="change">計(jì)算</button>

</div>

</body>
    <script src="build.js"></script>
</html>

總結(jié):
webpack可以將js分模塊開發(fā),開發(fā)完成對(duì)各模塊代碼打包成一個(gè)統(tǒng)一的文件膳殷。
前端模塊開發(fā)的思想和服務(wù)端模塊開發(fā)的思想是一致的操骡,有利于多人協(xié)助開發(fā)。

1.3 webpack-dev-server

1赚窃、安裝webpack-dev-server
使用 webpack-dev-server需要安裝webpack、 webpack-dev-server和 html-webpack-plugin三個(gè)包岔激。
cnpm install webpack@3.6.0 webpack-dev-server@2.9.1 html-webpack-plugin@2.30.1 --save-dev(這是本地安裝)
安裝完成勒极,會(huì)發(fā)現(xiàn)程序目錄出現(xiàn)一個(gè)package.json文件,此文件中記錄了程序的依賴虑鼎。

2辱匿、配置webpack-dev-server
在package.json中配置script

{
  "scripts": {
    "dev": "webpack-dev-server --inline --hot --open --port 5008"
  },
  "devDependencies": {
    "html-webpack-plugin": "^2.30.1",
    "webpack": "^3.6.0",
    "webpack-dev-server": "^2.9.1"
  }
}

--inline:自動(dòng)刷新
--hot:熱加載
--port:指定端口
--open:自動(dòng)在默認(rèn)瀏覽器打開
--host:可以指定服務(wù)器的 ip,不指定則為127.0.0.1炫彩,如果對(duì)外發(fā)布則填寫公網(wǎng)ip地址
devDependencies:開發(fā)人員在開發(fā)過(guò)程中所需要的依賴匾七。
scripts:可執(zhí)行的命令

1.3.1 配置webpack.config.js
在webpacktest02目錄下創(chuàng)建 webpack.config.js, webpack.config.js是webpack的配置文件江兢。在此文件中可以配置應(yīng)用的入口文件昨忆、輸出配置、插件等杉允,其中要實(shí)現(xiàn)熱加載自動(dòng)刷新功能需要配置html-webpack-plugin插件邑贴。
html-webpack-plugin的作用是根據(jù)html模板在內(nèi)存生成html文件,它的工作原理是根據(jù)模板文件在內(nèi)存中生成一個(gè)index.html文件叔磷。
1拢驾、配置模板文件
將原來(lái)的vue_02.html作為模板文件,為了和內(nèi)存中的index.html文件名區(qū)別改基,注意將vue_02.html中的script標(biāo)簽去掉

2繁疤、配置 html-webpack-plugin
在webpack.config.js中配置html-webpack-plugin插件

//引用html-webpack-plugin插件,作用是根據(jù)html模板在內(nèi)存生成html文件,它的工作原理是根據(jù)模板文件在內(nèi)存中生成一個(gè)index.html文件稠腊。
var htmlwp = require('html-webpack-plugin');
module.exports={
    entry:'./src/main.js',  //指定打包的入口文件
    output:{
        path : __dirname+'/dist',  // 注意:__dirname表示webpack.config.js所在目錄的絕對(duì)路徑
        filename:'build.js'        //輸出文件
    },
    devtool: 'eval-source-map',
    plugins:[
        new htmlwp({
            title: '首頁(yè)',  //生成的頁(yè)面標(biāo)題<head><title>首頁(yè)</title></head>
            filename: 'index.html', //webpack-dev-server在內(nèi)存中生成的文件名稱案疲,自動(dòng)將build注入到這個(gè)頁(yè)面底部,才能實(shí)現(xiàn)自動(dòng)刷新功能
            template: 'test02.html' //根據(jù)vue_02.html這個(gè)模板來(lái)生成(這個(gè)文件請(qǐng)程序員自己生成)
        })
    ]
}

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

image.png

1.3.2 啟動(dòng)
啟動(dòng)文件:
1麻养、進(jìn)入 webpacktest02目錄褐啡,執(zhí)行npm run dev
2、使用webstorm鳖昌,右鍵package.json文件备畦,選擇“Show npm Scripts”
打開窗口:


image.png

雙擊 dev。
注意:dev就是在package.json中配置的webpack dev server命令许昨。
發(fā)現(xiàn)啟動(dòng)成功自動(dòng)打開瀏覽器懂盐。
修改src中的任意文件內(nèi)容,自動(dòng)加載并刷新瀏覽器糕档。

1.3.3 debug調(diào)試
使用了webpack之后就不能采用傳統(tǒng)js的調(diào)試方法在chrome中打斷點(diǎn)莉恼。
webpack將多個(gè)源文件打包成一個(gè)文件,并且文件的內(nèi)容產(chǎn)生了很大的變化速那,webpack提供devtool進(jìn)行調(diào)試俐银,devtool是基于sourcemap的方式,在調(diào)試時(shí)會(huì)生成一個(gè)map文件端仰,其內(nèi)容記錄生成文件和源文件的內(nèi)容映射捶惜,即生成文件中的哪個(gè)位置對(duì)應(yīng)源文件中的哪個(gè)位置,有了sourcemap就可以在調(diào)試時(shí)看到源代碼荔烧。
配置如下:
1吱七、在webpack.config.js中配置:
devtool: 'eval‐source‐map'

image.png

2、在js中跟蹤代碼的位置上添加debugger
一個(gè)例子:
在add方法中添加debugger
image.png

啟動(dòng)應(yīng)用鹤竭,刷新頁(yè)面跟蹤代碼:
點(diǎn)擊“計(jì)算” 即進(jìn)入debugger代碼位置踊餐,此時(shí)可以使用chrome進(jìn)行調(diào)試了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末臀稚,一起剝皮案震驚了整個(gè)濱河市吝岭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烁涌,老刑警劉巖苍碟,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異撮执,居然都是意外死亡微峰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門抒钱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蜓肆,“玉大人颜凯,你說(shuō)我怎么就攤上這事≌萄铮” “怎么了症概?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)早芭。 經(jīng)常有香客問(wèn)我彼城,道長(zhǎng),這世上最難降的妖魔是什么退个? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任募壕,我火速辦了婚禮,結(jié)果婚禮上语盈,老公的妹妹穿的比我還像新娘舱馅。我一直安慰自己,他們只是感情好刀荒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布代嗤。 她就那樣靜靜地躺著,像睡著了一般缠借。 火紅的嫁衣襯著肌膚如雪干毅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天烈炭,我揣著相機(jī)與錄音溶锭,去河邊找鬼。 笑死符隙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垫毙。 我是一名探鬼主播霹疫,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼综芥!你這毒婦竟也來(lái)了丽蝎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤膀藐,失蹤者是張志新(化名)和其女友劉穎屠阻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體额各,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡国觉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虾啦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麻诀。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痕寓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝇闭,到底是詐尸還是另有隱情呻率,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布呻引,位于F島的核電站礼仗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逻悠。R本人自食惡果不足惜元践,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹂风。 院中可真熱鬧卢厂,春花似錦、人聲如沸惠啄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撵渡。三九已至融柬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趋距,已是汗流浹背粒氧。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留节腐,地道東北人外盯。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像翼雀,于是被迫代替她去往敵國(guó)和親饱苟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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