webpack4.28.3版本

webpack是什么呢询刹?

  • 模塊打包機,分析目錄結(jié)構(gòu)势似,找到j(luò)s模塊(包括瀏覽器不能識別的代碼typscript sass...),打包成合適的格式供瀏覽器訪問新娜。
  • 模塊打包 構(gòu)建(項目)

打包的優(yōu)勢(webpack的優(yōu)勢)

  • 1、模塊化慧耍,拆分了業(yè)務(wù)復(fù)雜的js代碼 => 細小的文件
  • 2身辨、js拓展 => 基于原型面向?qū)ο?=> 基于class(typscript es6)=> 瀏覽器識別

面試會問到

  • webpack grunt gulp 這三者的區(qū)別:grunt、gulp優(yōu)化流程的工具芍碧,webpack是模塊化支持的工具煌珊,具有優(yōu)化流程的功能。

webpack的工作原理

  • 他有個js的主入口文件泌豆,主入口文件里面有很多相關(guān)的文件定庵。打包的時候就從主入口文件進入,按照包含路徑一直找下去踪危,最后全部打包成一個js文件(bundle.js)這個js文件就是供瀏覽器識別的文件蔬浙。
webpack安裝:
  • 先安裝nodejs環(huán)境(一直點next,檢測是否安裝好贞远,輸入npm命令會有版本相關(guān)內(nèi)容)
  • 初始化項目:npm init (會有一個package.json文件畴博,這個文件里面有很多初始化信息如下圖)
    package.json
  • 安裝webpack:npm install webpack --save-dev
  • 打包:webpack 要打包的文件名 打包以后的文件名
多個js的引入
  • require("./js文件名") 在一個js文件的頭部
css打包
  • 對于外來文件(不支持的文件) => loader插件(支持文件打包的工具)
  • css-loader (加載css文件)
  • style-loader (支持css運行)
  • 安裝:npm install css-loader style-loader --save-dev
  • 引入css文件:require("style-loader!css-loader!./css文件")

注意:在項目中,追加了文件(修改了代碼)蓝仲,都需要重新打包

常用打包參數(shù):
  • webpack 要打包的文件名 打包以后的文件名 --參數(shù)名 --參數(shù)名 ...
  • --watch 自動更新
  • --progress 顯示打包進度
  • --display-modules 列出打包模塊
  • --display-reasons 打包原因
  • --config 新配置文件名 修改webpack默認的配置文件
  • -p 壓縮混淆腳本
  • ctrl+c 終止前一個命令

構(gòu)件項目的詳細事項

  • 1俱病、新建項目文件夾
  • 2、npm init 初始化項目
  • 3袱结、npm install webpack --save-dev 安裝webpack
  • 4亮隙、構(gòu)建項目文件目錄:
    • src 源文件夾
    • dist 打包后文件夾
    • webpack.config.js webpack默認的配置文件如下
module.exports = {
    entry:"./src/script/main.js", //輸入路徑
    output:{
        path:"E:\\HBuilder\\webtest\\dist\\js\\", //輸出路徑(widows下需要絕對路徑是雙斜杠轉(zhuǎn)義,蘋果和lunix不需要轉(zhuǎn)義直接./路徑的寫法)
        filename:"bundle.js" // 輸出文件名
    }
}
/*
還可以這種寫法
var paths = require("path");path是node自帶模塊,路徑
module.exports = {
    entry:"./src/script/main.js",
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    }
}
*/
  • 在package.json文件里面配置webpack擎勘,可以用npm run來啟動(在這個版本里必須要安裝webpack-cli才能跑起來)
"scripts": {
    "bulid": "webpack"
  }
  • entry 三種調(diào)用形式:
    • entry: "./src/script/main.js" 單入口文件
    • entry:["文件路徑","文件路徑"...] 多入口文件 數(shù)組
    • entry:{path:"url路徑"咱揍,path:[]} 混合模式(不常用)

混合模式避免打包后的文件重名:webpack提供的命名方式[name] - [chunkhash] 名稱加哈希值

//數(shù)組多入口文件寫法
var paths = require("path");
module.exports = {
    entry:["./src/script/main.js","./src/script/a.js"],
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    }
}
html-webpack-plugin插件
  • 每次文件名稱都不同,引用src文件名稱不確定棚饵,正確引用就用到插件
  • html-webpack-plugin:安裝命令npm install html-webpack-plugin --save-dev
  • 使用:在webpack.config.js文件引入var htmlPlugin = require("html-webpack-plugin")煤裙,在下面新建對象new htmlPlugin如下掩完,跑起來過后打包后的文件里面多了個index.html文件
var htmlPlugin = require("html-webpack-plugin") ;
var paths = require("path");
module.exports = {
    entry:["./src/script/main.js","./src/script/a.js"],
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    },
        plugins:[
                new htmlPlugin({
                        template:"index.html"   //這里是讓根目錄的index文件映射到打包后錄下的index里面
                });
        ]
}
loader:程序中資源文件進行轉(zhuǎn)換,是nodejs中的函數(shù)硼砰,可以將資源作為參數(shù)來使用并且返回新的資源
  • 作用:轉(zhuǎn)化es6且蓬、處理less sass 圖片 其他文件元素...
  • 安裝命令:npm install --save-dev babel-loader babel-core
  • 上一步安裝完了再安裝最新的:npm install --save-dev babel-preset-latest
var htmlPlugin = require("html-webpack-plugin") ;
var paths = require("path");
module.exports = {
    entry:["./src/script/main.js","./src/script/a.js"],
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    },
        loaders:[
            {
                   test:/\.js$/, //以js結(jié)尾的文件
                    loader:"babel-loader", //用babel-loader處理  es6語法
                    exclude:path.resolve(__dirname,"node_modules"), //處理node_modules的內(nèi)容(已經(jīng)處理過的文件就不再處理) 
                    include:path.resolve(__dirname,"src")  //打包的范圍(src文件夾里面的內(nèi)容需要打包)
                    query:{
                          presets:["latest"] //最新的babel來處理
                    }
              }
        ]
        plugins:[
                new htmlPlugin({
                        filename:"index.html", //文件名
                        template:"index.html" ,  //這里是讓根目錄的index文件映射到打包后錄下的index里面
                         inject:"body" //打包后的js文件添加在哪里,也可以不加默認在body里面也可以修改到其他地方
                });
        ]
}
css如何處理
  • 下載css處理插件:npm install style-loader css-loader --save-dev
  • 然后在配置文件里面添加參數(shù)如下题翰,在主文件引入css文件
var htmlPlugin = require("html-webpack-plugin") ;
var paths = require("path");
module.exports = {
    entry:["./src/script/main.js","./src/script/a.js"],
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    },
        loaders:[
            {
                   test:/\.js$/, //以js結(jié)尾的文件
                    loader:"babel-loader", //用babel-loader處理  es6語法
                    exclude:path.resolve(__dirname,"node_modules"), //處理node_modules的內(nèi)容(已經(jīng)處理過的文件就不再處理) 
                    include:path.resolve(__dirname,"src")  //打包的范圍(src文件夾里面的內(nèi)容需要打包)
                    query:{
                          presets:["latest"] //最新的babel來處理
                    }
              },
              {
                    test:/\.css$/, //以css結(jié)尾的文件
                    loader:"style-loader!css-loader"
                }
        ]
        plugins:[
                new htmlPlugin({
                        filename:"index.html", //文件名
                        template:"index.html" ,  //這里是讓根目錄的index文件映射到打包后錄下的index里面
                         inject:"body" //打包后的js文件添加在哪里恶阴,也可以不加默認在body里面也可以修改到其他地方
                });
        ]
}
  • 處理less sass 下載命令:npm install less-loader(或sass-loader) --save-dev
  • 在配置文件里面添加下loader
//less
{
    test:/\.less$/, //以less結(jié)尾的文件
    loader:"style-loader!css-loader!less-loader" 
}
sass
{
    test:/\.sass$/, //以sass結(jié)尾的文件
    loader:"style-loader!css-loader!sass-loader" 
}
html如何處理
  • 下載html-loader插件命令:npm install html-loader --save-dev
  • 在配置文件里添加loader,然后在模板里面修改import tpl from "html文件路徑"
  • 在根目錄下的index.html里留個放模板id=app的地方豹障,然后在app.js里面創(chuàng)建變量獲取到模板的dom冯事,然后把要添加的html頁面放入進去就好了。
var htmlPlugin = require("html-webpack-plugin") ;
var paths = require("path");
module.exports = {
    entry:["./src/script/main.js","./src/script/a.js"],
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    },
     module:{
          loaders:[
              {
                   test:/\.js$/, //以js結(jié)尾的文件
                    loader:"babel-loader", //用babel-loader處理  es6語法
                    exclude:path.resolve(__dirname,"node_modules"), //處理node_modules的內(nèi)容(已經(jīng)處理過的文件就不再處理) 
                    include:path.resolve(__dirname,"src")  //打包的范圍(src文件夾里面的內(nèi)容需要打包)
                    query:{
                          presets:["latest"] //最新的babel來處理
                    }
              },
              {
                    test:/\.css$/, //以css結(jié)尾的文件
                    loader:"style-loader!css-loader"
                },
              {
                    test:/\.html$/, //以html結(jié)尾的文件
                    loader:"html-loader"
                }
          ]
      },
      plugins:[
                new htmlPlugin({
                        filename:"index.html", //文件名
                        template:"index.html" ,  //這里是讓根目錄的index文件映射到打包后錄下的index里面
                         inject:"body" //打包后的js文件添加在哪里血公,也可以不加默認在body里面也可以修改到其他地方
                });
        ]
}

//模板文件里處理
import tpl from "./layer.html";
function(){
    return{
        name:"張三"昵仅,
        tpl:tpl
    }
}
export default layer;

//在根目錄index.html下留下模板位置
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
        <div id="app">
            
        </div>
    </body>
</html>

圖片處理
  • 圖片常用格式jpg gif png,要處理css中的圖片和html img標(biāo)簽里面的圖片
  • 下載圖片文件處理命令:npm install file-loader --save-dev
var htmlPlugin = require("html-webpack-plugin") ;
var paths = require("path");
module.exports = {
    entry:["./src/script/main.js","./src/script/a.js"],
    output:{
        path:paths.join(__dirname,"dist","js"), 
        filename:"bundle.js" 
    },
        loaders:[
            {
                   test:/\.js$/, //以js結(jié)尾的文件
                    loader:"babel-loader", //用babel-loader處理  es6語法
                    exclude:path.resolve(__dirname,"node_modules"), //處理node_modules的內(nèi)容(已經(jīng)處理過的文件就不再處理) 
                    include:path.resolve(__dirname,"src")  //打包的范圍(src文件夾里面的內(nèi)容需要打包)
                    query:{
                          presets:["latest"] //最新的babel來處理
                    }
              },
              {
                    test:/\.css$/, //以css結(jié)尾的文件
                    loader:"style-loader!css-loader"
                },
              {
                    test:/\.html$/, //以html結(jié)尾的文件
                    loader:"html-loader"
                }
              {
                    test:/\.(jpg | gif | png)$/, //以ipg || gif || png結(jié)尾的文件
                    loader:"file-loader"
                }
        ]
        plugins:[
                new htmlPlugin({
                        filename:"index.html", //文件名
                        template:"index.html" ,  //這里是讓根目錄的index文件映射到打包后錄下的index里面
                         inject:"body" //打包后的js文件添加在哪里累魔,也可以不加默認在body里面也可以修改到其他地方
                });
        ]
}

import layer from "文件路徑" 從layer文件夾里面導(dǎo)入layer.js到本文件里面(es6語法)
export default layer 導(dǎo)出函數(shù)layer
@import "css文件路徑" css文件里面導(dǎo)入css文件的寫法

npm 命令

  • npm list --depth=0 -global 查看全局下載的所有包
  • npm uninstall -g [包名] 卸載安裝包

搭建一個完整項目的步驟

  • 1摔笤、新建項目文件
  • 2、npm init npm初始化(就會生成一個package.js文件)
  • 3垦写、npm install webpack webpack-cli --save-dev 安裝webpack和webpack-cli 因為我這里安裝的是版本4.28.3所以必須安裝-cli(這時多了node_modules文件夾是nodejs的配置內(nèi)容吕世,還會生成package-lock.json這個文件是綁定package.json依賴。這兩個都是默認的不用管)
  • 4梯投、創(chuàng)建項目文件夾目錄命辖。webpack.config.js里面是webpack的配置設(shè)置,src里面是放被打包文件晚伙,components里面放layer里面放模板文件吮龄,app.js為主入口文件,dist里面放打包后文件
  • 5咆疗、下載一個項目的所有插件也就是上面提到的所有。html-webpack-plugin插件母债、loader資源器午磁、style-loader css-loader樣式處理、html-loader頁面處理毡们、file-loader文件圖片處理
  • 6迅皇、配置package.json文件,在scripts自定義里面配置啟動webpack用命令npm run [自定義名]衙熔,我這里配置的時候后面還加了個參數(shù)自動更新可以添加多個
  • 7登颓、配置webpack.config.js文件,基本的包括入口红氯,出口框咙,插件的配置
//webpack.config.js里面的內(nèi)容
var htmlPlugin = require("html-webpack-plugin");//引入html-webpack-plugin插件咕痛,讓根目錄index.html頁面映射到dist里面去
var path = require("path");//這是nodejs自身的path函數(shù),獲取到準(zhǔn)確的路徑
module.exports = {
    entry:"./src/app.js",//入口主文件
    output:{
        path:path.join(__dirname,"dist"),//打包到哪個文件的路徑(windows是用絕對路徑喇嘱,lunix和蘋果是相對路徑)
        filename:"bundle.js"http://打包過后的文件名
    },
    module:{
        loaders:[
            {
                test:/\.js$/,//正則:以js結(jié)尾的文件
                loader:"babel-loader",//用babel-loader處理  es6語法
                exclude:path.resolve(__dirname,"node_modules"), //處理node_modules的內(nèi)容(已經(jīng)處理過的文件就不再處理) 
                include:path.resolve(__dirname,"src"), //打包的范圍 (src文件夾里面的內(nèi)容需要打包)
                query:{ //執(zhí)行過程
                    presets:["latest"]//最新的babel來處理
                }
            },
            {
                test:/\.css$/, //正則:以css結(jié)尾的文件
                loader:"style-loader!css-loader" //用style-loader css-loader處理
            },
            {
                test:/\.html$/, //正則:以html結(jié)尾的文件
                loader:"html-loader" //用html-loader處理
            },
            {
                test:/\.(jpg|gif|png)$/, //正則:以jpg || gif || png結(jié)尾的文件
                loader:"file-loader" //用file-loader處理
            }
        ]
    },
    plugins:[
        new htmlPlugin({
            filename:"index.html", //文件名
            template:"index.html", //使用html-webpack-plugin插件的語法茉贡,讓根目錄index映射到dist里面
            inject:"body" //打包后的js文件添加在哪里,可以不加這句話默認是在body里面也可修改到其他地方
        })
    ]
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末者铜,一起剝皮案震驚了整個濱河市腔丧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌作烟,老刑警劉巖愉粤,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拿撩,居然都是意外死亡科汗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門绷雏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來头滔,“玉大人,你說我怎么就攤上這事涎显±ぜ欤” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵期吓,是天一觀的道長早歇。 經(jīng)常有香客問我,道長讨勤,這世上最難降的妖魔是什么箭跳? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮潭千,結(jié)果婚禮上谱姓,老公的妹妹穿的比我還像新娘。我一直安慰自己刨晴,他們只是感情好屉来,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狈癞,像睡著了一般茄靠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝶桶,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天慨绳,我揣著相機與錄音,去河邊找鬼。 笑死脐雪,一個胖子當(dāng)著我的面吹牛厌小,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喂江,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼召锈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了获询?” 一聲冷哼從身側(cè)響起涨岁,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吉嚣,沒想到半個月后梢薪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡尝哆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年秉撇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秋泄。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡琐馆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恒序,到底是詐尸還是另有隱情瘦麸,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布歧胁,位于F島的核電站滋饲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏喊巍。R本人自食惡果不足惜屠缭,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崭参。 院中可真熱鬧呵曹,春花似錦、人聲如沸阵翎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郭卫。三九已至,卻和暖如春背稼,著一層夾襖步出監(jiān)牢的瞬間贰军,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留词疼,地道東北人俯树。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像贰盗,于是被迫代替她去往敵國和親许饿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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