簡介: html-webpack-plugin 是一個webpack插件,它簡化了註入webpack打包文件的html的創建。當webpack打包文件使用哈希值作為文件名並且每次編譯的哈希值都不同時尤其有用。你可以使用lodash模板來創建html文件,也可以使用你自己的載入器。 安裝: 第三方插件 ...
簡介:
html-webpack-plugin 是一個webpack插件,它簡化了註入webpack打包文件的html的創建。當webpack打包文件使用哈希值作為文件名並且每次編譯的哈希值都不同時尤其有用。你可以使用lodash模板來創建html文件,也可以使用你自己的載入器。
安裝:
npm install html-webpack-plugin --save-dev
第三方插件:
html-webpack-plugin 通過提供鉤子(參考下麵的事件)來擴展你的需求。可以通過零配置來集成下麵這些非常有用的插件:
- webpack-subresource-integrity 用於增強資源安全性
- appcache-webpack-plugin 供IOS和Android離線使用
- favicons-webpack-plugin 用於對IOS,Android和桌面瀏覽器生成圖標和收藏夾圖標
- html-webpack-harddisk-plugin 可以被用於總是將html文件寫入磁碟,使用webpack-dev-server和模塊熱替換時尤其有用
- html-webpack-inline-source-plugin 用於在生成的html文件中內聯資源
- html-webpack-inline-svg-plugin 用於在生成的html文件中內聯SVG資源
- html-webpack-exclude-assets-plugin 使用正則表達式排除指定的資源
- html-webpack-include-assets-plugin 用於添加js或css文件路徑(例如那些被copy-webpack-plugin插件編譯的文件)
- script-ext-html-webpack-plugin 用於對 <script> 標簽添加 async,defer,module 屬性,或者內聯這些屬性
- style-ext-html-webpack-plugin 用於將 <link> 引入的外部樣式轉換成由 <style> 標簽包含的內部樣式
- resource-hints-webpack-plugin 使用 <link rel='preload'> 和 <link rel='prefetch'> 添加資源提示,提高頁面的載入和初始化速度
- preload-webpack-plugin 使用 <link rel='preload'> 自動連接非同步的javascript塊,幫助進行懶載入
- link-media-html-webpack-plugin 允許註入樣式表標記 <link/> 來自動設置媒體屬性;對於提供特殊的桌面/移動/列印顯示等非常有用。瀏覽器會根據條件下載對應的樣式表
- inline-chunk-manifest-html-webpack-plugin 用於內聯webpack的 chunk manifest。預設提取 manifest 到 <head> 標簽內
基本用法:
插件生成一個在 <body> 內使用 <script> 標簽引入所有 webpack 打包文件的html5文件。
像下麵這樣將插件添加到 webpack 配置文件中:
1 var HtmlWebpackPlugin = require('html-webpack-plugin'); 2 3 var webpackConfig = { 4 5 entry: 'index.js', 6 7 output: { 8 9 path: __dirname _ './dist', 10 11 filename: 'index_bundle.js' 12 13 }, 14 15 plugins: [new HtmlWebpackPlugin()] 16 17 };
這將會在項目根目錄下的 dist 文件夾中生成一個包含如下內容的 index.html 文件:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Webpack App</title> 6 </head> 7 <body> 8 <script src="index_bundle.js"></script> 9 </body> 10 </html>
如果有多個入口點,所有的打包文件都會被 <script> 標簽引入到生成的html文件中。
如果 webpack 輸出了 CSS 資源(例如:使用 ExtractTextPlugin 產出的CSS文件),這些CSS文件會被 <link> 標簽引入到html的 <head> 中。
配置:
你可以通過一個散列對象來配置 HtmlWebpackPlugin。可配置的屬性如下:
- title: 設置生成的html文件的<title>值
- filename: 設置生成的html文件名,預設是 index.html 。你也可以在這設置子文件夾路徑(例如: assets/admin.html)
- template: 設置模板載入器
1. 不設置任何載入器
預設(如果你不使用任何載入器)使用 fallback lodash loader:
{ plugins: [ new HtmlWebpackPlugin({ template: 'src/index.html' }) ] }
註意,使用 .html 擴展名可能會意外的出發其他載入器。
2. 直接設置模板載入器
new HtmlWebpackPlugin({ // For details on `!!` see https://webpack.github.io/docs/loaders.html#loader-order template: '!!handlebars!src/index.hbs' })
3. 使用 module.loders 設置載入器
{ module: { loaders: [ { test: /\.hbs$/, loader: 'handlebars-loader' }, ] }, plugins: [ new HtmlWebpackPlugin({ template: 'src/index.hbs' }) ] }
下麵的例子中,webpack將對模板使用 html-loader。這將會壓縮html,並且禁用 ejs 載入器。
{ module: { loaders: [ { test: /\.html$/, loader: 'html-loader' }], }, plugins: [ new HtmlWebpackPlugin({ template: 'src/index.html' }) ] }
- inject: true | 'head' | 'body' | false
將所有資源註入到 template 或 templateContent 中。 如果設置為 true 或 'body' 所有的javascript資源將會註入到body元素的底部。
如果設置為 'head' 則會把javascript資源註入到head元素中。
- favicon: 設置將被添加到html中的圖標路徑。
- minify: {...} | false
通過設置 html-minifier 屬性來壓縮生成的html。
- hash: true | false
如果為true,會給html中所有的javascript和css文件添加一個唯一的哈希值。這對清除緩存非常有用。
- cache: true | false
預設為true,只有當文件該變時才會觸發編譯
- showErrors: true | false
預設為true,錯誤的詳細信息將會被寫入到html頁面中。
- chunks: 設置允許添加的模塊(例如: 只允許添加 unit-test 模塊)
- chunksSortMode: 'none' | 'auto' | 'dependency' | 'manual' | {function} 預設為 'auto'
設置模塊添加到html中的順序
- excludeChunks: 設置忽略某些模塊(例如: 不添加 unit-test 模塊)
- xhtml: true | false
預設為false,如果為true,將 <link> 標簽渲染為自關閉,相容 XHTML。
下麵是一個如何使用這些屬性的 webpack 配置示例:
{ entry: 'index.js', output: { path: __dirname + '/dist', filename: 'index_bundle.js' }, plugins: [ new HtmlWebpackPlugin({ title: 'My App', filename: 'assets/admin.html' }) ] }
生成多個html文件:
如果需要生成多個html文件,只需要在插件數組中多次創建 HtmlWebpackPlugin 對象即可:
{ entry: 'index.js', output: { path: __dirname + '/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' }) ] }
編寫你自己的模板:
如果預設生成的html不能滿足你的需求,你可以自己編寫模板。最簡單的方式是配置 template 選項並傳遞一個自定義的html文件。
html-webpack-plugin會自動將所有必要的CSS,JS,manifest 和 favicon 文件註入到標記中。例如:
webpack.config.js :
plugins: [ new HtmlWebpackPlugin({ title: 'Custom template', template: 'my-index.html', // Load a custom template (lodash by default see the FAQ for details) }) ]
my-index.html :
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"/> <title><%= htmlWebpackPlugin.options.title %></title> </head> <body> </body> </html>
如果你已經設置了一個載入器,你可以使用這個載入器來解析模板。
請註意,如果您指定了html-loader並使用.html文件作為模板,也會發生這種情況。
module: { loaders: [ { test: /\.hbs$/, loader: "handlebars" } ] }, plugins: [ new HtmlWebpackPlugin({ title: 'Custom template using Handlebars', template: 'my-index.hbs' }) ]
如果 inject 特性不能滿足你的需求而且你想自主控制資源註入的位置,那麼你可以使用 html-webpack-template 項目
的預設模板(default template)作為起點來編寫你自己的模板。
你可以在模板中使用以下變數:
htmlWebpackPlugin : 特定於此插件的數據
htmlWebpackPlugin.files : webpack 的 stats 對象的 assetsByChunkName 屬性的竄改表示,包含了從入口點名稱到包文件名的映射。例如:
"htmlWebpackPlugin": { "files": { "css": [ "main.css" ], "js": [ "assets/head_bundle.js", "assets/main_bundle.js"], "chunks": { "head": { "entry": "assets/head_bundle.js", "css": [ "main.css" ] }, "main": { "entry": "assets/main_bundle.js", "css": [] }, } } }
如果你已經在你的webpack配置文件中設置了一個publicPath,這個資源哈希值將被正確地反映出來。
htmlWebpackPlugin.options : 傳遞給插件的選項散列。除了這個插件實際使用的選項之外,你可以使用這個散列將任意數據傳遞給你的模板。
webpack : webpack stats 對象。註意,這個stats對象存在於HTML模板發出的時候,因此可能不包含webpack運行完成後的stats的全部信息。
webpackConfig : 用於此編譯的webpack配置。這可以用來獲取 publicPath(例如:webpackConfig.output.publicPath)
過濾模塊:
設置只包含指定的模塊:
plugins: [ new HtmlWebpackPlugin({ chunks: ['app'] }) ]
通過設置 excludeChunks 選項,排除指定的模塊:
plugins: [ new HtmlWebpackPlugin({ excludeChunks: ['dev-helper'] }) ]
事件:
通過執行下列事件來允許其他插件更改html:
非同步事件:
- html-webpack-plugin-before-html-generation
- html-webpack-plugin-before-html-processing
- html-webpack-plugin-alter-asset-tags
- html-webpack-plugin-after-html-processing
- html-webpack-plugin-after-emit
同步事件:
- html-webpack-plugin-alter-chunks
實現示例: html-webpack-harddisk-plugin
用法示例:
// MyPlugin.js function MyPlugin(options) { // Configure your plugin with options... } MyPlugin.prototype.apply = function(compiler) { // ... compiler.plugin('compilation', function(compilation) { console.log('The compiler is starting a new compilation...'); compilation.plugin('html-webpack-plugin-before-html-processing', function(htmlPluginData, callback) { htmlPluginData.html += 'The magic footer'; callback(null, htmlPluginData); }); }); }; module.exports = MyPlugin;
然後 webpack.config.js 中配置為:
plugins: [ new MyPlugin({options: ''}) ]
註意,回調必須通過htmlPluginData傳遞給其他插件,監聽相同的html-webpack-plugin-before-html-processing事件。
本文翻譯自 html-webpack-plugin , 英語水平有限, 翻譯不當之處, 敬請指正.