首页/文章/javascript

什么是iframe,火爆的微前端解决方案方案,教你快速看懂

2024-09-24
18797 分钟
...

iframe(Inline Frame) 是一种 HTML 标签,它允许在一个网页内部嵌套加载另一个网页,从而实现在主页面中展示外部网页内容的功能。iframe 创建了一个独立的浏览上下文,拥有自己的文档对象模型(DOM)和执行环境,这意味着它不会与主页面共享JavaScript变量或CSS样式,提供了较好的隔离性。 一、简单使用案列,网站中嵌套 Chatgpt 

一、简单使用案列,网站中嵌套 Chatgpt

1.它允许你在当前页面中嵌入另一个HTML文档。下面是如何在Vue中使用的基本步骤

基本用法
直接在模板中使用 标签: 在Vue组件的模板部分,你可以直接插入标签,并设置src属性指向你想要嵌入的页面URL。

<template>
  <div class="app-container">
    <iframe
        src="https://app.nextchat.dev/"
        frameborder="0"
    ></iframe>
  </div>
</template>

2.设置 src 属性: src属性应该包含你希望加载的外部网页的URL。你可以直接硬编码这个URL,或者像上面的例子那样,使用数据属性动态绑定。 3.CSS样式: 通常,你需要为设置宽度和高度,以确保它能够正确填充其父容器。你可以使用CSS来设置这些样式。 

   .app-container {
     width: 100%;
     height: 100%; 
   }
 
   iframe {
     width: 100%;
     height: 100%;
   }

3.CSS样式:

通常,你需要为设置宽度和高度,以确保它能够正确填充其父容器。你可以使用CSS来设置这些样式。

   .app-container {
     width: 100%;
     height: 100%; 
   }
 
   iframe {
     width: 100%;
     height: 100%;
   }

完整vue代码如下

<template>
  <div class="app-container">
    <iframe
        src="https://app.nextchat.dev/"
        frameborder="0"
    ></iframe>
  </div>
</template>
<style lang="scss" scoped>

.app-container {
  
  height: calc(100vh - 50px);
}
 

.hasTagsView {
  .app-container {
    
    height: calc(100vh - 84px);
  }
}
 
iframe {
  width: 100%;
  height: 100%;
}
</style>
<script setup lang="ts">
</script>

注意事项 1.同源策略:由于浏览器的同源策略限制,只有当嵌入的页面与当前页面具有相同的协议、域名和端口时,才能访问到内的DOM。 2.CORS:如果需要与内部的页面进行交互(例如,发送请求或修改内容),则需要确保3.目标页面支持跨源资源共享(CORS)。 4.安全性:确保你嵌入的是可信的站点,因为恶意内容可能会危害到你的用户或网站。 5.性能:嵌入大型或复杂的页面可能会影响你的网站性能,因此要谨慎选择嵌入的内容。 

二、轻松找到界面嵌套网址

1.打开F12找到iframe标签中的src路径

2.右键点击跳转找到嵌套内容界面,微前端内跳转子界面同理

三、接下来我们看以下iframe常用的属性

1.src:这是最基本的属性,用于指定要加载的文档的URL。
 <iframe src="https://app.nextchat.dev/"></iframe>
2.width 和 height:这两个属性用于定义的宽度和高度,可以是像素值或百分比。
  <ifram src="https://app.nextchat.dev/"width="800" height="600"></iframe>
3.frameborder:此属性用于设置周围的边框。默认情况下,边框是存在的,但是可以将其设置为0来移除边框。
  <iframe src="https://app.nextchat.dev/"  frameborder="0"></iframe>
4.name:用于给命名,可以用于表单提交的目标。
   <iframe src="https://app.nextchat.dev/" name="myFrame"></iframe>  
5.allowtransparency:布尔属性,用于指定背景是否透明。
   <iframe src="https://app.nextchat.dev/" allowtransparency="true"></iframe>  
6.scrolling:用于控制内部页面是否显示滚动条。可以设置为auto(自动)、yes(总是显示滚动条)或no(不显示滚动条)。
   <iframe  src="https://app.nextchat.dev/" allowtransparency="true"></iframe>         
7.sandbox:增强的安全性选项,可以限制的内容,如不允许形成弹窗、不允许提交表单等。
 <iframe src="https://app.nextchat.dev/" sandbox="allow-scripts allow-same-origin"></iframe>   
8、loading:指示浏览器何时开始加载的内容。可以是eager(立即加载)或lazy(延迟加载)
 <iframe src="https://app.nextchat.dev/" loading="lazy"></iframe>
9.referrerpolicy:定义了当请求的src时,应该发送什么样的referrer头。
   <iframe src="https://app.nextchat.dev/" referrerpolicy="no-referrer"></iframe>    
10.allow:用于指定内容可以使用的特定API,例如allow="camera; microphone"。
<iframe  src="https://app.nextchat.dev/" allow="camera; microphone"></iframe>

四、使用实现微前端解决方案

微前端架构允许将一个大的应用程序拆分成多个小的子应用,每个子应用可以独立开发、部署和维护。使用作为微前端解决方案是一种简单有效的方法,尤其是在需要隔离子应用的情况下。下面详细介绍如何使用实现微前端解决方案。

1. 还不清除微前端的LOOK基本概念主应用:负责管理和渲染各个子应用。
子应用:独立的小应用,可以是不同的技术栈或框架。
通信机制:主应用和子应用之间需要一种通信机制来传递消息。
2. 接下来我们LOOK实现步骤

步骤 1: 创建主应用

主应用负责加载和渲染各个子应用。首先创建一个主应用,开发中一般将系统管理平台设置为主。

<template>
  <div class="app-container">
    <h1>主应用</h1>
    <div v-for="(subApp, index) in subApps" :key="index" class="sub-app-container">
      <iframe
        :src="subApp.src"
        frameborder="0"
        loading="lazy"
      ></iframe>
    </div>
  </div>
</template>
 
<script setup lang="ts">
import { ref } from 'vue';
 

const subApps = ref([
  { src: 'https://subapp1.example.com' },
  { src: 'https://subapp2.example.com' }
]);
</script>
 
<style scoped>
.app-container {
  display: flex;
  flex-direction: column;
  align-items: center;
}
 
.sub-app-container {
  width: 100%;
  height: 500px;
  margin-bottom: 20px;
}
 
iframe {
  width: 100%;
  height: 100%;
}
</style>

步骤 2: 创建两个子应用

子应用可以是任何技术栈的应用,例如React、Vue或Angular。每个子应用需要能够在中正常运行。

子应用代码示例
假设你有两个子应用:subapp1和subapp2。
子应用1 (subapp1)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>子应用1</title>
</head>
<body>
  <div id="root"></div>
  <script>
    document.addEventListener('DOMContentLoaded', function() {
      const rootDiv = document.getElementById('root');
      const app = document.createElement('div');
      app.innerHTML = '<h1>子应用1</h1>';
      rootDiv.appendChild(app);
 
      
      window.addEventListener('message', function(event) {
        if (event.origin !== 'https://mainapp.example.com') return;
        console.log('接收到的消息:', event.data);
      });
 
      
      window.parent.postMessage({ type: 'hello', data: '子应用1' }, 'https://mainapp.example.com');
    });
  </script>
</body>
</html>

子应用2 (subapp2)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>子应用2</title>
</head>
<body>
  <div id="root"></div>
  <script>
    document.addEventListener('DOMContentLoaded', function() {
      const rootDiv = document.getElementById('root');
      const app = document.createElement('div');
      app.innerHTML = '<h1>子应用2</h1>';
      rootDiv.appendChild(app);
 
      
      window.addEventListener('message', function(event) {
        if (event.origin !== 'https://mainapp.example.com') return;
        console.log('接收到的消息:', event.data);
      });
 
      
      window.parent.postMessage({ type: 'hello', data: '子应用2' }, 'https://mainapp.example.com');
    });
  </script>
</body>
</html>

步骤 3: 实现通信机制

主应用和子应用之间需要一种通信机制来传递消息。通常使用window.postMessage来实现跨域通信。

主应用通信代码

import { onMounted } from 'vue';
 
onMounted(() => {
  
  window.addEventListener('message', function(event) {
    if (event.origin !== 'https://subapp1.example.com' && event.origin !== 'https://subapp2.example.com') return;
    console.log('接收到的消息:', event.data);
  });
 
  
  setTimeout(() => {
    window.frames[0].contentWindow.postMessage({ type: 'ping', data: '主应用' }, 'https://subapp1.example.com');
    window.frames[1].contentWindow.postMessage({ type: 'ping', data: '主应用' }, 'https://subapp2.example.com');
  }, 3000);
});

使用实现微前端解决方案是一种简单有效的方法,特别适用于需要隔离子应用的情况。通过,你可以轻松地将不同的子应用嵌入到主应用中,并通过window.postMessage实现跨域通信。这种方法不仅提高了开发效率,还增强了应用的可维护性和扩展性。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
javascript2026-02-24
navigator.sendBeacon全指南
在前端开发中,埋点系统是必不可少的一环。我们经常需要在用户 关闭页面 、 刷新 或 跳转路由 时,向服务器发送最后一条统计数据(比如用户停留时长、页面跳出率)。 但这看似简单的需求,在实现时却危机四伏:请求发不出去?页面跳转卡顿?今天我们就来聊聊这个问题的终极解决方案 —— 。 一、 痛点与传统方案的挣扎 场景还原 当用户点击关闭按钮时,浏览器会触发生命周期事件( 或 )。如果我们直接使用普通的异步 AJAX ( 或 ) 发送请求,浏览...
学习
javascript2025-11-02
理解浏览器事件系统,从用户点击到事件对象的完整旅程
深入理解浏览器事件系统:从用户点击到事件对象的完整旅程 “当我点击页面按钮时,背后发生了什么?为什么回调函数能收到一个包含丰富信息的event对象?今天,让我们一起揭开浏览器事件系统的神秘面纱。” 一个令人困惑的现象 作为前端开发者,我们每天都在写这样的代码: 这段代码如此熟悉,以至于我们很少停下来思考:​ ​这个 对象到底从哪里来?它为什么能知道点击的精确坐标?为什么能识别是哪个元素被点击了?​ ​ 更神奇的是,当我们手动创建事件时:...
学习
javascript2025-10-01
实现大文件上传全流程详解
在日常开发中,大文件上传是个绕不开的坎——动辄几百 MB 甚至 GB 级的文件,直接上传不仅容易超时,还会让用户体验大打折扣。最近我用 Vue+Express 实现了一套完整的大文件上传方案,支持分片上传、断点续传、秒传和手动中。 一、先看效果:我们要实现什么? 先上核心功能清单,确保大家明确目标,知道我们要解决哪些实际问题: 大文件分片上传 :将文件切成固定大小的小片段分批上传,避免单次请求超时 秒传 :服务器已存在完整文件时,直接返...
学习
javascript2025-09-18
JavaScript 的多线程能力:Worker
如果你写过一些计算量稍大的 JavaScript 代码,比如图像处理、大量数据排序或者复杂的算法,你几乎肯定遇到过浏览器“卡死”的现象。点击页面没反应,动画也停了,就像整个世界都静止了。 这就是主线程被阻塞的典型后果。因为主线程既要负责执行 JavaScript,又要负责渲染页面、响应用户操作,一旦它被繁重的计算任务占满,就无暇顾及其他,用户体验便直线下降。 这个问题的根源,正是“主线程是单线程的”。那么,如何解决呢? 答案很简单:把这...
学习面试
javascript2025-09-15
一张 8K 海报差点把首屏拖垮
你给后台管理系统加了一个「企业风采」模块,运营同学一口气上传了 200 张 8K 宣传海报。首屏直接飙到 8.3 s,LCP 红得发紫。 老板一句「能不能像朋友圈那样滑到哪看到哪?」——于是你把懒加载重新翻出来折腾了一轮。 解决方案:三条技术路线,你全踩了一遍 1\. 最偷懒:原生 一行代码就能跑,浏览器帮你搞定。 🔍 关键决策点 2020 年后现代浏览器全覆盖,IE 全军覆没。 必须写死 ,否则 CLS 会抖成 PPT。 适用场景...
学习
javascript2025-09-10
🚀 Web Worker让你的应用丝滑
🌟 引言 在日常的前端开发中,你是否遇到过这样的困扰: 大数据处理时页面卡死 :处理几万条数据时,页面直接卡成PPT,用户点击毫无反应 复杂计算阻塞UI :图片处理、数据分析等计算密集型任务让整个应用假死 文件上传/下载卡顿 :大文件操作时,其他功能完全无法使用 实时数据处理性能差 :WebSocket接收大量数据时,页面渲染严重滞后 今天分享6个Web Worker的核心技巧,让你的应用告别卡顿,用户体验丝滑如德芙! 💡 核心技巧...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录