非常教程

Webpack参考手册

装载 | Loaders

html-loader

将 HTML 导出为字符串。当编译器要求时,HTML 被最小化。

安装

npm i -D html-loader

用法

默认情况下,每个本地的 <img src="image.png"> 都需要通过 require (require('./image.png'))来进行加载。你可能需要在配置中为图片指定 loader(推荐 file-loaderurl-loader

你可以通过查询参数 attrs,来指定哪个标签属性组合(tag-attribute combination)应该被此 loader 处理。传递数组或以空格分隔的 <tag>:<attribute> 组合的列表。(默认值:attrs=img:src

如果你使用了<custom-elements>,而且它们中的很多都使用了一个custom-src属性,你不必指定每个组合<tag>:<attribute>:只需指定一个空标签attrs=:custom-src就可以匹配每个元素。

{
  test: /\.(html)$/,
  use: {
    loader: 'html-loader',
    options: {
      attrs: [':data-src']
    }
  }
}

要完全禁用标记属性处理(例如,如果您在客户端处理图像加载),则可以传入attrs=false

例子

有了这个配置:

{
  module: {
    rules: [
      { test: /\.jpg$/, use: [ "file-loader" ] },
      { test: /\.png$/, use: [ "url-loader?mimetype=image/png" ] }
    ]
  },
  output: {
    publicPath: "http://cdn.example.com/[hash]/"
  }
}
<img src="image.png" data-src="image2x.png" >
require("html-loader!./file.html");

// => '<img src="http://cdn.example.com/49eba9f/a992ca.png"
//         data-src="image2x.png">'
require("html-loader?attrs=img:data-src!./file.html");

// => '<img src="image.png" data-src="data:image/png;base64,..." >'
require("html-loader?attrs=img:src img:data-src!./file.html");
require("html-loader?attrs[]=img:src&attrs[]=img:data-src!./file.html");

// => '<img  src="http://cdn.example.com/49eba9f/a992ca.png"        
//           data-src="data:image/png;base64,..." >'
require("html-loader?-attrs!./file.html");

// => '<img  src="image.jpg"  data-src="image2x.png" >'

通过运行 webpack --optimize-minimize 来最小化

'<img src=http://cdn.example.com/49eba9f/a9f92ca.jpg
      data-src=data:image/png;base64,...>'

或者在 webpack.conf.js 的 rule 选项中指定 minimize 属性

module: {
  rules: [{
    test: /\.html$/,
    use: [ {
      loader: 'html-loader',
      options: {
        minimize: true
      }
    }],
  }]
}

默认启用的最小化规则有以下几种:

  • removeComments
  • removeCommentsFromCDATA
  • removeCDATASectionsFromCDATA
  • collapseWhitespace
  • conservativeCollapse
  • removeAttributeQuotes
  • useShortDoctype
  • keepClosingSlash
  • minifyJS
  • minifyCSS
  • removeScriptTypeAttributes
  • removeStyleTypeAttributes

您可以使用以下选项禁用规则 webpack.conf.js

module: {
  rules: [{
    test: /\.html$/,
    use: [ {
      loader: 'html-loader',
      options: {
        minimize: true,
        removeComments: false,
        collapseWhitespace: false
      }
    }],
  }]
}

对于以 / 开头的 url,默认行为是不转换它们。 如果设置了 root 查询参数,它将被添加到 URL 之前,然后进行转换。

采用与上述相同的配置:

<img src="/image.jpg">
require("html-loader!./file.html");

// => '<img  src="/image.jpg">'
require("html-loader?root=.!./file.html");

// => '<img  src="http://cdn.example.com/49eba9f/a992ca.jpg">'

插值

您可以使用interpolate标志为 ES6模板字符串启用插值语法,如下所示:

require("html-loader?interpolate!./file.html");
<img src="${require(`./images/gallery.png`)}">

<div>${require('./components/gallery.html')}</div>

如果你只想在模板中使用 require,任何其它的 ${} 不被转换,你可以设置 interpolate 标记为 require,就像这样:

require("html-loader?interpolate=require!./file.ftl");
<#list list as list>
  <a href="${list.href!}" />${list.name}</a>
</#list>

<img src="${require(`./images/gallery.png`)}">

<div>${require('./components/gallery.html')}</div>

导出格式

有不同的导出格式可用:

  • module.exports(默认,cjs格式)。“Hello world”变成了module.exports = "Hello world";
  • exports.default(当exportAsDefaultparamt被设置时,es6to5t格式)。“ hello world ”变成了exports.default = "Hello world";
  • export default(当exportAsEs6Defaultparamt被设置时,es6t格式)。“hello world ”变成了export default "Hello world";

高级选项

如果你需要传递更多高级选项,特别是那些不能被字符串化,你还可以在 webpack.config.js 中定义一个 htmlLoader 属性:

var path = require('path')

module.exports = {
  ...
  module: {
    rules: [
      {
        test: /\.html$/,
        use: [ "html-loader" ]
      }
    ]
  },
  htmlLoader: {
    ignoreCustomFragments: [/\{\{.*?}}/],
    root: path.resolve(__dirname, 'assets'),
    attrs: ['img:src', 'link:href']
  }
};

如果你需要定义两个不同的 loader 配置,你也可以通过 html-loader?config=otherHtmlLoaderConfig 改变配置的属性名:

module.exports = {
  ...
  module: {
    rules: [
      {
        test: /\.html$/,
        use: [ "html-loader?config=otherHtmlLoaderConfig" ]
      }
    ]
  },
  otherHtmlLoaderConfig: {
    ...
  }
};

导出到 HTML 文件

一个很常见的场景,将 HTML 导出到 .html 文件中,直接访问它们,而不是使用 javascript 注入。这可以通过3个 loader 的组合来实现:

  • file-loader
  • extract-loader
  • html-loader

html-loader 将解析 URL,并请求图片和你所期望的一切资源。extract-loader 会将 javascript 解析为合适的 html 文件,确保引用的图片指向正确的路径,file-loader 将结果写入 .html 文件。示例:

{
  test: /\.html$/,
  use: [ 'file-loader?name=[path][name].[ext]!extract-loader!html-loader' ]
}