V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
FreeBSD
V2EX  ›  问与答

淘宝百度等网站 js 的版本升级后,如果 IE 没有手动清除缓存,是如何保证浏览器上的 js 新版本的?

  •  
  •   FreeBSD · 2014-09-15 09:33:50 +08:00 · 4661 次点击
    这是一个创建于 3714 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚接触前端,最近做一个项目,页面变化巨大。老版本升级到新版本后,页面部分js/css没有更新。
    页面出现和诡异的情况。
    19 条回复    2014-09-15 19:13:01 +08:00
    jsonline
        1
    jsonline  
       2014-09-15 09:36:43 +08:00 via Android
    1. a.js?t=20140915
    2. a.js -> 47A246-a.js
    jsonline
        2
    jsonline  
       2014-09-15 09:37:22 +08:00 via Android
    3 去掉 last modified
    B33A91OoN0SXv9xX
        3
    B33A91OoN0SXv9xX  
       2014-09-15 09:38:45 +08:00
    Internet选项,常规,浏览历史,设置,每次访问网页时刷新
    是这个意思吗?
    FreeBSD
        4
    FreeBSD  
    OP
       2014-09-15 09:39:38 +08:00
    @jsonline 是说最后到浏览器上的js名字叫47A246-a.js,那页面上引用这个js的地方也需要修改?
    FreeBSD
        5
    FreeBSD  
    OP
       2014-09-15 09:40:48 +08:00
    @wanglongbiao2010 对手动清除是这个意思。但用户不希望每次升级版本都手动清除。
    FreeBSD
        6
    FreeBSD  
    OP
       2014-09-15 09:41:40 +08:00
    @jsonline 能否稍微详细点说?
    jsonline
        7
    jsonline  
       2014-09-15 09:53:58 +08:00 via Android
    你首先要弄清楚浏览器会缓存哪些文件。
    你使用方法1就行了,在更新的文件后面加时间戳。
    手机,详细不了。
    daxingplay
        8
    daxingplay  
       2014-09-15 10:51:14 +08:00
    淘宝用的是版本号,比如x.x.x/xxx.js这种
    oott123
        9
    oott123  
       2014-09-15 11:08:26 +08:00 via Android
    verhash 吧。
    在引用前端文件的时候就要加上版本号,你可以选择后端渲染的时候函数、改模板文件,改 gulpfile/gruntfile 来实现。
    qsun
        10
    qsun  
       2014-09-15 11:14:48 +08:00
    这是我们的


    ```
    class Assets {
    /* For static file */
    public static function url($asset_filename) {
    if (App::environment('local', 'testing')) {
    return $asset_filename;
    } else {
    return Config::get('app.cdn_url') . '/assets/' . md5(file_get_contents(app_path() . '/../public/' . $asset_filename)) . $asset_filename;
    }
    }
    }
    ```

    生成的话会这样的URL http://static.haifanghui.com/assets/4a5c1dc6d1c0b45b96bdff0a38860bbf/build/all.min.css
    Phariel
        11
    Phariel  
       2014-09-15 11:36:07 +08:00 via Android   ❤️ 1
    x.x.x/built.js
    built.js?version=x.x.x
    第一种好一些,grunt做起来方便
    FreeBSD
        12
    FreeBSD  
    OP
       2014-09-15 11:42:47 +08:00
    @Phariel 那是不是说每次修改js的时候需要去同时修改这个版本号?第一种是否只单纯改前台的代码?
    likuku
        13
    likuku  
       2014-09-15 12:03:43 +08:00
    @FreeBSD 只想说你的用户 ID ....乍看还以为是在 freebsd 板块问 js 问题。
    imn1
        14
    imn1  
       2014-09-15 12:06:31 +08:00
    解决方案楼上都写了,我就不再重复了

    http://bbs.kafan.cn/forum.php?mod=viewthread&tid=1744552&extra=page%3D3%26filter%3Dtypeid%26typeid%3D720
    我在卡饭写的东西,里面写了网页reload/refresh的几种方式区别,和一个扩展(修改)

    可以自己再google进一步了解header和浏览器缓存的关系,可以在后台发送header控制浏览器缓存
    这个对于做前端的你可能比较困难,一般除非项目把js/css也纳入版本控制,否则后台都不管这事,权当涨姿势吧
    cxe2v
        15
    cxe2v  
       2014-09-15 12:42:55 +08:00
    一楼是常见的方法之一,之前研究一个网站的时候就发现这个方法了,当时还不明白怎么回事
    cougar
        16
    cougar  
       2014-09-15 13:12:21 +08:00
    参数版本号最简单
    jevonszmx
        17
    jevonszmx  
       2014-09-15 13:17:59 +08:00
    最简单就是时间戳,每次静态文件改动,前台html中时间戳变一下就好了
    tinyhill
        18
    tinyhill  
       2014-09-15 19:09:31 +08:00
    两种策略:

    1. 时间戳或版本参数,如 aaa/xxx.css?t=20140915.css
    2. 时间戳或版本目录,如 aaa/20140915/xxx.css
    Phariel
        19
    Phariel  
       2014-09-15 19:13:01 +08:00 via Android
    @FreeBSD 要用一个server handler来承载你加载js和css的页面,里面用从服务器获取的版本号变量来控制你加载的url组成,这个值和你版本号的文件夹保持一致。或者用grunt打包成release版本的过程中,把页面上的特定版本号tag replace成版本号,一个是运行时解释,一个是编译时解释。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5208 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:32 · PVG 17:32 · LAX 01:32 · JFK 04:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.