整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JavaScript中动态追加第一位元素(循环)

JavaScript中动态追加第一位元素(循环)
<div class="ceshi">
	<p>1</p><p>2</p><p>3</p>
</div>

<script>
	setInterval(function(){addLine();},2000)
    function addLine() {
        var html=$(".ceshi p:nth-child(1)").html();
         $(".ceshi p:nth-child(1)").remove()
         $('.ceshi p:last-child').after("<p>"+html+"</p>");
    } 
</script>

用到的方法有:.

remove()删除

after()最后的位置追加

家好,我叫Echa哥。

微前端已经是一个非常成熟的领域了,但开发者不管采用哪个现有方案,在适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户核心诉求都或存在问题,或无法提供支持。本文提供一种基于 iframe 的全新的微前端方案,完善地解决了这些核心诉求。

为什么还要造微前端框架

目前较成熟的微前方案有 qiankun、micro-app、EMP 方案,下面分别分析这三个微前端方案:

qiankun 方案

qiankun 方案是基于 single-spa 的微前端方案。

特点

  • html entry 的方式引入子应用,相比 js entry 极大地降低了应用改造的成本;
  • 完备的沙箱方案,js 沙箱做了 SnapshotSandbox、LegacySandbox、ProxySandbox 三套渐进增强方案,css 沙箱做了 strictStyleIsolation、experimentalStyleIsolation 两套适用不同场景的方案;
  • 做了静态资源预加载能力;

不足

  • 适配成本比较高,工程化、生命周期、静态资源路径、路由等都要做一系列的适配工作;
  • css 沙箱采用严格隔离会有各种问题,js 沙箱在某些场景下执行性能下降严重;
  • 无法同时激活多个子应用,也不支持子应用保活;
  • 无法支持 vite 等 esmodule 脚本运行;

micro-app 方案

micro-app 是基于 webcomponent + qiankun sandbox 的微前端方案。

特点

  • 使用 webcomponet 加载子应用相比 single-spa 这种注册监听方案更加优雅;
  • 复用经过大量项目验证过 qiankun 的沙箱机制也使得框架更加可靠;
  • 组件式的 api 更加符合使用习惯,支持子应用保活;
  • 降低子应用改造的成本,提供静态资源预加载能力;

不足

  • 接入成本较 qiankun 有所降低,但是路由依然存在依赖;
  • 多应用激活后无法保持各子应用的路由状态,刷新后全部丢失;
  • css 沙箱依然无法绝对的隔离,js 沙箱做全局变量查找缓存,性能有所优化;
  • 支持 vite 运行,但必须使用 plugin 改造子应用,且 js 代码没办法做沙箱隔离;
  • 对于不支持 webcompnent 的浏览器没有做降级处理;

EMP 方案

EMP 方案是基于 webpack 5 module federation 的微前端方案。

特点

  • webpack 联邦编译可以保证所有子应用依赖解耦;
  • 应用间去中心化的调用、共享模块;
  • 模块远程 ts 支持;

不足

  • 对 webpack 强依赖,老旧项目不友好;
  • 没有有效的 css 沙箱和 js 沙箱,需要靠用户自觉;
  • 子应用保活、多应用激活无法实现;
  • 主、子应用的路由可能发生冲突;

结论

qiankun 方案对 single-spa 微前端方案做了较大的提升同时也遗留下来了不少问题长时间没有解决;
micro-app 方案对 qiankun 方案做了较多提升但基于 qiankun 的沙箱也相应会继承其存在的问题;
EMP 方案基于 webpack 5 联邦编译则约束了其使用范围;
目前的微前端方案在用户的核心诉求上都没有很好的满足,有很大的优化提升空间。

无界方案

无界微前端方案基于 webcomponent 容器 + iframe 沙箱,能够完善地解决适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户的核心诉求。

文档地址,demo 地址:https://wujie-micro.github.io/demo-main-vue/home,git 地址:https://github.com/Tencent/wujie

下面就成本、速度、隔离、功能等多个方面进行阐述。

成本低

无界微前端的成本非常低,主要体现在主应用的使用成本、子应用的适配成本两个方面。

主应用使用成本

主应用使用无界不需要学习额外的知识,无界提供基于 vue 封装的 wujie-vue 和基于 react 封装的 wujie-react,用户可以当初普通组件一样加载子应用,以 wujie-vue 举例:

 <WujieVue
   width="100%"
   height="100%"
   name="xxx"
   url="xxx"
   :sync="true"
   :fiber="true"
   :degrade="false"
   :fetch="fetch"
   :props="props"
   :plugins="plugins"
   :beforeLoad="beforeLoad"
   :beforeMount="beforeMount"
   :afterMount="afterMount"
   :beforeUnmount="beforeUnmount"
   :afterUnmount="afterUnmount"
 ></WujieVue>

子应用加载和普通 vue 组件加载并无二致,所有配置都收敛到组件的属性上。

子应用适配成本

子应用首先需要做支持跨域请求改造,这个是所有微前端框架运行的前提,除此之外子应用可以不做任何改造就可以在无界框架中运行,不过此时运行的方式是重建模式。

子应用在无界中会根据是否保活、是否做了生命周期适配进入不同的运行模式:

其中保活模式、单例模式、重建模式适用于不同的业务场景,就算复杂点的单例模式用户也只是需要做一点简单的生命周期改造工作,可以说子应用适配成本极低。

速度快

无界微前端非常快,主要体现在首屏打开快、运行速度快两个方面。

首屏打开快

目前大部分微前端只能做到静态资源预加载,但是就算子应用所有资源都预加载完毕,等到子应用打开时页面仍然有不短的白屏时间,这部分白屏时间主要是子应用 js 的解析和执行。

无界微前端不仅能够做到静态资源的预加载,还可以做到子应用的预执行。

预执行会阻塞主应用的执行线程,所以无界提供 fiber 执行模式,采取类似 react fiber 的方式间断执行 js,每个 js 文件的执行都包裹在 requestidlecallback 中,每执行一个 js 可以返回响应外部的输入,但是这个颗粒度是 js 文件,如果子应用单个 js 文件过大,可以通过拆包的方式降低体积达到 fiber 执行模式效益最大化。

运行速度快

子应用的 js 在 iframe 内运行,由于 iframe 是一个天然的 js 运行沙箱,所以无需采用 with (fakewindow) 这种方式来指定子应用的执行上下文,从而避免由于采用 with 语句执行子应用代码而导致的性能下降,整体的运行性能和原生性能差别不大。

原生隔离

无界微前端实现了 css 沙箱和 js 沙箱的原生隔离,子应用不用担心污染问题。

css 沙箱隔离

无界将子应用的 dom 放置在 webcomponent + shadowdom 的容器中,除了可继承的 css 属性外实现了应用之间 css 的原生隔离。

js 沙箱隔离

无界将子应用的 js 放置在 iframe(js-iframe)中运行,实现了应用之间 window、document、location、history 的完全解耦和隔离。

js 沙箱和 css 沙箱连接

无界在底层采用 proxy + Object.defineproperty 的方式将 js-iframe 中对 dom 操作劫持代理到 webcomponent shadowRoot 容器中,开发者无感知也无需关心。

功能强大

无界微前端的功能非常强大,支持子应用保活、子应用内嵌、多应用激活、去中心化通信、生命周期、插件系统、vite 框架支持、兼容 IE9、应用共享。

子应用保活

当子应用设置为保活模式,切换子应用后仍然可以保持子应用的状态和路由不会丢失。

子应用嵌套

无界支持子应用多层嵌套,嵌套的应用和正常应用一致,支持预加载、保活、同步、通信等能力,需要注意的是内嵌的子应用 name 也需要保持唯一性,否则将复用之前渲染出来的应用

多应用激活

无界支持一个页面同时激活多个子应用并且保持这些子应用路由同步的能力。

去中心化通信

无界提供多种通信方式:window.parent 直接通信、props 数据注入、去中心化 EventBus 通信机制:

  • 子应用 js 在和主应用同域的 iframe 内运行,所以 window.parent 可以直接拿到主应用的 window 对象来进行通信
  • 主应用可以向子应用注入 props 对象,里面可以注入数据和方法供子应用调用
  • 内置的 EventBus 去中心化通信方案可以让应用之间方便的直接通信

生命周期

无界提供完善的生命周期钩子供主应用调用:

  • beforeLoad:子应用开始加载静态资源前触发
  • beforeMount:子应用渲染前触发 (生命周期改造专用)
  • afterMount:子应用渲染后触发(生命周期改造专用)
  • beforeUnmount:子应用卸载前触发(生命周期改造专用)
  • afterUnmount:子应用卸载后触发(生命周期改造专用)
  • activated:子应用进入后触发(保活模式专用)
  • deactivated:子应用离开后触发(保活模式专用)

插件系统

无界提供强大的插件系统,方便用户在运行时去修改子应用代码从而避免将适配代码硬编码到仓库中。

无界插件主要能力如下:

  • html-loader 可以对子应用 template 进行处理
  • js-excludes 和 css-excludes 可以排除子应用特定的 js 和 css 加载
  • js-before-loaders、js-loader、js-after-loaders 可以方便的对子应用 js 进行自定义
  • css-before-loaders、css-loader、css-after-loaders 可以方便的对子应用 css 进行自定义

vite 框架支持

无界子应用运行在 iframe 中原生支持 esm 的脚本,而且不用担心子应用运行的上下文问题,因为子应用读取的就是 iframe 的 window 上下文,所以无界微前端原生支持 vite 框架。

兼容 IE9

由于无界采用了 webcomponent + shadowdom + proxy 的方案,在某些低版本浏览器上无法运行时,无界微前端会自动降级。

降级方案采用:

  • webcomponent + shadowdom ? iframe(dom-iframe)
  • proxy + Object.defineproperty ? Object.defineproperty
  • 子应用运行的方式是 dom-iframe + js-iframe + Object.defineproperty,IE9+ 都可以兼容(无界没有 polyfill es6,需用户手动 babel 处理)。

自动降级后无界依然可以保证子应用的 css 和 js 原生隔离,但是由于 dom-iframe 的限制,弹窗将只能在子应用内部打开

应用共享

一个微前端系统可能同时运行多个子应用,不同子应用之间可能存在相同的包依赖,那么这个依赖就会在不同子应用中重复打包、重复执行造成性能和内存的浪费。

无界提供一种工程上的策略结合无界的插件能力,可以有效的解决这个问题(其他微前端框架也可以做到),这里以一个场景举例:主应用使用到了 ant-design-vue,子应用 A 也使用到了相同版本的 ant-design-vue。

主应用:

1、修改主应用的 index.js,将共享包挂载到主应用的 window 对象上

 // index.js
 import Antdv from "ant-design-vue";
 // 将需要共享的包挂载到主应用全局
 window.Antdv=Antdv;

2、加载子应用时注入插件,将主应用的 Antdv 赋值到子应用的 window 对象上

 <WujieVue name="A" url="xxxxx" :plugins="[{ jsBeforeLoaders: [{ content: 'window.Antdv=window.parent.Antdv' }] }]">
 </WujieVue>

子应用: webpack 设置 externals

 module.exports={
   externals: {
     "ant-design-vue": {
       root: "Antdv",
       commonjs: "Antdv",
       commonjs2: "Antdv",
       amd: "Antdv",
     },
   },
 };

如果子应用需要单独运行可以参考文档

总结

无界微前端采用 webcomponent + iframe 的来加载子应用,具有成本低、速度快、原生隔离、功能强大等一系列优点,在满足用户核心诉求的同时让使用微前端的体验就像使用普通组件一样简单,极大的降低了使用门槛。

无界已经开源 ,欢迎 star ??????:https://github.com/Tencent/wujie

次的ae 2020 mac版带来了更多新功能和改进,比如快速创建和编辑形状、Cinema 4D Lite R21、预览和播放性能改进、EXR工作流程增强、图形和文字增强、表情改善、内容感知填充以改进视频等,after effects 2020中文版的功能更加全面,用户体验更佳。

Adobe After Effects 2020 for mac官方介绍

Adobe After Effects简称“AE”是Adobe公司推出的一款图形视频处理软件,适用于从事设计和视频特技的机构,包括电视台、动画制作公司、个人后期制作工作室以及多媒体工作室。属于层类型后期软件。

Adobe After Effects软件可以帮助您高效且精确地创建无数种引人注目的动态图形和震撼人心的视觉效果。利用与其他Adobe软件无与伦比的紧密集成和高度灵活的2D和3D合成,以及数百种预设的效果和动画,为您的电影、视频、DVD和Macromedia Flash作品增添令人耳目一新的效果。

https://mac.orsoon.com/Mac/174607.html

after effects 2020 mac版全新功能

预览和播放性能改进

此版本的After Effects提供了线程改进,可提供更快,更清晰的预览播放。您还可以利用新的GPU加速显示系统核心来获得设计的准确视图,而又不会破坏您的创意流程。GPU渲染增强了预览回放性能,并为您提供了清晰,详细的项目实时预览。

增强的EXR工作流程

现在,您可以将分层的EXR文件作为合成文件导入,以加快合成过程。它使您能够将多个效果应用于合成图层,而无需先执行复杂的设置过程。您可以单独处理每个图层并应用效果,以使渲染在其环境中看起来更自然。改进的性能使处理大型文件的响应速度更快。

- 将时间码值从合成写入标头信息

- 现在,它包括Cryptomatte。

- 直接将alpha写入EXR文件。

更快的形状

此版本的After Effects在处理形状以加快创意迭代时提供了改进的响应能力。通过改进对分组控件的访问,可以更轻松地导航和管理大量形状。

- 包含形状图层的项目总体上提高了性能。

- 现在,您可以右键单击以对形状图层进行分组或取消分组。在“ 时间轴”面板中选择多个形状,右键单击并选择分组/取消分组形状。另一个选项是在预览窗口中选择多个形状,单击鼠标右键,然后从“ 蒙版和形状”路径中使用“分组/取消分组”。

图形和文字增强

此版本的After Effects具有多个图形和文本增强功能。

下拉菜单控制效果

作为After Effects迁移创建者,请使用新的“ 下拉菜单控件” 效果将项目中图层的属性连接到下拉菜单。在早期版本中,After Effects使您可以将图层的属性连接到滑块和复选框,以在项目中驱动动画。Mogrt创建者还共享滑块和复选框作为可编辑控件,以更改Premiere Pro中Mogrt的属性。

但是,对于更复杂和冗长的动画,滑块和复选框可能并不总是很直观。例如,您必须将一周的7天连接到不同的颜色。您可以使用日期列表创建一个下拉菜单,并使用颜色列表创建另一个菜单,以便在编辑时更容易选择。您还可以在表达式,运动图形模板和“主属性”中引用下拉菜单。通过此菜单,可以轻松一次调整多个设置,并设计模板,这对于Premiere Pro中的编辑人员而言更加容易。

https://mac.orsoon.com/Mac/174607.html

使用表达式编辑文本属性

现在,您可以使用表达式对项目中的文本属性进行全局更改。当您处理任何文本表达式和文本时,新表达式可以控制文本样式和文本本身。例如,您的项目具有主标题和结尾标题,并且您希望始终使用统一的文本样式。为此,使用表达式将标题链接在一起,并立即更新其样式。单个文本层的参考属性,可轻松在整个合成中应用更改。这使您可以在After Effects和Mogrts中的多个文本层之间保持字体,大小和样式同步。

替代文字矩形

- 如果在文本“ 编辑属性”对话框中为文本控件启用了“ 备用文本框”后,创建了After Effects Mogrt ,请使用指定的备用层为该文本层确定文本rect。

- 在Premiere Pro中,将此替代文本矩形用于该文本层,红色悬停矩形是替代文本的大小或位置。在红色悬停矩形内单击,将激活该aeText上的文本编辑。

- 后备文本框信息存储在After Effects Mogrt中,并序列化到After Effects项目。

- 当After Effects计算要在Premiere Pro程序监视器中编辑的文本矩形时,如果已设置,它将使用备用图层。

表情改善

此版本的After Effects提供了以下表达改进:

表达式编辑器的改进

- 现在,您可以使用新的滚动功能来防止在通过键入返回字符调整框大小时滚动调整不正确。

- 如果变量以数字开头,则防止数字在自动完成列表中匹配。更智能的自动完成功能可避免覆盖右方括号和引号。

- 现在,您可以缩放Hi-DPI显示的字体大小。

- 图形编辑器现在为所有打开的图形编辑器提交首选项更改。

- 如果启用语法突出显示,则UI中的折叠图标按钮现在将使用默认和背景色,或行号颜色和背景色。

表达表现的改善

- After Effects现在尝试检测在整个合成过程中不会改变的表达式,并且仅计算一次该表达式。加载您喜欢的表达式填充的伴奏并体验改进的性能。

- 现在,使用posterizeTime(0)的任何表达式对于整个comp仅计算一次,而不是在每个帧上计算一次。

扩展格式和更好的播放支持

新格式支持包括Canon XF-HEVC。处理10位H.265 HD / UHD和HEVC HD / UHD文件时,体验更好的播放效果。还提供了改进的ProRes解码性能。此外,还可以使用带有增量帧的MJPEG和动画编解码器文件的新本机支持访问旧版QuickTime文件。

新的Cineware渲染器和Cinema 4D Lite R21

此版本的After Effects引入了新的Cinema 4D Lite R21。下面列出的是详细信息:

- 当您安装After Effects时,After Effects安装程序会将Maxon Cinema 4D R21文件夹安装在您常用应用程序位置的磁盘上。

- 此文件夹包括Cinema 4D Lite R21。首次启动时,您需要按照屏幕上的说明创建一个Maxon用户帐户。当您通过Cineware启动时,也可能会以试用模式启动完整版的Cinema 4D。

- 需要一个帐户来启动Cinema 4D,但不需要使用Cineware或Cinema 4D 3D渲染器在After Effects中进行渲染。

内容感知填充以改进视频

借助新的性能改进并减少了内存使用,可以更快,更有效地从视频中删除不需要的对象。

其他增强

- 系统兼容性报告 - After Effects检测到并提醒您有关计算机上使用的特定硬件和较旧的硬件驱动程序的任何已知问题。如果您收到问题警报,但您认为它无效,请提交错误,以便我们直接检查兼容性问题。

- Mac上的OpenCL支持已删除。请使用金属或软件渲染。

- After Effects现在不支持光线追踪的3D渲染器。

- 预览在其中缓存了所有帧(或在启用回放之前缓存帧)的comp时,即使与UI交互,也应保持目标comp帧率。

- 从EXR文件读取时更好地遵守本机FPS

- 内容感知填充更新:

内存使用量减少了66%。

性能提高了10-25%。

修复了第一次使用Content Aware Fill时显示的警告对话框。

修复了少量透明度可能导致参考框架出现问题的问题。

- 选择标签组不会选择害羞的图层,现在也可以从“编辑”菜单中使用。

- 修复了在After Effects中报告为丢帧的非丢帧时间码EXR序列。

- 更新了“另存为以前的版本”以支持AE版本15和16。

- 形状层:Polystar不再卡在0内半径处。

- 更新了Photoshop导入库。确保您的Photoshop文件导入并正确显示在After Effects中。

- 更新到MacOS渲染以使用Metal并开始弃用OpenGL。

- 现在,在合成中拖动时,参考线和标尺会捕捉到整个像素。如果需要较小的增量,请右键单击指南以设置特定值。

- Mocha插件已更新为最新版本。