Skip to content

A simple, flexible and fast html webpack plugin support multiple htmls

License

Notifications You must be signed in to change notification settings

zaaack/htmls-webpack-plugin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

htmls-webpack-plugin

Build Status npm npm

Simple, flexible and fast html webpack plugin.

NOTE: v2 support webpack5, if you still using webpack4, please install [email protected]

Features

  • Simple and flexisble, you can almost controll anything of generate htmls, no need of setup lots of plugins.
  • Support multiple htmls by default
  • Fast, almost 20x faster then html-webpack-plugin for 20+ pages.
  • Rendered via fast & small template engine ejs by default(you can customize via render function to use any template engine or just inject script tags string to the html body).

Install

npm i -D htmls-webpack-plugin

Usage

Options

const HtmlsWebpackPlugin = require('htmls-webpack-plugin')

module.exports = {
    plugins: [
        new HtmlsWebpackPlugin({
             // optional, hooks
            beforeEmit: (compilation, compiler) => void,
             // optional, hooks
            afterEmit: (compilation, compiler) => void,
             // optional, default is ejs. custom template rendering function, support async rendering,
            render: (src: string, params: Params) => string | Promise<string>,
            htmls: [{
                // required, template path
                src: './index.ejs',
                // required, string | ((source, src, params) => string),
                // output filename,
                // relative to output path,
                // can be a function to generate via context
                filename: 'index.html',
                // optional, override global render function
                render: (src: string, params: Params) => string | Promise<string>,
                // optional, override global flushOnDev
                flushOnDev: boolean | string
                // optional, custom params when rendering
                params: () => object | () => Promise<object> | object
                // optional, transformParams, override global transformParams
                transformParams?: (params: Params) => Params & { [k: string]: any }
            }],

             /* boolean | string, optional, flush html files to output folder, can be a string file path, useful for debug or devServer. */
            flushOnDev: false,

             /* optional, override webpackConf's publicPath */
            publicPath: function | string',

            // optional, custom params when rendering, could be an async function
            params: () => object | () => Promise<object> | object

            // optional, transform template variables
            transformParams?: (params: Params) => Params & { [k: string]: any }
        })
    ]
}

ejs template example

<!-- index.ejs -->
<body>
    <% for (let js in entries) {%>
        <script src="<%= js %>"></script>
    <% } %>
</body>

Available variables in html templates:

interface Params {
  entries: string[] // all entrypoints
  files: string[] // all files
  jses: string[] // all files ends with .js
  csses: string[] // all files ends with .css
  options: Props // plugin props
  compilation: Compilation // webpack compilation
  [k: string]: any // custom params via options
}

Minify html

  1. install html-minifier
yarn add -D html-minifier
  1. minify your html inrender function
const HtmlsWebpackPlugin = require('htmls-webpack-plugin')
const htmlMinifier = require('html-minifier')
const ejs = require('ejs')

// webpack.config.js
module.exports = {
    ...,
    plugins: [
        new HtmlsWebpackPlugin({
            htmls: [{
                src: './fixtures/index.ejs',
                filename: `index.html`,
                async render(src, params) {
                    let html = await ejs.renderFile(src, params, { async: true })
                    return require('html-minifier').minify(html)
                }
            }],
        })
    ]
}

Example in tests

index.test.ts

Why not html-webpack-plugin

html-webpack-plugin is really hard to extends and slow for multiple htmls, too much complete features that I don't need. That's why I create this.

License

MIT