使用html-webpack-plugin对HTML文件进行预处理

这篇具有很好参考价值的文章主要介绍了使用html-webpack-plugin对HTML文件进行预处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原文地址:https://segmentfault.com/a/1190000021518323
作者:Fw恶龙
本文首发于:思否

一、前言

先整理一波之前和webpack相关的文章:

  • 使用Webpack对CSS文件进行后处理
  • 基于Webpack的CSS Sprites实现方案
  • Stylus系列——webpack-spritesmith配合stylus使用示例

继以上第三篇文章后很大程度上提高了CSS的开发效率,但是仍存在以下遗留问题:

  1. 在开发一个有多页面的项目时,CSS文件部分需要复用,部分需要各自页面引用,之前是直接打包至一个文件,目前需要修改下webpack的路径配置;
  2. 在CSS中引用的图片可以进行添加版本号、转base64等处理,而HTML中引用的CSS仍需要手动添加版本号,而且img标签的图片无法通过一系列处理;
  3. 每次开发完毕都需要人工去压缩处理图片,过程繁琐浪费时间;

为了降低和之前文章的耦合度,还有部分更新内容,故重新进行配置,和本文相关的内容会进行注释,其他配置的相关内容可以参考以上文章。

二、项目配置

1. 目录结构预览

+ node_modules      // npm install 生成
+ src               // 开发目录(自行创建)
    - index.ejs             // 用于生成index.html的模板文件
    + css
        - sprite.styl       // webpack-spritesmith生成
        - index.styl
        - function.styl     // styl个人常用函数
    + images
        - sprite.png        // webpack-spritesmith生成
        + sprite            // 雪碧图放置文件夹
            ..png
            ..png
    + js
        + index.js
+ dist              // 代码产出目录
    – index.html    // html-webpack-plugin生成
    + css
        - index.css
    + images
        - icon.png
    + js
        - index.js
        + other
            index.js
– package.json      // npm init 生成
– package-lock.json // npm install 生成
- postcss.config.js // 自行创建
– webpack.config.js // 自行创建

2. 初始化项目

npm init

3. package.json

{
    "name": "cwwebpack",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "start": "webpack --mode development"
    },
    "author": "",
    "license": "ISC",
    "devDependencies": {
        "autoprefixer": "^9.1.2",
        "clean-webpack-plugin": "^1.0.0",
        "css-loader": "^1.0.0",
        "cssnano": "^4.0.5",
        "file-loader": "^1.1.11",
        "html-webpack-plugin": "^3.2.0",
        "image-webpack-loader": "^6.0.0",
        "postcss-loader": "^3.0.0",
        "postcss-sorting": "^4.0.1",
        "stylus": "^0.54.5",
        "url-loader": "^1.1.1",
        "webpack": "^4.17.0",
        "webpack-cli": "^3.1.2",
        "webpack-spritesmith": "^0.5.4"
    },
    "dependencies": {
        "mini-css-extract-plugin": "^0.4.1",
        "stylus-loader": "^3.0.2"
    },
    "browserslist": [
        "> 1%",
        "last 2 versions",
        "not ie <= 8",
        "ios >= 8",
        "android >= 4.0"
    ]
}

4. 安装相关modules

npm install

5. webpack.config.js

var path = require('path');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CleanWebpackPlugin = require('clean-webpack-plugin');
const SpritesmithPlugin = require('webpack-spritesmith');
const HtmlWebpackPlugin = require('html-webpack-plugin');

var templateFunctionStylSprite = function(data) {
    var sharedRem = '.ico\n    display: inline-block\n    background-image: url("I")\n    background-size: Dpx Hpx'
        .replace('I', data.sprites[0].image)
        .replace('D', data.sprites[0].total_width)
        .replace('H', data.sprites[0].total_height);

    var perSpriteRem = data.sprites.map(function(sprite) {
        return '.ico-N\n    width: Wpx\n    height: Hpx\n    background-position: Xpx Ypx'
            .replace('N', sprite.name.replace(/_/g, '-'))
            .replace('W', sprite.width)
            .replace('H', sprite.height)
            .replace('X', sprite.offset_x)
            .replace('Y', sprite.offset_y);
    }).join('\n');

    return sharedRem + '\n' + perSpriteRem;
};

module.exports = {
    entry: {    // 入口文件,若有多个入口文件可以继续创建,用于解决前言中提到的第一点
        'index': __dirname + "/src/js/index.js"
    },
    output: {
        path: __dirname + "/dist", //打包后的文件存放的地方
        filename: "js/other/[name].js" //打包后输出文件的文件名
    },
    watch: true, //开启自动编译
    module: {
        rules: [{
                test: /\.styl$/,
                use: [{
                    loader: MiniCssExtractPlugin.loader,
                    options: {
                        publicPath: "../"
                    }
                }, {
                    loader: "css-loader"
                }, {
                    loader: "postcss-loader"
                }, {
                    loader: "stylus-loader"
                }]
            },
            {
                test: /\.(png|svg|jp?g|gif)$/,
                use: [{
                    loader: 'url-loader',
                    options: {
                        limit: 8192,
                        name: 'images/[name].[ext]?v=[hash:8]'
                    }
                }, {
                    loader: 'image-webpack-loader',     // 图片压缩,用于解决前言中提到的第三点
                    options: {
                        mozjpeg: {
                          progressive: true,
                          quality: 90
                        },
                        // optipng.enabled: false will disable optipng
                        optipng: {
                          enabled: true,
                        },
                        pngquant: {
                          quality: [0.90, 1.00],
                          speed: 4
                        },
                        gifsicle: {
                          interlaced: false,
                        }
                    }
                }]
            }
        ]
    },
    plugins: [
        new CleanWebpackPlugin(
            ['dist/css', 'dist/images'],
            {
                root: __dirname,
                verbose: true,
                dry: true
            }
        ),
        new SpritesmithPlugin({
            src: {
                cwd: path.resolve(__dirname, 'src/images/sprite'),
                glob: '*.png'
            },
            target: {
                image: path.resolve(__dirname, 'src/images/sprite.png'),
                css: [
                    [path.resolve(__dirname, 'src/css/sprite.styl'), {
                        format: 'function_based_template'
                    }]
                ]
            },
            customTemplates: {
                'function_based_template': templateFunctionStylSprite
            },
            apiOptions: {
                cssImageRef: '../images/sprite.png'
            },
            spritesmithOptions: {
                algorithm: 'binary-tree',
                padding: 2
            }
        }),
        new MiniCssExtractPlugin({
            filename: "css/[name].css?v=[hash:8]",
            chunkFilename: "[id].css"
        }),
        new HtmlWebpackPlugin({         // 打包html文件,用于解决前言中提到的第二点
            template:'./src/index.ejs', // 模板文件路径
            filename: 'index.html',     // 生成的文件名
            title: 'My App',            // 页面title
            chunks: ['index'],          // 需要引入的入口文件,根据entry的入口文件进行配置,会将其生成的css和js插入到模板中
            inject: false,              // 不插入生成的js文件,只是单纯的生成一个html文件,由于个人开发需求,js不需要引入,需要单独开发
            minify:{                    //压缩HTML文件,常用属性如下
                removeComments: false,                  // 移除HTML中的注释
                collapseWhitespace: false,              // 删除空白符
                preserveLineBreaks: false,              // 删除换行
                removeStyleLinkTypeAttributes: true,    // type="text/css"从style和link标签中删除
                removeScriptTypeAttributes: true        // type="text/javascript"从script标签中删除
            }
        })
    ],
};

6. postcss.config.js

module.exports = {
    plugins: [
        require('autoprefixer'),
        require('cssnano')({
            preset: 'default',
        }),
        require('postcss-sorting')({
            'properties-order': 'alphabetical'
        })
    ]
}

7. src/js/index.js

import '../css/index.styl';

8. src/css/index.styl

@import "function.styl"
@import "sprite.styl"

9. src/index.ejs

关于为何使用ejs后缀名,可以参考以下关于html-webpack-plugin属性及其配置的说明。

<!DOCTYPE html>
<html lang="zh-CN">

    <head>
        <% /* 根据webpack.config.js中的title设置标题 */ %>
        <title><%= htmlWebpackPlugin.options.title %></title>
        
        <% /* 由于个人需求,不需要插入js,只需要css */ %>
        <% for (var css in htmlWebpackPlugin.files.css) { %><link href="<%=htmlWebpackPlugin.files.css[css] %>" rel="stylesheet"><% } %>
    </head>

    <body>
        <% /* html中使用到的图片需以如下方式插入,才可进行图片的一系列处理 */ %>
        <img src="<%=require('./images/home_bg.jpg')%>" alt="" style="width: 100px;">
    </body>

</html>

10. 执行打包命令

npm start

三、html-webpack-plugin属性及其配置

  • html处理:Github|html-webpack-plugin
  • html压缩:Github|html-minifier
  • html-webpack-plugin用法全解(翻译很全)
  • html-webpack-plugin详解(有写到在ejs中自定义引用文件的方式)

四、image-webpack-loader属性及其配置

  • Github|image-webpack-loader

五、遗留问题

  • 关于html压缩html-minifier的配置,提供了可以删除空白和保留换行的配置,但是我想要保留换行的同时保持html文档结构,目前没找到处理方法。(20200408-可以使用html-beautify-webpack-plugin,后续文章会进行讲解)
  • 关于图片压缩的参数还没调整到较优的方案。

作者:Fw恶龙

原文地址:https://segmentfault.com/a/1190000021518323文章来源地址https://www.toymoban.com/news/detail-830393.html

喜欢 0

到了这里,关于使用html-webpack-plugin对HTML文件进行预处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue中webpack配置compression-webpack-plugin打包压缩和优化,terser-webpack-plugin在构建过程中对 JavaScript 代码进行压缩和优化

    参考地址:https://v4.webpack.js.org/plugins/compression-webpack-plugin/ 一、compression-webpack-plugin的使用,安装插件 二、在 webpack 配置中,require 或 import 引入 三、配置 参考地址:https://v4.webpack.js.org/plugins/terser-webpack-plugin/ 一、安装terser-webpack-plugin 二、在 Webpack 配置中引入 三、配置

    2024年04月14日
    浏览(39)
  • Vite处理html模板插件之vite-plugin-html

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 背景:项目中需要使用模板html动态处理比如 icon 、title。我的项目里是需要在不同的打包指令下,打包的结果中index.html 中title 和 icon都不一致。之前的项目使用的是 html-webpack-plugin 插件。安装该插件的

    2024年02月07日
    浏览(27)
  • 【Webpack】处理 HTML 资源

    webpack.config.js 去掉引入的 js 文件,因为 HtmlWebpackPlugin 会自动引入 此时 dist 目录就会输出一个 index.html 文件

    2024年02月22日
    浏览(30)
  • HTML - HTML中使用JS下载文本文件

    如果只希望将一些文本以文件形式保存到本地,则可以使用 a 标签 点我下载 拓展:字符串形式的DOM: 方法一中若要下载的文本中有引号,则转义起来比较麻烦。因此可以使用文件流来进行下载: 点我下载 在CSDN中可能因为无法执行JS等原因看不到效果,具体效果可以前往我

    2024年02月13日
    浏览(28)
  • 【HTML专栏2】VSCode的使用(新建HTML文件)

    本文属于HTML/CSS专栏文章,适合WEB前端开发入门学习,详细介绍HTML/CSS如果使用,如果对你有所帮助请一键三连支持,对博主系列文章感兴趣点击下方专栏了解详细。 博客主页:Duck Bro 博客主页 系列专栏:HTML/CSS专栏 关注博主,后期持续更新系列文章 如果有错误感谢大家批评

    2024年02月09日
    浏览(29)
  • Webpack5入门到原理12:处理 Html 资源

    webpack.config.js 去掉引入的 js 文件,因为 HtmlWebpackPlugin 会自动引入 此时 dist 目录就会输出一个 index.html 文件

    2024年01月23日
    浏览(62)
  • 04-webpack中使用plugin

    loader是用于特定的模块的类型转换,plugin用于执行更加广泛的任务,比如打包优化、资源管理、环境变量注入等。 CleanWebpackPlugin 用于清除之前打包的文件。npm install clean-webpack-plugin DefinePlugin DefinePlugin允许在编译时创建配置的全局常量,是一个webpack内置的插件(不需要单独安

    2024年02月09日
    浏览(30)
  • 使用bs4 分析html文件

    首先需要 pip install beautifulsoup4 安装 然后为了方便学习此插件,随便打开一个网页,然后鼠标右键,打开源网页,如下图片 这样就可以获得一个网页源码,全选复制粘贴到本地,存储为 .html 文件,后续的学习以此html文件为模版进行 如,html文件中含结构 我使用如下命令: 例

    2024年01月17日
    浏览(37)
  • 使用 puppeteer 加载 html 文件来运行 js 文件

    遇到一个需求, 在浏览器环境下来运行 js sdk 文件, 这个 js 文件是不能运行在 nodejs 环境下的; 所以通过 puppeteer 无头浏览器来运行代码获取对应的结果。 首先是安装插件 puppeteer,然后创建一个项目, 我这里是express; 这里是主要的代码。 代码解释: await page.goto(`file://${htmlPat

    2024年02月07日
    浏览(32)
  • 清理构建目标文件夹的两种方式:webpack配置选项 VS clean-webpack-plugin插件

    92. 清理构建目标文件夹的两种方式:webpack配置选项 VS clean-webpack-plugin插件 在 webpack 中, clean: true 是一项配置选项,而 clean-webpack-plugin 是一个插件。它们的作用是清理(删除)构建目标文件夹中的旧文件。 1. clean: true 配置选项: 在 webpack 的配置文件中,你可以使用 clean 配

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包