网站首页 > 技术文章 正文
iframe 就像是 HTML 的「内嵌画布」,允许在页面中加载独立网页,如同在画布上叠加另一幅动态画卷。核心特性包括:
- 独立上下文:每个 iframe 都拥有独立的 DOM/CSS/JS 环境(类似浏览器中的浏览器)
- 异步加载:不会阻塞主页面渲染
- 沙盒隔离:天然实现样式和脚本隔离
常见应用场景:
- 第三方服务嵌入:广告、支付、地图等(如嵌入高德地图)
- 微前端架构:通过 iframe 组合多个独立子系统(大部分的微前端框架不是靠这个,特别说明下)
- 文档预览:PDF/Office 文件在线展示
- 沙盒实验环境:代码在线编辑器的预览窗口
性能优化
1. 懒加载策略
<!-- 原生属性实现 -->
<iframe loading="lazy" data-src="chart.html"></iframe>
<!-- Vue动态加载 -->
<template>
<iframe v-if="isVisible" :src="url"></iframe>
</template>
通过 IntersectionObserver 监听可视区域,提升 scroll 事件性能
2. 资源预加载
<link rel="preload" href="chart.html" as="iframe">
3. 代码分割
Webpack 动态导入 + iframe 按需加载:
// page1.js
export function loadPage1() {
// 创建 iframe 元素
const iframe = document.createElement('iframe');
// 设置 iframe 的源为 page1.html
iframe.src = 'page1.html';
// 将 iframe 添加到页面中
document.body.appendChild(iframe);
}
const loadModule = () => import('./page1.js')
跨域通信全攻略
1. postMessage 安全通信
// 父页面发送
iframeEl.contentWindow.postMessage('数据', 'https://子域名')
// 子页面接收
window.addEventListener('message', (e) => {
if(e.origin !== 'https://父域名') return
console.log(e.data)
})
2. 同源策略突破方案
方案 | 适用场景 | 实现难度 |
CORS | 服务端可控 | ★★☆ |
JSONP | GET请求简单数据 | ★☆☆ |
代理服务器 | 复杂跨域场景 | ★★★ |
document.domain | 同主域名 | ★★☆ |
3. 无界微前端方案
通过 Shadow DOM + iframe 黑科技实现:
// 创建 ShadowRoot
const shadow = host.attachShadow({ mode: 'open' })
// 动态创建 iframe
const iframe = document.createElement('iframe')
iframe.src = '//子应用域名/path'
shadow.appendChild(iframe)
实现路由同步、DOM 穿透等高级功能
安全防护
- 沙盒属性:
<iframe sandbox="allow-scripts allow-same-origin"></iframe>
- 内容安全策略:
Content-Security-Policy: frame-ancestors 'self'
Content-Security-Policy: frame-ancestors 'self' 是 HTTP 响应头 Content-Security-Policy(CSP)的一个指令。
- frame-ancestors 指令用于限制哪些页面可以通过 <frame>、<iframe>、<object>、<embed> 或 <applet> 等标签嵌入当前页面。
- 'self' 是一个关键字,表示只允许当前页面的源(协议、域名和端口都相同)的页面作为嵌入的祖先页面。也就是说,只有与当前页面同源的页面才能将当前页面嵌入到自己的框架中。
- 点击劫持防御:
if(top !== self) top.location.href = self.location.href
高频面试题精选
- iframe 的优缺点是什么?
优:隔离性强、支持异步加载、跨域解决方案多
缺:SEO 不友好、性能消耗大、通信复杂度高 - 如何实现 iframe 自适应高度?
通过 contentWindow 获取子页面高度,动态设置 iframe 高度(需注意跨域限制) - postMessage 如何防止 XSS 攻击?
严格验证 origin 来源 + 数据序列化 + 避免执行字符串代码 - 微前端场景下 iframe 的替代方案?
Web Components / Qiankun 等方案,但 iframe 仍是隔离性最佳选择 - 如何检测 iframe 加载失败?
监听 error 事件 + 设置超时检测:
iframe.onerror = () => console.log('加载失败')
setTimeout(() => { if(!loaded) handleError() }, 5000)
猜你喜欢
- 2025-05-02 前端面试题-原生 js 如何进行监听路由的变化?vue框架是否用到?
- 2025-05-02 从零打造微前端框架:实战“汽车资讯平台”项目
- 2024-09-12 珠峰-前端架构师2023最新版
- 2024-09-12 太强了!牛客网曝光vite的微前端框架 -vite-micro,引发热潮
- 2024-09-12 基于大数据的前端应用架构设计与实现
- 2024-09-12 2023最新版-Web前端架构师(35周完结无密)
- 2024-09-12 基于 iframe 的微前端框架
- 2024-09-12 微前端项目部署方案
- 2024-09-12 1??微前端、乾坤、singleSpa
- 2024-09-12 前端高手特训 从0到1带你手写一个微信小程序底层框架-itzcw分享
你 发表评论:
欢迎- 06-24发现一款开源宝藏级工作流低代码快速开发平台
- 06-24程序员危险了,这是一个 无代码平台+AI+code做项目的案例
- 06-24一款全新的工作流,低代码快速开发平台
- 06-24如何用好AI,改造自己的设计工作流?
- 06-24濮阳网站开发(濮阳网站建设)
- 06-24AI 如何重塑前端开发,我们该如何适应
- 06-24应届生靠这个Java简历模板拿下了5个offer
- 06-24服务端性能测试实战3-性能测试脚本开发
- 566℃Oracle分析函数之Lag和Lead()使用
- 566℃几个Oracle空值处理函数 oracle处理null值的函数
- 550℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 545℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 543℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 536℃【数据统计分析】详解Oracle分组函数之CUBE
- 526℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 519℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)