@qgy18 贵站怎么做的优化啊,速度快到哭 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaodaigou
V2EX    前端开发

@qgy18 贵站怎么做的优化啊,速度快到哭

  •  
  •   xiaodaigou 2016-01-30 00:33:24 +08:00 6118 次点击
    这是一个创建于 3552 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://imququ.com/
    求贵站优化方案,快到哭!!!
    @qgy18
    @qgy18
    @qgy18

    30 条回复    2016-01-31 01:44:06 +08:00
    yangqi
        1
    yangqi  
       2016-01-30 00:35:33 +08:00
    Powered by ThinkJS 2.1
    qgy18
        2
    qgy18  
       2016-01-30 00:37:22 +08:00 via iPhone   12
    https://imququ.com/post/summary-of-my-blog-optimization.html
    其实还有好多蛋疼的策略,但我今天头疼得厉害,明天如果好了再来补充!
    wdlth
        3
    wdlth  
       2016-01-30 00:39:52 +08:00
    看起来是把页面全缓存上了。
    hienchu
        4
    hienchu  
       2016-01-30 00:42:08 +08:00 via iPhone
    我觉得载入的动画效果很巧妙
    yangqi
        5
    yangqi  
       2016-01-30 00:44:36 +08:00
    all_js 和 all_css 缓存在 localStorage 效果还是很明显的
    huangtao728
        6
    huangtao728  
       2016-01-30 00:45:17 +08:00 via iPad
    @hienchu 有载入动画?
    abcfyk
        7
    abcfyk  
       2016-01-30 00:55:19 +08:00
    这个好玩。谢谢推荐。值得研究一下。
    hienchu
        8
    hienchu  
       2016-01-30 00:59:21 +08:00 via iPhone
    @huangtao728 貌似是 ios safari 效果,重新打开就没了
    xiaodaigou
        9
    xiaodaigou  
    OP
       2016-01-30 01:07:46 +08:00
    哈哈,瞬间好多回复 - -
    huangtao728
        10
    huangtao728  
       2016-01-30 01:09:01 +08:00 via iPad
    @hienchu 快得即使有动画也看不到
    finab
        11
    finab  
       2016-01-30 01:13:06 +08:00 via iPhone
    真的好快啊,不像请求了数据的样子
    aivier
        12
    aivier  
       2016-01-30 08:24:58 +08:00
    看了下 js 和 css 是 localStorage ,如果要更新,不能很方便的通知客户端又更新吧?用 Cookie 的话对缓存又不是很好
    我自己用的是 WordPress+自己以前写的主题,没什么图片,文章图片也不大,感觉如果服务器不抽的话速度对于访客来说还是可以接受的,比一般人的要快一些吧~
    折腾?好久没折腾了,过段时间优化下自己的图床
    Bryan0Z
        13
    Bryan0Z  
       2016-01-30 08:49:12 +08:00 via Android
    我去…真快
    iTakeo
        14
    iTakeo  
       2016-01-30 08:59:55 +08:00 via iPhone
    @aivier 使用 localstorage 更新也很简单啊,重新写入一遍就行了
    denghongcai
        15
    denghongcai  
       2016-01-30 09:32:58 +08:00
    只要不放在国外,这速度还是挺正常的吧……
    qgy18
        16
    qgy18  
       2016-01-30 10:18:44 +08:00 via iPhone   1
    @aivier 可以更新的,我有 cookie 记录资源当前的版本。你清除那个名为 v 的 cookie ,或者改一下它的值,服务端就会内联输出全量资源了。
    我的博客用的是比较老的方案,所有资源共享一个版本,因为我的资源个数少,也不经常变动。我们的业务中用的是改进后的方案,每个资源都有单独的版本,资源名一个字节,版本号一个字节,用 70 进制确保总体上 cookie 不会太长。
    总的来说,资源存 localstorage 有很多细节要处理,例如如何保证在 cookie 被禁用 / localstorage 被禁用 / localstorage 被写满 / cookie 中的版本号存在,但 localstorage 丢失等等情况下都能正常工作。
    另外, js 代码存在 localstorage 还有一个风险:如果网站有 xss ,可以修改用户 localstorage ,导致 xss 生效时间被拉长。这个问题我也解决了,大家可以改下我博客 all_js 那个 localstorage 内容,不会生效的(仅限最新的 chrome 和 firefox 下)。
    手机打字太累,先写这么多。
    chemzqm
        17
    chemzqm  
       2016-01-30 10:33:41 +08:00   1
    这种代码放 localstorage 的做法会有很多弊端:
    1. 首次访问用户需要重新加载两次页面
    2. 浏览器无法并发请求 css Javascript 资源,如果使用 http2 的话加载速度应该会下降
    3. 灵活性很受限制,例如不同页面使用不同 css js 资源
    4. 调试麻烦,还要考虑更新的策略
    5. css 也放 localstorage 会导致禁用 js 用户无法获得 css
    aliuwr
        18
    aliuwr  
       2016-01-30 10:36:05 +08:00
    @qgy18 光是支持 PubSubHubbub 我就要点个赞。 V 站就迟迟没有这个并不复杂的功能。
    qgy18
        19
    qgy18  
       2016-01-30 11:05:06 +08:00   2
    @chemzqm
    1 、为什么首次访问用户需要重新加载两次页面?这个难以想象,如果有这种严重问题,这个方案如何能发布上线。

    2 、这个方案我们业务中只针对移动端使用。你也可以看到百度 / 神马移动搜索都采用了这个方案。这是移动端头部外链对性能影响特别大,会显著增加白屏时间。所以一般在移动端,宁可将资源完全内联来牺牲缓存,也不会在头部引入外链。 HTTP/2 的调研一直在做,但是在移动端普及还不理想,尤其是在 Android 端,只有 Chrome 47 才支持,随着时间的推移,优化手段也会随之改进的。对了, HTTP/2 的 Server Push 就是用来解决资源内联的问题,但 Server Push 也不是没有弊端,具体可以看我这几篇文章:
    https://imququ.com/post/http2-and-wpo-1.html
    https://imququ.com/post/server-push-in-http2.html
    https://imququ.com/post/cache-aware-server-push-in-h2o.html
    https://imququ.com/post/golomb-coded-sets.html

    3 、前面说过,我们业务中实际的方案,如果 A 页面在 localStorage 中存放了 1 、 2 两个资源; B 页面需要 1 、 2 、 3 三个资源时,服务端只会输出 3 这个资源的全量内联。因为我们有高度压缩的 cookie 来存放资源标识及对应版本信息。

    4 、确实,从字符串 eval / new Function 执行的代码不好调试。但我们有参数,禁用所有 localStorage 策略,这时候页面资源就跟普通内联没区别了。

    5 、我们业务中有 noscript 标签,如果禁用 cookie ,会跳转到极速版极速版不需要任何 JS 就可以工作得很好因为我们正常版禁用了 JS ,就算 css 能加载也基本无法使用,交互太多了。

    我的博客是我的试验田,我用在我博客中的策略并不一定适合用在业务中这个我之前多次强调过。

    而在业务中是否启用某个策略,需要更完善的考虑、数据支持以及配套设施。例如我们业务代码中所有资源都是外链形式书写,如果要编译为内联,加一个自定义属性即可;如果要内联 + localStorage ,就换成另外的自定义属性;如果什么都不加,那最后就会自动压缩合并 + 发布到 CDN 。
    Troevil
        20
    Troevil  
       2016-01-30 11:36:26 +08:00
    @chemzqm
    @qgy18

    他的意思是首次进入,就是 localstorage 没有换存的时候,需要 reload 一次吧
    qgy18
        21
    qgy18  
       2016-01-30 11:40:51 +08:00   1
    @Troevil 不需要,第一次服务端输出:
    <style id="all_css">...</style><script>L.h2l("all_css","all_css")</script>

    第二次服务端输出:
    <script>L.l2h("all_css:2")</script>

    也就是第一次就是正常的资源内联,顺带存到 localStorage 里;第二次才是走本地读取。
    aivier
        22
    aivier  
       2016-01-30 12:07:46 +08:00
    @qgy18 我的站放在国外,最大的问题是容易遇到 TTFB 突然增加到几秒的问题,因为服务器不是我的,我也不知道为什么,目前只能靠一些障眼法让访客看起来加载的很快了,下一个主题打算试试预加载
    loading
        23
    loading  
       2016-01-30 12:15:44 +08:00 via Android
    方法很赞。

    等我学好 golang 再考虑吧, python 的效率如果用这种做法,估计只会变慢…
    Troevil
        24
    Troevil  
       2016-01-30 12:18:21 +08:00
    @qgy18 那如果我第一次刷新了 手动清掉 localstorage 的缓存,那再刷新下,
    但服务器判断出不是第一次会返回
    <script>L.l2h("all_css:2")</script>
    不就不会从输出
    <style id="all_css">...</style><script>L.h2l("all_css","all_css")</script>
    吗?
    然后就进行 reload,我看到 你现在是这么处理的吧 这不就 reload 了一次吗

    流程是这样吧
    第一次: 读取完整页面 , 存 localStorage--> 操作: 手动清理 localStorage
    第二次: 读无 js,css 的页面,从 localStorage 拿数据 --> 发现没有然后 reload
    第三次: 读取完整页面,存 localStorage
    qgy18
        25
    qgy18  
       2016-01-30 12:32:43 +08:00   2
    @Troevil 非常正确!
    如果 cookie 标记被清了,服务端无法知道本地 localStorage 里还有缓存,就会输出全量。

    但是!如果 cookie 标记还在,但是 localStorage 被清除了,服务端就不知道该输出全量了,只能依靠 JS ,在读不到本地 localStorage 时清掉本地 cookie 标记再刷新。

    针对这个问题我们之前做过一些策略,例如发现出现这种情况,就额外存一个 Cookie 标记,针对有这个标记的用户一段时间内只输出全量。后面做了一个统计,发现几乎没有这种情况发生。
    qgy18
        26
    qgy18  
       2016-01-30 12:41:08 +08:00   1
    @Troevil 另外,如果这个 cookie 标记被无意设置为 HTTP Only ,那么 JS 就清不掉它了。然后刷新后服务端还是会认为本地有 localStorage 缓存,就会无限刷新。这个问题正常使用中肯定不会出现,但是我们评估 localStorage 方案时考虑过。

    我刚录了一个 gif 演示如何玩坏百度的 localStorage 方案(纯属无聊,这种问题各家都不会处理):

    qgy18
        27
    qgy18  
       2016-01-30 12:42:13 +08:00   1
    @qgy18 貌似图片地址多打了一个 v ,更新下:

    Troevil
        28
    Troevil  
       2016-01-30 12:44:06 +08:00
    @qgy18 玩坏了.. 我就是理解一下,才手动设置下 一些变量看看的,正常用户不会无聊到取清理这个的.
    chemzqm
        29
    chemzqm  
       2016-01-30 22:06:50 +08:00
    @qgy18
    1. 我的说法不太准确,不过清了 localstorage 以后可以看到页面刷新了两次
    2. 几年前在移动端试过 localstroage 缓存文件,只是发现某些设备 localstroage 无法保证正确读取就放弃了
    3. 为了省流量,你们也是蛮拼的
    qgy18
        30
    qgy18  
       2016-01-31 01:44:06 +08:00   1
    @chemzqm
    1 、对! localStorage 丢失但 cookie 健在时,确实要刷两次。极端情况下还会无限刷新,前面拿百度家的页面玩了下。但是正常情况下 localStorage 基本都是跟 cookie 一起被清除,实际统计结果也确实如此;
    2 、移动端确实很多奇葩情况,很多 Android APP 内置 Webview 甚至都不会开启 localStorage 功能,没有 setDomStorageEnabled(true)。我们现在的缓存率大概在 70% 左右,收益还是不错的;
    3 、其实真不是为了省流量,如果要省流量用外链就好了,后续访问有协商缓存 / 强缓存也不费流量。内联 + localStorage 主要还是为了省连接数,顺带节省流量。移动网络现在带宽上来了,但是时延还是很大,多一个新的外链光 DNS / TCP 就得好几百毫秒;

    另外,目前在移动端 HTTP/2 的研究中我遇到以下问题:
    1 、支持度不高。不过这不是什么大问题,移动端更新换代很快;
    2 、浏览器中, HTTP/2 必须基于 HTTPS 部署,而移动端 HTTPS 的连通性更差。前不久做的实验,在一个 HTTP 页面加载同域 HTTPS 图片,对比加载 HTTP 图片,不可用率高了 3%;
    3 、 HTTP/2 的单一连接数多路复用,要求同域,或者不同域但同 IP 、同证书。这一点实际部署起来很麻烦,尤其是在有 CDN 的情况下;
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2907 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 13:44 PVG 21:44 LAX 06:44 JFK 09:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86