sunmaobin / sunmaobin.github.io

blog
https://github.com/sunmaobin/sunmaobin.github.io
174 stars 11 forks source link

WEB解惑-URL双斜杠开头// #33

Open sunmaobin opened 7 years ago

sunmaobin commented 7 years ago

大家有没有发现,在一些免费的CDN站点提供的JS或者CSS的路径都是以 // 开头的?

比如:

<link href="//cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css" rel="stylesheet">

概念

// 开头的资源地址,其实专有名词叫:Protocol-relative URL,也就是:相对协议URL

提起相对协议URL,其实我们实际中也经常用到,大家常见的有:

作用

这么书写的作用就是:浏览器在请求资源时会依据当前页面的协议头来决定加载资源的协议头。

比如:当前页面是 https 开头的,那么依赖的这个文件就会以 https 协议去加载,否则使用 http加载。

WHY

为什么要这么做呢?不是js和css可以随便引入吗?为啥还要分协议呢?我统一使用 http 开头来加载资源有啥问题呢?

解决方案

知道了为什么会出现这个问题,那么我们经常引入一些外部资源的时候,就会有以下常见的办法。

<!-- 优先取得CDN上的资源 -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script>

<!-- 如果CDN资源获取失败,则动态加载本地资源 -->
<script>!window.jQuery && document.write(unescape('%3Cscript src="js/libs/jquery-1.4.2.js"%3E%3C/script%3E'))</script>
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

这两种方法现在都比较常用,第一种一般用在CDN资源的引入上,而第二种一般用在第三方脚本引入上。比如:Google分析、百度分析、多说评论框等等,引入一段脚本的时候都会这么做。

比如,大家看看多说评论框的JS脚本:

<!-- 多说评论框 start -->
<div class="ds-thread" data-thread-key="请将此处替换成文章在你的站点中的ID" data-title="请替换成文章的标题" data-url="请替换成文章的网址"></div>
<!-- 多说评论框 end -->
<!-- 多说公共JS代码 start (一个网页只需插入一次) -->
<script type="text/javascript">
var duoshuoQuery = {short_name:"your name"};
(function() {
    var ds = document.createElement('script');
    ds.type = 'text/javascript';ds.async = true;
    ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
    ds.charset = 'UTF-8';
    (document.getElementsByTagName('head')[0] 
     || document.getElementsByTagName('body')[0]).appendChild(ds);
})();
</script>
<!-- 多说公共JS代码 end -->

推荐直接用HTTPS

那为什么不直接进入 https 的资源呢?

其实是可以的!只是以前,人们一直以为 https 协议请求相对来说比较耗时,所以大家一般都不用,或者有些资源网站也不支持 https

但是现在技术发展挺快,https 也已经很稳定、高效,并且最关键的一点,在 http 网站中引入 https 是可以的!

所以,如果你现在引入资源的话,建议直接引入 https 的资源(如果支持),而且 https 网站也是趋势!

延伸

反过来看待上面的 // 的这种做法,许多人这么评价: protocol-relative URLs are an anti-pattern,翻译过来就是:相对协议URL是一种反模式

意思就是说:其实 HTTPS 才是大势所趋,我们应该鼓励直接用 HTTPS,而不是妥协它做一些兼容性的解决方案。

比如这篇文章的观点:Moving CDNs to HTTPS

参考

(全文完)

arrtiy commented 4 years ago

赞一个,完美地解决了我的疑问。

sunmaobin commented 4 years ago

赞一个,完美地解决了我的疑问。

😺