運用 webpack 來使 pug 轉換成 .html。
html-loader 與 pug-html-loader
什麼是 html-loader
html-loader 是用來將 HTML 模版轉做 .html 檔來使用。
什麼是 pug-html-loader
pug-html-loader 是以 webpack 將 pug 格式轉換成 HTML 格式,但如果要輸出成 .html 檔就是要透過後面的 html-loader 來處理。
注意不是 pug-loader, pug-loader 是用來在很多的 pug 檔,直接可傳不同的變數進入模版中使用。
pug-html-loader 只能透過自已的 API,透過 options: {} 裡設定 data:{} 傳入使用,在轉出 .html 檔的 new HtmlWebpackPlugin() 中是無法傳入 pug 的資料來操作內容,使用時可以針對在 loader 取得 .pug 檔時共用 data{} 的設定。
123456789101112131415161718192021 {test: /\.pug$/,use: ['html-loader',{loader: 'pug-html-loader',options: {pretty: true,data:{myVar: 'jimmyWu'}},},],},// ...略new HtmlWebpackPlugin({template:'src/html/index.pug',filename:'index.html',});
12 p=myVar// HTML 輸出結果 <p>jimmyWu</p>而透過 pug-loader 方式,在自已的 API 下設定 options: { self: true, } 的方式,就可以將變數直接以 new HtmlWebpackPlugin() 中傳入 HTML 樣版中透過方法使用變數,這樣的好處是在產生 .html 時可以針對客製專屬樣版自已的變數。
12345678910111213141516171819202122 {test: /\.pug$/,use: {loader: 'pug-loader',options: {self: true, // 這個要加pretty: true,},},},// 略...new HtmlWebpackPlugin({template: './html/index.pug',data: {myVar: 'jimmyWu'},}),// .pug 檔讀取變數- var myVar = self.htmlWebpackPlugin.options.data.myVardiv=myVar
安裝 html-loader 插件與 pug-html-loader 外掛
1 | npm install --save-dev html-loader pug-html-loader |
主要安裝 html-loader 插件與 pug-html-loader 外掛,但需要注意版別。
1 2 3 | npm i html-loader // 不建議直接用安裝版本 html-loader V2.0.0 for webpack 5 npm i html-loader@0.5.5 -D // 課程範例用版本 npm i html-loader@1.3.2 -D // for webpack 4 later |
更動專案資料夾結構
在 src/ 裡多加入一個 pug 資料夾,裡面專門用來放置 .pug 檔。
loader 的設定
課程中是直接使用 loader 簡寫的部份來做 .pug 的處理,先透過 pug-html-loader 後在接著 html-loader。
1 2 3 4 | { test: /\.(pug)$/, use: ['html-loader','pug-html-loader'] }, |
但要針對 .pug 做更深入設設定,分別對應下面的二個 loader 做細部設定。
設定 pug-html-loader 與 html-loader
指定 .pug 與 .jade 可共用 pug-html-loader (本來二個副檔名所處理的轉編內容都是一樣的)。
pug-html-loader 自已的 API 有專屬轉出 .html 的設定,在 API 中透過 options: {} 可用來設定 data: {} 做為 pug 傳入的變數或資料,另外 pretty: true, 是讓輸出的 HTML 格式不處理壓成單行,會以不壓縮的方式排版,另外還有其他 pug 官方文件中的 API Reference 可對照,設定方式如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | { test: /\.(pug|jade)$/, use: [ { loader: 'html-loader', options: { minimize: false, // 壓縮 HTML efault is false }, }, { loader: 'pug-html-loader', options: { data: { myVar: 'jimmyWu', }, pretty: false, // 美化 HTML 的編排 (不壓縮 HTML 的一種) Defaults to false // inlineRuntimeFunctions: true, //default is false }, }, ], }, |
以上面的方式輸出 .pug 檔,產出的 .html 會是直接單行壓縮,需要在透過 pretty: false, 將 HTML 處理成不處理單行壓縮。
html-loader 後交由 HtmlWebpackPlugin 轉出 .html 檔的設定
使用 pug 的話,就一定只能使用 HtmlWebpackPlugin 來進行轉換,pug 無法將 HTML 轉譯後直接產出 .html 檔案,內容設定如下。
1 2 3 4 5 6 | new HtmlWebpackPlugin({ title: 'pug_pug', filename: 'pug.html', template: 'pug/pug.pug', chunks: ['pug'], }), |
輸出設定說明如下
- filename:編輯輸出到 dist 的檔名。
- template:指的是 .pug 的引入來源,是在 src/ 資料夾下的的路徑 pug/pug.pug 的檔案。
- chunks: ['pug']:是 webpack 的注入點,這裡是由 src/js/pug.js 檔中指定,會在 HTML 中的 </body> 結尾標前加上 <script src=""></script> 直接自動將注入點 .js 路徑引入使用。
使用 pug 就沒辨法和 html-webpack-plugin 使用方式一樣,取用 .html 的模版一樣,透過定義參數方式由 plugins: [] 引入使用,加入到要產出的 .html 檔裡,pug 本身就可透過 extent 的方式將共用區塊模塊化,在有共同使用的 layout 引入使用,達到方便管理與自動化的處理。
將 HtmlWebpackPlugin 編譯成 .html 檔時,透過 minify: {} 設定將 HTML 單行輸出
這裡另外提一下,在 pug-html-loader、 html-loader 與 HtmlWebpackPlugin 都有自已的 API 設定,透過 HtmlWebpackPlugin 設定是不會影響到 pug 的單行壓縮處理,處理流程是由前往後,當前面已將 HTML 處理成單行後面就可略過不處理,但如過後方有除了單行以外的設定,就需要在後方的處理流程中加入設定。
以下主要是針對 html-loader 轉編後,由 template 來源是 html/ 資料夾下的 .html 樣版設定,最後以 HtmlWebpackPlugin() 轉出 .html 檔前為主的設定,若先前已處理單行多加入也沒有差別。
但特別的設設定 removeComments: true, (刪除註解) 的部份就可以單獨在這設定,設定後會針產出的 .html 檔前的檔案,如果有加入 <!-- --> 的話,就可以透過此設定將所有的註解移除處理。
設定內容如下,主要針對由 html/template.html 產出 about.html 檔的設定,設定如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | new HtmlWebpackPlugin({ title: 'About', filename: 'about.html', template: 'html/template.html', viewport: 'width=device-width, initial-scale=1.0', // 'width=640, user-scalable=no', description: 'Webpack前端自動化開發,讓你熟悉現代前端工程師開發的方法', Keywords: 'Webpack前端自動化開發、前端、工程師、線上教學、教學範例', chunks: ['about'], minify: { collapseWhitespace: true, // 塌陷空白 removeComments: true, // 刪除註解 removeRedundantAttributes: true, // 刪除多餘的屬性 removeScriptTypeAttributes: true, // 刪除腳本類型屬性 removeStyleLinkTypeAttributes: true, // 刪除樣式鏈接類型屬性 useShortDoctype: true, // 使用簡短的文檔類型 }, }), |