Webpack插件之preload-webpack-plugin

3,204 阅读1分钟

1.介绍

preload-webpack-plugin插件是html-webpack-plugin插件的扩展,他可以自动获取异步js模块文件,并通过<link rel='preload'>或者<link rel='preload'>的方式引入到页面中。

  • preload: 页面加载的过程中,在浏览器开始主体渲染之前加载,适用于首屏加载;
  • prefetch: 页面加载完成后,利用空闲时间提前加载,适用于非首屏加载。

2.安装

$ npm install --save-dev preload-webpack-plugin

3.配置

1.基础配置

const PreloadWebpackPlugin = require('preload-webpack-plugin');

必须用在HtmlWebpackPlugin插件之后:

plugins: [
  new HtmlWebpackPlugin(),
  new PreloadWebpackPlugin()
]

2.配置项

as

<link>元素设置了 rel="preload" 或者 rel="prefetch" 时,可以使用as属性用来规定加载的内容的类型。

在预加载文件的时候,插件会根据每个文件的类型使用不同的as属性:

  • .css结尾,as=style;
  • .woff2结尾,as=font;
  • 其他,as=script;
<link href="xx/xx/chunk-xxx.f01555ba.css" rel="preload" as="style">

如果不希望as取自文件名的后缀,也可以使用as显示命名:

plugins: [
  new HtmlWebpackPlugin(),
  new PreloadWebpackPlugin({
    rel: 'preload',
    as: 'script'
  })
]

也可以使用一个函数来进行更细粒度的控制:

plugins: [
  new HtmlWebpackPlugin(),
  new PreloadWebpackPlugin({
    rel: 'preload',
    as(entry) {
      if (/.css$/.test(entry)) return 'style';
      if (/.woff$/.test(entry)) return 'font';
      if (/.png$/.test(entry)) return 'image';
      return 'script';
    }
  })
]

include 需要预加载的模块

有以下几个值可以选择:

  • asyncChunks:异步模块对应生成的chunk文件;
  • allChunks:所有的chunk文件(vendor, async, and normal chunks);
  • initial:entry项对应生成的chunk文件;
  • allAssets:所有chunk文件 + loaders生成的文件;
  • [文件name]:如果chunks是显示命名的,可以使用这种方式;
plugins: [
  new HtmlWebpackPlugin(),
  new PreloadWebpackPlugin({
    rel: 'preload',
    include: 'allChunks' // or 'initial', or 'allAssets'
  })
]
plugins: [
  new HtmlWebpackPlugin(),
  new PreloadWebpackPlugin({
    rel: 'preload',
    include: ['home']
  })
]

结果:

<link rel="preload" as="script" href="home.31132ae6680e598f8879.js">

fileBlacklist黑名单

1.默认值,不会加载任何sourcemaps:

new PreloadWebpackPlugin({
  fileBlacklist: [/\.map/]
})

2.其他例子:

new PreloadWebpackPlugin({
  fileBlacklist: [/.map/, /.whatever/]
})

excludeHtmlNames 需要忽略的html文件

plugins: [
  new HtmlWebpackPlugin({
    filename: 'index.html',
    template: 'src/index.html',
    chunks: ['main']
  }),
  new HtmlWebpackPlugin({
    filename: 'example.html',
    template: 'src/example.html',
    chunks: ['exampleEntry']
  }),
  // Only apply the plugin to index.html, not example.html.
  new PreloadWebpackPlugin({
    excludeHtmlNames: ['example.html'],
  })

prefetch

plugins: [
  new HtmlWebpackPlugin(),
  new PreloadWebpackPlugin({
    rel: 'prefetch'
  })
]

media

plugins: [
  new HtmlWebpackPlugin(),
  new PreloadWebpackPlugin({
    rel: 'preload',
    media: '(min-width: 600px)'
  })
]