html-webpack-plugin

作用

直接為項目生成一個或多個HTML文件(HTML文件個數(shù)由插件實例的個數(shù)決定)哲戚,并將webpack打包后輸出的所有腳本文件自動添加到插件生成的HTML文件中。通過配置耙考,可以將根目錄下用戶自定義的HTML文件作為插件生成HTML文件的模板谜喊。另外,還可以通過向插件傳遞參數(shù)倦始,控制HTML文件的輸出斗遏。

用法:

  1. 第一步:在項目根目錄下安裝插件:
cnpm install html-webpack-plugin --save-dev
  1. 第二步:在webpack配置文件頭部require html-webpack-plugin模塊,并保存引用至htmlWebpackPlugin變量鞋邑。
var htmlWebpackPlugin = require('html-webpack-plugin');
  1. 第三步:為webpack配置文件暴露的對象添加一個plugins屬性诵次,屬性值為一個數(shù)組账蓉,將新建的html-webpack-plugin對象實例添加到數(shù)組中。若不傳入任何參數(shù)逾一,那么插件將生成默認(rèn)的html文件铸本。
module.exports = {
    entry: {
        main:'./src/script/main.js'
    }, 
    output: {
        path: './dist',
        filename: 'js/[name].bundle.js'
    },
    plugins:[
        new htmlWebpackPlugin()
        ]
}
  1. 第四步:配置參數(shù)。為新建的對象實例傳入一個對象字面量參數(shù)嬉荆,初始化對象實例的屬性归敬。
module.exports = {
    ... ,
    plugins:[
        new htmlWebpackPlugin({
            filename:'index.html',
            template:'template.html', 
            inject:false,
            title:'webpack is good',
            chunks:['main']
        })
        ]
}

htmlWebpackPlugin對象

htmlWebpackPlugin對象有兩個屬性,一個是files鄙早,一個是options汪茧。files和options的屬性值都是對象。通過EJS語法限番,可以在HTML模板文件(template.html)中遍歷這兩個屬性舱污,查看其詳情:

<% for(var key in htmlWebpackPlugin.files) { %>
    <%= key %> : <%= JSON.stringify(htmlWebpackPlugin.files[key]) %>    //將對象或數(shù)組轉(zhuǎn)換為JSON字符串。
<% } %>

<% for(var key in htmlWebpackPlugin.options) { %>
    <%= key %> : <%= JSON.stringify(htmlWebpackPlugin.options[key]) %>  
<% } %>

遍歷后的結(jié)果如下:

"htmlWebpackPlugin": {
  "files": {
    publicPath : "", 
    "css": [],
    "js": [ "js/main.ae8647e767cd76e54693.bundle.js"],
    "chunks": {
      "main": {
        "size":23,
        "entry": "js/main.ae8647e767cd76e54693.bundle.js", 
        "css": [],
        "hash":"ae8647e767cd76e54693",
      }
    },
    manifest : ""
  },
  "options":{
        template : "C:\\dev\\webpack-demo\\node_modules\\.2.28.0@html-webpack-plugin\\lib\\loader.js!c:\\dev\\webpack-demo\\index.html",    
    filename : "index.html",    
    hash : false,   
    inject : false, 
    compile : true, 
    favicon : false,    
    minify : false,     
    cache : true,   
    showErrors : true,  
    chunks : ["main"],  
    excludeChunks : [], 
    title : "webpack is good",  
    xhtml : false   
    }
}

參數(shù)說明:

  • title: title值用于生成的HTML文檔弥虐。
  • filename: 將生成的HTML寫入到該文件中扩灯。默認(rèn)寫入到index.html中。你也可以在這兒指定子目錄 (eg: assets/admin.html)霜瘪。
  • template: Webpack require path 到 template中珠插。 詳情查閱 docs
  • inject: true | 'head' | 'body' | false添加所有的靜態(tài)資源(assets)到模板文件或templateContent 。當(dāng)傳入true'body'時颖对,所有javascript資源將被放置到body 元素的底部捻撑。 當(dāng)傳入'head'時, 所有的腳本將被放置到head元素中缤底。
  • favicon: 添加指定的favicon path到輸出的html文件顾患。
  • minify: {...} | false 傳入一個html-minifier 對象選項來壓縮輸出的html文件。
  • hash: true | false 如果值為true个唧,就添加一個唯一的webpack compilation hash給所有已included的 scripts 和 CSS 文件江解。這對緩存清除(cache busting)十分有用。
  • cache: true | false 如果為true (默認(rèn))徙歼,只要文件被更改了就emit(發(fā)表)文件犁河。
  • showErrors: true | false如果為true (默認(rèn)),詳細(xì)的錯誤信息將被寫入到HTML頁面鲁沥。
  • chunks:允許你只添加某些chunks (e.g. only the unit-test chunk)
  • chunksSortMode: 在chunks被include到html文件中以前呼股,允許你控制chunks 應(yīng)當(dāng)如何被排序。允許的值: 'none' | 'auto' | 'dependency' | {function} - 默認(rèn)值: 'auto'画恰。
  • excludeChunks: 允許你跳過某些chunks (e.g. don't add the unit-test chunk)
  • xhtml: true | false 如果為true彭谁, 將 link 標(biāo)簽渲染為自閉合標(biāo)簽, XHTML compliant。 默認(rèn)是 false允扇。

template參數(shù)

由于html-webpack-plugin直接生成的HTML文件十分簡單缠局,不能滿足項目需求则奥,因此我們通常會配置template參數(shù),將該參數(shù)值設(shè)置為我們已創(chuàng)建好的HMTL模板文件相對于根目錄的相對路徑狭园。

    template:'template.html'

由于html-webpack-plugin支持EJS模板語法读处,因此在模板文件中,我們可以使用EJS模板語法來獲取htmlWebpackPlugin對象中的數(shù)據(jù)唱矛,以此來控制html的輸出罚舱。

chunks或excludeChunks參數(shù)

chunks或excludeChunks參數(shù)限定了HTML模板文件中能夠包含的打包后的腳本文件。該參數(shù)對腳本的自動注入或手動注入都有限定作用绎谦。

inject參數(shù)

注意下面兩種情況:

  1. 若inject值為false管闷,那么所有打包后的腳本文件都不會被自動添加到HTML模板文件中。此時你需要在模板文件中通過EJS語法窃肠,在需要的位置處包个,手動添加相應(yīng)的腳本文件,若不添加冤留,打包后的腳本文件將不會出現(xiàn)在HTML模板文件相應(yīng)的位置上碧囊。
module.exports = {
...
    plugins:[
        new htmlWebpackPlugin({
            filename:'c.html',
            template:'index.html',
            title:'this is c.html',
            inject:false,
            excludeChunks:['a','b']
        })
    ]
}
  1. 若inject未設(shè)置,或設(shè)置了非false的值纤怒,那么所有打包后的腳本文件都會被自動添加到HTML模板文件中糯而。在這種場景下,HTML模板文件中不能出現(xiàn)任何手動添加的打包后的腳本文件泊窘。因為后者會導(dǎo)致webpack報錯或是出現(xiàn)腳本重復(fù)注入的情況歧蒋。
module.exports = {
...
    plugins:[
        new htmlWebpackPlugin({
            filename:'admin.html',
            template:'index.html',
            inject:'head',
            chunks:['a','b','c']
        })
    ]
}

當(dāng)inject未設(shè)置,或設(shè)置了非false的值時:若此時HTML模板文件中已有被手動添加的打包后的腳本文件州既,那么:

  • 當(dāng)該腳本文件所對應(yīng)的chunk與chunks或excludeChunks參數(shù)所限定的chunk不一致時,webpack會報錯萝映;
  • 當(dāng)手動添加的位置與inject參數(shù)值所指示的位置不一致時吴叶,webpack也會報錯。
  • 若都一致序臂,那么手動添加的腳本文件也會被注入到HTML模板中蚌卤,從而出現(xiàn)腳本重復(fù)注入的情況。

結(jié)論:在同一HTML模板文件中奥秆,自動添加已打包的腳本文件與手動添加已打包的腳本文件不能并存逊彭,這兩項操作只能選其一。

特殊情況:使用EJS語法向HTML模板文件手動添加打包后的腳本文件:

1.由于inject參數(shù)不能被同時設(shè)置為'head'和'body'构订,因此侮叮,當(dāng)有的打包后的腳本文件需要被添加到head標(biāo)簽,而另外的需要被添加到body標(biāo)簽中時悼瘾,就需要手動向HTML模板注入腳本囊榜。

<head>
    ...
    <script src="<%= htmlWebpackPlugin.files.chunks.main.entry %>"></script>
</head>

<body>
<% for(var k in htmlWebpackPlugin.files.chunks){ %>
    <% if(k!=='main'){ %>
    <script src="<%= htmlWebpackPlugin.files.chunks[k].entry %>"></script>
    <% } %>
<% } %>
</body>

2.為了網(wǎng)頁的加載性能审胸,減少HTTP請求數(shù),當(dāng)有的打包后的腳本文件需要被內(nèi)嵌到head標(biāo)簽中卸勺,而其余的需要以引用外部資源的方式添加到HTML模板中時砂沛,也需要手動向HTML模板注入腳本。

<head>
    ...
    <script type="text/javascript" src="<%= compilation.assets[htmlWebpackPlugin.files.chunks.main.entry.substr(htmlWebpackPlugin.files.publicPath.length)].source() %>"></script>
</head>

<body>
<% for(var k in htmlWebpackPlugin.files.chunks){ %>
    <% if(k!=='main'){ %>
    <script src="<%= htmlWebpackPlugin.files.chunks[k].entry %>"></script>
    <% } %>
<% } %>
</body>

生成多個HTML文件

如果我們開發(fā)的是一個多頁面應(yīng)用程序曙求,那么我們就需要為不同的頁面生成不同的HTML文件碍庵。通過向plugins數(shù)組添加多個插件實例就可以實現(xiàn):

module.exports = {
  entry: 'index.js',
  output: {
    path: 'dist',
    filename: 'index_bundle.js'
  },
  plugins: [
    new HtmlWebpackPlugin(), // Generates default index.html 
    new HtmlWebpackPlugin({  // Also generate a test.html 
      filename: 'test.html',
      template: 'src/assets/test.html'
    })
  ]
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悟狱,隨后出現(xiàn)的幾起案子静浴,更是在濱河造成了極大的恐慌,老刑警劉巖芽淡,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件马绝,死亡現(xiàn)場離奇詭異,居然都是意外死亡挣菲,警方通過查閱死者的電腦和手機富稻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來白胀,“玉大人椭赋,你說我怎么就攤上這事』蚋埽” “怎么了哪怔?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長向抢。 經(jīng)常有香客問我认境,道長,這世上最難降的妖魔是什么挟鸠? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任叉信,我火速辦了婚禮,結(jié)果婚禮上艘希,老公的妹妹穿的比我還像新娘硼身。我一直安慰自己,他們只是感情好覆享,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布佳遂。 她就那樣靜靜地躺著,像睡著了一般撒顿。 火紅的嫁衣襯著肌膚如雪丑罪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音巍糯,去河邊找鬼啸驯。 笑死,一個胖子當(dāng)著我的面吹牛祟峦,可吹牛的內(nèi)容都是我干的罚斗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼宅楞,長吁一口氣:“原來是場噩夢啊……” “哼针姿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厌衙,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤距淫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后婶希,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榕暇,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年喻杈,在試婚紗的時候發(fā)現(xiàn)自己被綠了彤枢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡筒饰,死狀恐怖缴啡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓷们,我是刑警寧澤业栅,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站谬晕,受9級特大地震影響碘裕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜攒钳,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一娘汞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夕玩,春花似錦、人聲如沸惊豺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尸昧。三九已至揩页,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烹俗,已是汗流浹背爆侣。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工萍程, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兔仰。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓茫负,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乎赴。 傳聞我的和親對象是個殘疾皇子忍法,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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