账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    webpack打包后,浏览器对文件的缓存怎么处理
    19
    0

    前端文件在进行版本更迭时,会出现浏览器缓存造成的问题,具体描述为:

    以下是我的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页面为例,生成两个版本的前端文件:
    版本1:
    filename可规定index.html页面需要引入的入口js文件名称,第一个版本可为index.html页面生成index_v1.js入口文件,index页面内其他的按需加载的文件可生成名称为[模块名].[hash].js。(hash在每次打包后会改变)。

    这时候在index.html中的body内应该是

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

    版本2:
    版本2内的index页面入口文件为index_v2.js,其中其他文件为[模块名].[hash].js

    这时候在index.html中的body内应该是

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

    两次打包后的文件名称完全不一样,但是当版本二部署后,浏览器加载index.html页面后,在控制台中显示页面引入的js文件依然是index_v1.js而不会加载index_v2.js。这时候如果刷新浏览器,那么加载的文件又变为index_v2.js。

    以上就是当前小小鄙人遇到的问题。


    对于浏览器缓存的问题,鄙人有这么点理解,简单的说:

    • 对于nginx中的文件,若文件名称不变,内容发生变化,这时候浏览器会使用缓存的文件,若文件名称发生改变,就是请求的url发生改变,相当于一个新的http请求,就会重新去请求文件。

    这样的理解应该是对的,但是对于上述遇到的问题,则让我对这个理解产生怀疑。

    另外对于图片缓存

    浏览器的缓存可以通过 cache-controlmax-ageexpires。。。,一些参数去设置,网上的一些讲解也非常明白,对于参数的理解也不是很难,但是这些参数在实际应用中确很少谈及,这些参数在那里设置呢,在html文件的 meta 标签中设置,还是在服务器中设置?一直都找不到答案。另外又如何做到对单个图片进行缓存控制呢?


    以上实际提出了两个问题:

    1. 浏览器对文件的缓存为何会造成我这样的问题,文件名更改却还会寻找上个版本的文件
    2. 浏览器缓存如何设置,图片缓存能单独设置吗?

    望各位大神指点指点,小白前端渴望得到你们答案,谢谢大家!

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 依舊悲傷落 普通会员 1楼

      Webpack打包后的文件会被打包到dist目录下,浏览器会将dist目录下的文件缓存到用户的浏览器缓存中。

      一般来说,浏览器的缓存是基于用户的设备和浏览器的特性进行的,不同设备和浏览器的缓存策略可能会有所不同。以下是一些常见的浏览器缓存策略:

      1. URL 缓存:这是最常见的缓存策略,浏览器会把URL映射到文件的本地路径,用户下次访问该URL时,浏览器会从本地路径中读取文件。

      2. 请求缓存:当用户发送请求时,浏览器会将文件的URL和内容发送给服务器,服务器返回文件的URL和内容。浏览器会在服务器返回文件的URL后,将文件的内容缓存到用户的缓存中。

      3. 静态文件缓存:对于静态文件(如CSS、JavaScript、图片等),浏览器会将这些文件的URL和内容缓存到用户的缓存中。

      如果你想让webpack打包后的文件不在浏览器的缓存中,可以使用__webpack打包后的文件名作为URL。这样,浏览器就不再将文件的URL和内容发送给服务器,而是在服务器返回文件的URL后,浏览器直接从服务器的响应中读取文件的内容。

      另外,你也可以设置--no-cache或者--no-cache-dir选项来清除浏览器的缓存,但请注意这会删除用户的缓存,所以不推荐在生产环境中使用。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部