详解webpack自动生成html页面


Posted in Javascript onJune 29, 2017

在项目中我们会不断的添加,优化代码,每次添加优化之后都需要打包进行再次上传更新。这时问题就回来了,每次打包出来js,css文件的名字都是一样的,在首页index.html的引用也不会变,这样老用户在访问这个页面时看到就会是浏览器缓存的版本,而不是最新的版本,想要看到最新版本还要进行清缓存,强制刷新,这显然是不可能的,那我们要如何解决这个问题呢?

首先有同学可能想到每次打包之后我改一下打包出来文件的名字,然后在首页index,html里面把引用代码里的文件名字也改掉就可以了,这种方法是可以的,但是每次都要改这么多,显然会很耗费时间,而且人工手动修改很可能也会带来bug。又有一位同学可能会说,不用那么麻烦,直接在上线前,在css,js资源引用的后面加一个随机数就可以了。这种方法虽然比第一种方法简单了许多,但是还是没有解决之前的问题。那么我们能不能实现每次打包完直接生成的文件后面加上一个随机字符串,然后首页里的引用也一起自动变成最新打包的文件呢?答案是可以的,接下来我将讲一下利用webpack实现

webpack实现这个功能,首先要下载一个webpack的插件html-webpack-plugin

npm install html-webpack-plugin

接下来要在羡慕里新建一个文件,这个文件就是我们要生成的首页文件的模板

//template.js
module.exports = function (templateParams) {
 return (
  `<!DOCTYPE html>
  <html>
  <head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title> ${templateParams.htmlWebpackPlugin.options.title} </title>
  <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
  <meta name="author" content=""/>
  <meta name="keywords" content="">
  <meta name="description" content="">
  <meta name="HandheldFriendly" content="true">
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta http-equiv="Cache-Control" content="no-transform">
  <meta http-equiv="Cache-Control" content="no-siteapp">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="default">
  <!--other: default, black, black-translucent-->
  <meta name="format-detection" content="telephone=no">
  </head>
  <script>
   function hasToken() {
    var result = /ztoken/g.test(document.cookie) && !(document.cookie.split('ztoken=')[1].split(';')[0] === '');
    return result
   }
   function clearCookieAll() {
    var keys = document.cookie.match(/[^ =;]+(?=\=)/g);
    if (keys) {
     for (var i = keys.length; i--;)
      document.cookie = keys[i] + '=0;expires=' + new Date(0).toUTCString()
    }
   }
   if (!hasToken()) {
    console.warn('无效token')
    clearCookieAll()
    window.location.href = '/index.html'
   }
  </script>
  <body>
  <div id="root" style="height:100%"></div>
  <!--<div>development mode</div>-->
  </body>
  </html>`
 )
}

准备工作做好了,接下来就是进行配置了

//首先引入插件
var HtmlWebpackPlugin = require('html-webpack-plugin');

界限来在配置webpack的plugins选项

plugins: [
 new HtmlWebpackPlugin({            //根据模板插入css/js等生成最终HTML
       // favicon:'./src/img/favicon.ico', //favicon路径
       filename:'src/index.html',  //生成的html存放路径,相对于 path
       template:'./src/app/template/template.js',  //html模板路径
       title: '升级空间运营后台',
       cache: true,
       inject:true,  //允许插件修改哪些内容,包括head与body
       hash:true,  //为静态资源生成hash值
       minify:{  //压缩HTML文件
         removeComments:true,  //移除HTML中的注释
          collapseWhitespace:false  //删除空白符与换行符
       }
    })
],

执行打包命令后,你会发现生成自动生了HTML代码,在index,html资源引用的地方会在资源后面自动生成一串hash值,这样每次更新之后用户就会自动获取最新资源了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
csdn 论坛技术区平均给分功能
Nov 07 Javascript
今天是星期几的4种JS代码写法
Sep 17 Javascript
jquery和ajax的关系详细介绍
Nov 29 Javascript
纯js实现遮罩层效果原理分析
May 27 Javascript
纯javascript实现简单下拉刷新功能
Mar 13 Javascript
jquery处理页面弹出层查询数据等待操作实例
Mar 25 Javascript
AngularJS单选框及多选框实现双向动态绑定
Jan 13 Javascript
学习JavaScript设计模式之中介者模式
Jan 14 Javascript
学习JavaScript设计模式之迭代器模式
Jan 19 Javascript
利用forever和pm2部署node.js项目过程
May 10 Javascript
JavaScript一元正号运算符示例代码
Jun 30 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
May 15 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
Jun 29 #Javascript
详解webpack分包及异步加载套路
Jun 29 #Javascript
JavaScript之map reduce_动力节点Java学院整理
Jun 29 #Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
Jun 29 #Javascript
JavaScript之iterable_动力节点Java学院整理
Jun 29 #Javascript
JavaScript之Map和Set_动力节点Java学院整理
Jun 29 #Javascript
JavaScript之面向对象_动力节点Java学院整理
Jun 29 #Javascript
You might like
比较全的PHP 会话(session 时间设定)使用入门代码
2008/06/05 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
2014/10/27 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
模拟用户操作Input元素,不会触发相应事件
2007/05/11 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
jQuery中:text选择器用法实例
2015/01/03 Javascript
jQuery中removeClass()方法用法实例
2015/01/05 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
学习Node.js模块机制
2016/10/17 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
Python中逗号的三种作用实例分析
2015/06/08 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
详解python列表生成式和列表生成式器区别
2019/03/27 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
html5 学习简单的拾色器
2010/09/03 HTML / CSS
String是最基本的数据类型吗?
2013/06/13 面试题
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
2015/09/11 面试题
自我鉴定注意事项
2014/01/19 职场文书
紧急通知
2015/04/17 职场文书
2015年仓库管理员工作总结
2015/04/21 职场文书
初中班主任培训心得体会
2016/01/07 职场文书
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL
js前端图片加载异常兜底方案
2022/06/21 Javascript