在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML5  HTML/ webpack打包后,瀏覽器對(duì)文件的緩存怎么處理

webpack打包后,瀏覽器對(duì)文件的緩存怎么處理

前端文件在進(jìn)行版本更迭時(shí),會(huì)出現(xiàn)瀏覽器緩存造成的問(wèn)題,具體描述為:

以下是我的webpack配置
module.exports = {
    entry: {
        dashboard: "./dev/CloudPlatform/index.js",
        logIn: "./dev/CloudPlatform/login.js",
        archives: "./dev/Archives/archives.js",
        "404": "./dev/ERROR/404.js",
        activateRP: "./dev/CloudPlatform/activateRP.js"
    },
    output: {
        path: path.resolve(__dirname, "build/js"),
        publicPath: "/js/",
        chunkFilename: "[name].[hash].js",
        filename: "[name]_v5.js"
    },
    externals: {
        jquery: "$",
        react: "React",
        "react-dom": "ReactDOM",
        "react-router": "ReactRouter"
    },
    plugins: [
        new webpack.DefinePlugin({
            "process.env.NODE_ENV": JSON.stringify("production")
        }),
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false,
                drop_debugger: true,
                drop_console: true
            },
            comments: false
        })
    ],
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /(node_modules|bower_components)/,
                use: {
                    loader: "babel-loader",
                    options: {
                        presets: ["es2015", "react"],
                        plugins: [
                            "transform-object-rest-spread",
                            "transform-class-properties"
                        ]
                    }
                }
            },
            {
                test: /\.css$/,
                use: [
                    "style-loader",
                    {
                        loader: "css-loader",
                        options: {
                            importLoader: 1
                        }
                    },
                    {
                        loader: "postcss-loader",
                        options: {
                            ident: "postcss",
                            plugins: loader => [
                                require("autoprefixer")({
                                    browsers: [
                                        ">1%",
                                        "last 4 versions",
                                        "Firefox ESR",
                                        "not ie < 9" // React doesn't support IE8 anyway
                                    ],
                                    flexbox: "no-2009"
                                })
                            ]
                        }
                    }
                ]
            },
            {
                test: /\.less$/,
                use: [
                    "style-loader",
                    "css-loader",
                    {
                        loader: "postcss-loader",
                        options: {
                            ident: "postcss",
                            plugins: loader => [
                                require("autoprefixer")({
                                    browsers: [
                                        ">1%",
                                        "last 4 versions",
                                        "Firefox ESR",
                                        "not ie < 9" // React doesn't support IE8 anyway
                                    ],
                                    flexbox: "no-2009"
                                })
                            ]
                        }
                    },
                    "less-loader"
                ]
            },
            {
                test: /\.(png|svg|jpg|gif)$/,
                use: [
                    {
                        loader: "url-loader",
                        options: {
                            limit: 8192,
                            name: "../images/[name].[ext]"
                        }
                    },
                    {
                        loader: "image-webpack-loader",
                        options: {
                            progressive: true,
                            optimizationLevel: 7,
                            interlaced: false,
                            pngquant: {
                                quality: "65-90",
                                speed: 4
                            }
                        }
                    }
                ]
            },
            {
                test: /\.(woff|woff2|svg|eot|ttf)\??.*$/,
                use: [
                    {
                        loader: "file-loader",
                        options: {
                            name: "../font/[name].[ext]"
                        }
                    }
                ]
            }
        ]
    }
};

以index.html頁(yè)面為例,生成兩個(gè)版本的前端文件:
版本1:
filename可規(guī)定index.html頁(yè)面需要引入的入口js文件名稱,第一個(gè)版本可為index.html頁(yè)面生成index_v1.js入口文件,index頁(yè)面內(nèi)其他的按需加載的文件可生成名稱為[模塊名].[hash].js。(hash在每次打包后會(huì)改變)。

這時(shí)候在index.html中的body內(nèi)應(yīng)該是

<body>
    <div id="index"></div>
    <script src="/js/index_v1.js"></script>
</body>

版本2:
版本2內(nèi)的index頁(yè)面入口文件為index_v2.js,其中其他文件為[模塊名].[hash].js

這時(shí)候在index.html中的body內(nèi)應(yīng)該是

<body>
    <div id="index"></div>
    <script src="/js/index_v2.js"></script>
</body>

兩次打包后的文件名稱完全不一樣,但是當(dāng)版本二部署后,瀏覽器加載index.html頁(yè)面后,在控制臺(tái)中顯示頁(yè)面引入的js文件依然是index_v1.js而不會(huì)加載index_v2.js。這時(shí)候如果刷新瀏覽器,那么加載的文件又變?yōu)閕ndex_v2.js。

以上就是當(dāng)前小小鄙人遇到的問(wèn)題。


對(duì)于瀏覽器緩存的問(wèn)題,鄙人有這么點(diǎn)理解,簡(jiǎn)單的說(shuō):

  • 對(duì)于nginx中的文件,若文件名稱不變,內(nèi)容發(fā)生變化,這時(shí)候?yàn)g覽器會(huì)使用緩存的文件,若文件名稱發(fā)生改變,就是請(qǐng)求的url發(fā)生改變,相當(dāng)于一個(gè)新的http請(qǐng)求,就會(huì)重新去請(qǐng)求文件。

這樣的理解應(yīng)該是對(duì)的,但是對(duì)于上述遇到的問(wèn)題,則讓我對(duì)這個(gè)理解產(chǎn)生懷疑。

另外對(duì)于圖片緩存

瀏覽器的緩存可以通過(guò) cache-control,max-age,expires。。。,一些參數(shù)去設(shè)置,網(wǎng)上的一些講解也非常明白,對(duì)于參數(shù)的理解也不是很難,但是這些參數(shù)在實(shí)際應(yīng)用中確很少談及,這些參數(shù)在那里設(shè)置呢,在html文件的 meta 標(biāo)簽中設(shè)置,還是在服務(wù)器中設(shè)置?一直都找不到答案。另外又如何做到對(duì)單個(gè)圖片進(jìn)行緩存控制呢?


以上實(shí)際提出了兩個(gè)問(wèn)題:

  1. 瀏覽器對(duì)文件的緩存為何會(huì)造成我這樣的問(wèn)題,文件名更改卻還會(huì)尋找上個(gè)版本的文件
  2. 瀏覽器緩存如何設(shè)置,圖片緩存能單獨(dú)設(shè)置嗎?

望各位大神指點(diǎn)指點(diǎn),小白前端渴望得到你們答案,謝謝大家!

回答
編輯回答
久不遇

樓主解決了嗎,我也遇到同樣的問(wèn)題

2017年8月28日 10:23
編輯回答
你好胸
  • 問(wèn)題1. 瀏覽器對(duì)文件的緩存為何會(huì)造成我這樣的問(wèn)題,文件名更改卻還會(huì)尋找上個(gè)版本的文件?
    首先你要確定幾個(gè)情況

    1. 服務(wù)端有沒(méi)有做負(fù)載均衡?如果做了負(fù)載均衡,發(fā)版本又只發(fā)了其中幾臺(tái)機(jī)器(沒(méi)有全部機(jī)器都發(fā)布),那么負(fù)載均衡的機(jī)制就會(huì)導(dǎo)致你這個(gè)問(wèn)題,瀏覽器訪問(wèn)到不同機(jī)器的代碼,不同機(jī)器上的代碼有些機(jī)器的是版本1的,有些卻是版本2的。
    2. 如果不是負(fù)載均衡的問(wèn)題,那可能是按需加載的hash問(wèn)題了,確定瀏覽器已經(jīng)成功加載404_v2.js了,并且有用到CommonsChunkPlugin么? 如果用了,CommonsChunkPlugin對(duì)應(yīng)的js文件必須要有hash,不然就會(huì)導(dǎo)致CommonsChunkPlugin的js文件訪問(wèn)的是緩存的文件,從而去訪問(wèn)老版本文件。
  • 問(wèn)題2 瀏覽器緩存如何設(shè)置,圖片緩存能單獨(dú)設(shè)置嗎?
    瀏覽器緩存要在服務(wù)端設(shè)置響應(yīng)頭等信息,圖片緩存能單獨(dú)設(shè)置,不過(guò)一般都是整體設(shè)置緩存。

為了更全面認(rèn)知問(wèn)題,最好還是把 webpack 配置全放上來(lái)

2017年10月3日 09:17