html-webpack-plugin 加载 .pug 文件需配置 pug-html-loader 或 pug-loader,推荐 pug-html-loader 并在 module.rules 中指定 options.data 传参,注意路径解析需统一用 webpack alias 避免 ci 环境报错。

html-webpack-plugin 怎么加载 .pug 模板文件
默认情况下,html-webpack-plugin 不认识 .pug 文件,直接写 template: "src/index.pug" 会报错:Error: Cannot find module 'src/index.pug'。必须显式告诉它用哪个 loader 去处理。
推荐方式是通过 Webpack 的 module.rules 统一注册 pug-loader 或 pug-html-loader:
- 用
pug-loader:输出的是编译后的 HTML 字符串,适合配合html-webpack-plugin直接作为模板源 - 用
pug-html-loader:更轻量,专为 HTML 输出设计,支持data传参,且与raw-loader链式调用更自然 - 避免混用:项目里同时配了
pug-loader和pug-html-loader容易因优先级冲突导致某类.pug文件被错误处理
pug-html-loader 和 pug-loader 的关键区别
pug-html-loader 是专为 html-webpack-plugin 场景优化的 loader,而 pug-loader 更偏向通用 JS 模块导入(比如 import html from "./tpl.pug")。
两者在参数和行为上差异明显:
-
pug-html-loader默认返回 HTML 字符串;pug-loader默认返回一个函数(需调用才得 HTML),除非加exportType: "string" -
pug-html-loader支持直接传入data对象,如{ data: { title: "首页" } },模板内可直接用#{title} -
pug-loader的pretty选项只影响开发时输出格式,不影响构建体积;pug-html-loader默认不美化,加pretty: true会增大 HTML 文件体积 - 若模板中用了
include或extends,两个 loader 都能解析,但路径解析逻辑略有不同——pug-html-loader更严格遵循 Webpack 的resolve.alias和modules
模板里怎么传动态数据给 Pug
html-webpack-plugin 本身支持 templateParameters,但这个参数对 Pug 模板无效;真正起作用的是 loader 层的 data 配置。
正确做法是在 Webpack rule 中指定 options.data:
module.exports = {
module: {
rules: [{
test: /\.pug$/,
use: [{
loader: 'pug-html-loader',
options: {
data: {
title: '后台管理系统',
version: process.env.VERSION || '1.0.0'
}
}
}]
}]
}
};
这样你在 src/index.pug 里就能直接写:title #{title} - v#{version}。注意:变量名不能含大写字母或特殊符号,否则 Pug 编译会失败。
- 环境变量建议提前注入,避免在模板里写
process.env.NODE_ENV—— Pug 不执行 JS,只做字符串替换 - 如果需要运行时动态数据(比如后端注入),应改用服务端渲染,Webpack 构建阶段无法获取
- 多个页面共用同一套数据?把
data提到配置顶层,用plugins里多个HtmlWebpackPlugin实例分别指定template即可
为什么本地跑通了,CI 构建却报错 “Cannot resolve ‘./header.pug’”
这是最常踩的坑:Pug 的 include 路径在不同 loader 下解析规则不一致,尤其当 include 用相对路径(如 include ../layouts/header)时,pug-loader 和 pug-html-loader 对“当前目录”的认定可能不同。
根本原因是 Webpack 的 resolve.modules 和 resolve.alias 不会被 Pug 原生识别,必须靠 loader 显式桥接:
- 统一用绝对路径写法:
include @/components/header,并在 Webpack 中配好alias: { "@": path.resolve(__dirname, "src") } - 禁用 Pug 自带的路径解析,强制走 Webpack:
pug-html-loader加noPretty: true+resolve: false(部分版本支持) - CI 环境缺少
node_modules/pug?确保pug是dependencies(不是devDependencies),因为pug-html-loader运行时依赖它
Pug 模板的路径解析不是纯字符串拼接,而是依赖 loader 对 Webpack resolver 的封装程度——这点容易被忽略,但恰恰是跨环境失败的主因。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











