条件注释仅在IE5.5–IE9中生效,现代浏览器完全忽略;必须硬编码于HTML <head> 中,仅支持 <link> 等原生标签加载补丁CSS,且需禁用构建工具的注释删除。

<!--[if IE]> 这类写法在现代浏览器中已完全失效,**不能用于引入外部文件**。IE 条件注释仅在 IE 5–IE9(确切说是 IE9 及以下的怪异模式)中解析,且从 Edge 开始彻底移除,Chrome/Firefox/Safari 从来就不支持。
如果你现在看到某段代码里还写着 <!--[if lt IE 9]><script src="html5shiv.min.js"></script><![endif]-->,它只对仍在用 IE8 的极少数内网系统有效——上线前务必确认目标用户真实环境,否则就是无效冗余代码。
条件注释只能出现在 HTML 文件中,不能写在 CSS 或 JS 里
这是硬性限制:HTML 解析器在加载页面时才识别 <!--[if ...]>,而 CSS 文件、JS 文件是独立加载并由各自引擎解析的,它们根本不认识这种语法。
- CSS 文件里写
@media screen\9 { ... }是 media hack,不是条件注释 - JS 文件里不能用
<!--[if...],写了就变成普通字符串或直接报错(如放在<script>标签内未闭合) - 所有条件注释必须包裹完整 HTML 片段,比如
<link>、<script>、<style>
正确引入老浏览器专用资源的现代做法
别再依赖条件注释,改用 JavaScript 特性检测 + 动态加载更可靠:
- 用
"querySelector" in document判断是否支持现代 DOM API - 用
typeof Promise === "undefined"检查 Promise 是否存在 - 动态插入
<script>时注意执行顺序:script.async = false确保同步加载 - 加载完 polyfill 后,记得手动触发初始化(例如
webshims.polyfill("forms"))
示例片段:
立即学习“前端免费学习笔记(深入)”;
if (!("fetch" in window)) {
const script = document.createElement("script");
script.src = "https://cdn.jsdelivr.net/npm/whatwg-fetch@3.6.2/dist/fetch.umd.js";
script.async = false;
document.head.appendChild(script);
}
为什么你看到的“条件注释引入”现在基本没用
关键点很实在:IE 市场份额早已低于 0.01%,主流框架(React/Vue/Angular)默认不再兼容 IE,构建工具(Vite/Webpack)生成的代码也默认不包含 IE-targeted 输出。
-
<meta http-equiv="X-UA-Compatible" content="IE=edge">在现代页面中形同虚设 - 即使你保留了
<!--[if IE]>,Chrome DevTools 的 Network 面板里也看不到它发起任何请求 - 打包后的 HTML 若经压缩工具(如 html-minifier)处理,这类注释常被直接删掉
真正要兼容老环境,得靠明确的构建目标设定(如 Babel 的 targets 配置)+ 运行时按需加载,而不是靠一段早已被浏览器忽略的注释。



















