数往知来:一次浏览器兼容工作中的知识点分析
Posted 云前端
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数往知来:一次浏览器兼容工作中的知识点分析相关的知识,希望对你有一定的参考价值。
在这个机器学习和人工智能遍地的年代,前端开发中的PC端浏览器兼容问题显得已经不是那么时髦和迫切了;刨去某些面向传统行业或网银支付等领域还不得不面对这个具体的问题外,大部分网站和移动端应用似乎可以潇洒的回避了;兼容工作的重点已经从几年前的样式统一转变为在PC端和移动端对新特性的支持和妥协,除了能更好更全面的满足用户,开发者了解优雅降级的兼容化思路,也是可以普遍应用在各项工作中的
开车!
开车!
开车!
项目构成
本次用来分析的项目,其package.json中的依赖大致如下:
"dependencies": {
"bootstrap": "^3.3.7",
"draft-js": "^0.10.1",
"draftjs-to-html": "^0.7.4",
"element-dataset": "^2.2.6",
"form-serialize": "^0.7.1",
"html-to-draftjs": "0.1.0-beta14",
"immutable": "~3.7.4",
"lodash": "^4.17.4",
"mobx": "^3.1.9",
"mobx-react": "^4.1.5",
"moment": "^2.18.1",
"react": "^15.6.1",
"react-bootstrap": "^0.30.8",
"react-datetime": "^2.8.9",
"react-dom": "^15.6.1",
"react-draft-wysiwyg": "^1.10.7",
"react-router-dom": "^4.1.0",
"native-promise-only": "^0.8.1",
"whatwg-fetch": "^2.0.3"
}
显然,这是一个bootstrap样式的后台单页应用,用react实现了组件化、用mobx管理状态、引入了fetch等promise异步工具,并且使用了一些日期选择和富文本编辑器插件等第三方库
--- 感觉上IE就悬乎乎哒ㄟ( ▔, ▔ )ㄏ
目标用户
该产品为 toB 形态,主要面对部分可控的目标用户,大部分可以在指导下使用较新的chrome浏览器,但不排除一些用户使用firefox甚至IE的情况,所以针对该项目的主要目标就是让低版本IE用户处于“大部分特性可用、鼓励升级到chrome”的状况下,而不是回避甚至放弃这部分需求
兼容原则
尽量不影响chrome等其他主流的浏览器
最大化的尝试兼容已有功能
对实在无法实现的功能降级处理
对IE向下兼容到9(xp下可升级的最高版本)
顺藤摸瓜
这里我们以兼容后的
index.html
入口文件为切入点,梳理本次兼容过程的脉络:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9,edge">
<title><%= htmlWebpackPlugin.options.title %></title>
<!--[if lte IE 9]>
<script ></script>
<script ></script>
<script ></script>
<script ></script>
<script ></script>
<script ></script>
<script ></script>
<script ></script>
<script ></script>
<script>
window.__defineGetter__(
'history',
function(){
return History
}
);
</script>
<![endif]-->
<script>
(function() {
var _isIE = /Trident\/(\d+)/i.exec(navigator.userAgent);
var _gteIE10 = _isIE && parseInt(_isIE[1])>5;
if (_gteIE10) {
var s = document.createElement('script');
document.head.appendChild(s);
s.src = "CDN/es6-shim.min.js";
};
}())
</script>
</head>
<body>
<!--[if lte IE 9]>
<div id="oldIENoticeBox">
您的浏览器过于老旧,
请使用<a href="...">最新版chrome浏览器</a>
</div>
<![endif]-->
<div id="root"></div>
</body>
</html>
使用X-UA-Compatible
“有时候需要限制Windows Internet Explorer在解析某个网页时使用特定的文档模式。使用
X-UA-Compatible
头部属性,可以让用户就像使用旧版本IE一样查看当前网页” -- MSDN
使用
X-UA-Compatible
设置的被称为遗留文档模式(legacy document modes)X-UA-Compatible不区分大小写,但必须出现在head中,且必须位于除title及其他meta元素外的元素前面
服务器也可以通过配置指定X-UA-Compatible,但网页中的优先级高于服务器发送的
可以设置其content值为诸如 IE9 或 EmulateIE9 之类的值;前者严格限制按照指定的版本渲染,而后者还会考虑
!doctype
的情况,从而有更好的兼容性设置content为edge则将Internet Explorer置于其支持的最高级模式之下
可以设置多个值,比如
content="IE=7,9,10"
,IE将从中选中自身能支持的最高版本如果content值中包含
chrome=1
,则表示支持Google Chrome Frame
外挂插件(在IE外观下调用chrome内核浏览的挖墙脚插件;相应的也有个IETab用来在chrome/firefox下调用IE页面以上是关于数往知来:一次浏览器兼容工作中的知识点分析的主要内容,如果未能解决你的问题,请参考以下文章
谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js