html打包成app的缓存问题,webpack 独立打包与缓存处理

关于

微信公众号:前端呼啦圈(Love-FED)

个人博客:劳卜的博客

知乎专栏:前端呼啦圈

前言

先前写了一篇webpack入门的文章《webpack入门必知必会》,简单介绍了webpack拆分、打包、压缩的使用方法。本文将在上篇文章的基础上进一步讲解在使用webpack构建的项目中存在的优化方案与解决方法。javascript

上篇文章中写了一份webpack最基本的配置文件来打包压缩咱们的代码:html

var path = require('path');

module.exports = {

entry: './app/index.js',

output: {

filename: 'bundle.js',

path: path.resolve(__dirname, 'dist')

}

}复制代码

在入口文件index.js中咱们引入了jQuery:前端

// index.js

var $ = require('jquery');

var str = require('./hello.js');

function main(){

$('body').html(str);

}

main();复制代码

这样咱们虽然可以实现代码的统一打包,将jQuery、index.js、hello.js通通打包到了bundle.js里,可是会存在一个问题:每次打包都会生成一个体积较大的新bundle.js,浏览器没法缓存像jQuery这样的基本不会改动的框架库代码文件,影响加载速度。java

发现问题咱们就来解决问题,咱们最终但愿的是将像jQuery这样的框架库代码与项目自身的代码分开打包,生成一个独立的打包文件,缩减单个文件体积,浏览器也不用每次都进行加载。jquery

步骤

1.独立打包

为了解决上述问题,咱们须要修改咱们的webpack配置文件:webpack

var webpack = require('webpack');

var path = require('path');

module.exports = {

entry: {

main: './app/index.js',

vendor: ['jquery']

},

output: {

filename: '[name].js',

path: path.resolve(__dirname, 'dist')

},

plugins:[

new webpack.optimize.CommonsChunkPlugin({

name: 'vendor'

}),

]

}复制代码

上方咱们将本来的单入口文件改为了多入口文件,并加入了vendor属性。vendor属性用于配置打包第三方类库,写入数组的类库名将统一打包到一个文件里。git

同时咱们将输出的filename用[name]变量来自动生成文件名,最后咱们添加了一个CommonsChunkPlugin的插件,用于提取vendor。github

配置完成后咱们运行webpack命令:web

Hash: ee1daf95c1986768927a

Version: webpack 2.3.2

Time: 573ms

Asset Size Chunks Chunk Names

main.js 340 bytes 0 [emitted] main

vendor.js 274 kB 1 [emitted] [big] vendor

[0] ./~/jquery/dist/jquery.js 267 kB {1} [built]

[1] ./app/hello.js 53 bytes {0} [built]

[2] ./app/index.js 114 bytes {0} [built]

[3] multi jquery 28 bytes {1} [built]复制代码

最终发现咱们成功将jQuery打包到了vendor.js中,实现了独立打包,可是问题又来了:每次打包后生成的文件名都是同样的,浏览器可能缓存上一次的结果而没法加载最新数据。npm

2.添加hash

为了解决上述问题,咱们须要为打包后的文件名添加hash值,这样每次修改后打包的文件hash值将改变,修改配置文件以下:

module.exports = {

...

output: {

filename: '[name].[chunkHash:5].js',

path: path.resolve(__dirname, 'dist')

},

...

}复制代码

上方咱们在输出文件名中增长了[chunkHash:5]变量,表示打包后的文件中加入保留5位的hash值。咱们再次运行打包命令:

Hash: c7d1295f2f9a27c412d2

Version: webpack 2.3.2

Time: 603ms

Asset Size Chunks Chunk Names

main.2a7ad.js 337 bytes 0 [emitted] main

vendor.49eb4.js 274 kB 1 [emitted] [big] vendor

[0] ./~/jquery/dist/jquery.js 267 kB {1} [built]

[1] ./app/hello.js 50 bytes {0} [built]

[2] ./app/index.js 114 bytes {0} [built]

[3] multi jquery 28 bytes {1} [built]复制代码

上方咱们发现打包后的文件成功加上了hash值,这样每次修改文件后hash值也会跟着变,就不怕浏览器缓存了,可是当咱们尝试去修改一个js文件后再次打包,问题又来了:vendor.js的hash值也变了,咱们并无修改jQuery的源码。

3.修改vendor配置

上述问题产生的缘由是由于CommonsChunkPlugin插件是用于提取公共代码的,上方咱们只是提取了vendor做为公共代码。为了继续解决上述问题,其实方法很简单,咱们须要修改CommonsChunkPlugin的配置,以下:

module.exports = {

...

plugins:[

new webpack.optimize.CommonsChunkPlugin({

names: ['vendor', 'manifest']

}),

]

...

}复制代码

如此咱们修改一下hello.js中的代码,发现vendor的hash值并未改变,而且多了一个manifest.js的小文件。manifest.js为webpack的启动文件代码,它会直接影响到hash值,用mainfest单独抽出来了,这样vendor的hash就不会变了。

4.生成index.html

经过以上对webpack配置文件的一系列修改,咱们成功实现了webpack的独立打包与缓存处理,可是还差最后一步。

由于咱们最终打包后生成的文件名中带有hash值,每次都是会变的,因此咱们不能像目前这样在index.html中写死路径。

index.html

...

...复制代码

以上写法是不对的,由于缺乏了可变的hash值,所以咱们但愿每次打包后index.html中的路径也会自动加上hash值,解决方法以下:

var HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {

...

plugins:[

...

new HtmlWebpackPlugin({

title: 'demo',

template: 'index.html' // 模板路径

}),

...

]

...

}复制代码

上方咱们引入了html-webpack-plugin这一个插件,该插件能够帮助咱们根据模板生成html文件。在plugins设置中,title配置了生成html中的title部分,template为模板html的路径地址。

咱们须要下载html-webpack-plugin:

npm install html-webpack-plugin --save-dev复制代码

安装和配置完毕后,运行打包命令:webpack

Hash: 0c4b91e206579b31544d

Version: webpack 2.3.2

Time: 856ms

Asset Size Chunks Chunk Names

vendor.e1868.js 268 kB 0 [emitted] [big] vendor

main.44412.js 337 bytes 1 [emitted] main

manifest.ed186.js 5.81 kB 2 [emitted] manifest

index.html 292 bytes [emitted]

[0] ./~/jquery/dist/jquery.js 267 kB {0} [built]

[1] ./app/hello.js 50 bytes {1} [built]

[2] ./app/index.js 114 bytes {1} [built]

[3] multi jquery 28 bytes {0} [built]复制代码

咱们发如今dist目录下生成了一个index.html文件,打开该文件后代码以下:

demo

复制代码

至此咱们实现了每次打包后index.html中的路径也会自动加上hash值的功能,所以dist目录下的index.html即为之后的首页文件,最后咱们在浏览器中打开该文件成功显示:

db62135e321fb1edc99a4523c2da4a7a.png

结语

本文在webpack入门的基础上讲解了webpack独立打包与缓存处理的方式,实例代码已上传个人github,地址为:github.com/luozhihao/w…, 供参考。

若是以为本文对你有帮助,能够关注个人微信公众号,来这里聊点关于前端的事情。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【bzoj题解】1001 狼抓兔子

题目描述 现在小朋友们最喜欢"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形:左上角点为(1,1…

计算机网络宽带接入,计算机网络(宽带接入技术).ppt

计算机网络(宽带接入技术).ppt (26页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!19.90 积分计算机网络 Computer Networks第六章 宽带接入技术宽带接入技术随着通信需求的发展,居民的通…

hapi返回xml格式 微信开发 node

圈内&#xff0c;使用Koa2、express比较多&#xff0c;而我hapi使用比较多。目前在做微信公众号开发&#xff0c;要求返回数据是xml格式。 1、之前的返回&#xff0c;直接return Json2Xml: async function (request, h) {const data <xml><ToUserName>< ![CD…

html css控制优先级,css权重及优先级问题_html/css_WEB-ITnose

css权重及优先级问题几个值的对比初始值指定值计算值应用值CSS属性的 指定值 (specified value)会通过下面3种途径取得&#xff1a; 在当前文档的样式表中给这个属性赋的值&#xff0c;会被优先使用。如果在当前文档的样式表中没有给这个属性赋值&#xff0c;那么它会尝试从父元…

Hbase集群监控

Hbase集群监控 Hbase Jmx监控 监控每个regionServer的总请求数&#xff0c;readRequestsCount&#xff0c;writeRequestCount&#xff0c;region分裂&#xff0c;region合并&#xff0c;Store 数据来源&#xff1a; /jmx?qryHadoop:serviceHBase,nameRegionServer,subServer 设…

学校计算机二级模拟上机能看分数吗,全国计算机二级考试机试考完怎么储存的...

全国计算机二级考试机试考完怎么储存的以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;全国计算机二级考试机试考完怎么储存的自动储存在系统里面&#xff0c;考试结束后上传&#xff0c;分数…

宝塔面板 创建 二级域名 Unable to round-trip http request to upstream

1、我的服务器是阿里云&#xff0c;安装了宝塔面板&#xff0c;直接使用宝塔面板创建二级域名bike.caowei.wang。 2、然后就想访问了&#xff0c;对不起&#xff0c;直接给你报错Unable to round-trip http request to upstream: dial tcp: lookup bike.caowei.wang: no suc…

计算机准考证打印山东省招生教育,山东省教育招生考试院2020高考准考证打印入口:wsbm.sdzk.cn...

免费申请学习规划请选择在读年级学前小学初中高中大学留学其他已为30154位学员提供学习规划*验证码*短信验证码{"text1":{"label":"薄弱科目","placeholder":"请输入你的薄弱科目","required":1,"formType&q…

webpack-dev-server 本地文件 发布 网站 域名 根目录

我在做微信开发的时候&#xff0c;官方要求能在网站根域名下访问一下鉴权文件。说白了&#xff0c;就是根目录下可以直接访问资源。所以我们需要copy-webpack-plugin这个包。 1、首先引入 const CopyWebpackPlugin require(copy-webpack-plugin) 2、配置toType: file ne…

Java 同步器

CyclicBarrier是什么 CyclicBarrier也叫同步屏障&#xff0c;在JDK1.5被引入&#xff0c;可以让一组线程达到一个屏障时被阻塞&#xff0c;直到最后一个线程达到屏障时&#xff0c;所以被阻塞的线程才能继续执行。CyclicBarrier好比一扇门&#xff0c;默认情况下关闭状态&#…

SMB MS17-010 利用(CVE-2017-0144 )

exploit-db : https://www.exploit-db.com/exploits/42315/ 该漏洞的影响版本很广泛&#xff1a;Microsoft Windows Windows 7/8.1/2008 R2/2012 R2/2016 R2 - EternalBlue SMB Remote Code Execution (MS17-010) 具体请查看公告&#xff1a;Microsoft 安全公告 MS17-010 - 严重…