日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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即為之后的首頁文件,最后咱們在瀏覽器中打開該文件成功顯示:

結語

本文在webpack入門的基礎上講解了webpack獨立打包與緩存處理的方式,實例代碼已上傳個人github,地址為:github.com/luozhihao/w…, 供參考。

若是以為本文對你有幫助,能夠關注個人微信公眾號,來這里聊點關于前端的事情。

總結

以上是生活随笔為你收集整理的html打包成app的缓存问题,webpack 独立打包与缓存处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。