Angular Elements 组件在非angular 页面中使用的DEMO

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、Angular Elements 介绍

      Angular Elements 是伴随Angular6.0一起推出的新技术。它借助Chrome浏览器的ShadowDom  API,实现一种自定义组件。 这种组件可以用Angular普通组件的开发技术进行编写,学习成本低,当它构建好后生成一个打包的js文件。如果页面引入该Js文件 ,就相当于在页面中新增了一个标签,所以在任意框架中都可以使用新标签,就像它是原生div一样。

       ShadowDom  API  是谷歌自己一直强推的API,也一直未标准化的技术。2013年推出的chrome25中,就支持Shadow Dom v0的API,至今都没有其它浏览器附和谷歌的。2016年的chrome53时,谷歌又推出了Shadow Dom v1的API。v1版本似乎将成正式标准,就连Edge都是都示正在考虑。无论v0,v1版本,现在都是草案的状态,距离正式标准还很远。幸运的是,现在有个项目@webcomponents/custom-elements提供polyfill技术方案,能让其它浏览器提前用上该技术。

二、Angular Elements 使用实战

     前不久看到项目angular-elements-dashboard :支持动态加载模块和动态加载外部的模块。其中加载动态外部模块就是先编译一个angular elements项目,然后动态把该bundle.js插入到页面中。于是我就尝试一下,看这个构建的angular elements 文件到底如果引入一个空白的页面中,引入后的组件在浏览器中又是如何呈现的。

    Demo 源文件 在 码云:https://gitee.com/40288193/Angualr-elements-demo  

     页面结构:     

f14fdab542f8403b5d8d32278fb247b4c59.jpg

demo.html                                                                                            主文件是一个标准的html5页面

external-dashboard-tile.emulated.js 

external-dashboard-tile.native.js 

 是angular elements 用两种组件封装的方式打包的结果,分别是ViewEncapsulation.Emulated和                 ViewEncapsulation.Native封装。它们也是今天的测试主要对象。
custom-elements.min.js @webcomponents/custom-elements 的文件,是Shadow Dom v1 的polyfill文件 。 
如果用chrome53以后的浏览器的话,可以不引入它。如果是其它浏览器,它是必须的。
native-shim.js 如果angular elements项目打包时,tsconfig.json中,
编译参数 target: "es5"时,  所有的class都被编译为function,此时就必须引入该文件。
编译参数 target:"es2015"或更高级的模块时,则不需要引入它。
根本原因是,Shadow Dom v1的api 只支持自定义元素是一个class类型,不能是一个function。
zone.js    angular依赖的文件

 

页面代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Angular Elements 演示Demo</title><link rel="stylesheet" href="./bootstrap.min.css">
</head>
<body class="container"><h1>Angular Elements 演示Demo</h1><div class="row"><h3>原生JS插入一个自定义元素</h3><div id="byJs"></div></div><div class="row"><h3>用jqyery插入一个自定义元素</h3><div id="byJquery"></div></div><script src="./zone.js"></script><script src="./custom-elements.min.js"></script><script src="./native-shim.js"></script><script src="./jquery.min.js"></script><script src="./external-dashboard-tile.native.js"></script><script>// 新引入的external-dashboard-tile元素,  它有三个属性a,b,c,它展示为一个表格// 原生JS插入const dom = document.createElement("external-dashboard-tile"), byJs = document.getElementById("byJs");dom.classList.add("col-sm-2");dom.setAttribute('a', '' + Math.round(Math.random() * 100));dom.setAttribute('b', '' + Math.round(Math.random() * 100));dom.setAttribute('c', '' + Math.round(Math.random() * 100));byJs.appendChild(dom);// Jquery 插入const $dom = $("<external-dashboard-tile>"), $byJquery = $("#byJquery");$dom.addClass("col-sm-2");$dom.attr("a", Math.round(Math.random() * 100));$dom.attr("b", Math.round(Math.random() * 100));$dom.attr("c", Math.round(Math.random() * 100));$byJquery.append($dom);// 定时去修改两个表格的某个列setInterval(function () {dom.setAttribute('b', '' + Math.round(Math.random() * 100));$dom.attr("a", Math.round(Math.random() * 100));}, 2000)</script>
</body></html>

效果:

  注意:上下两个组件中,a,b两个列是定时变化的。

三、Angular Elements应用页面的分析

        代码逻辑估计小学生也看的懂了,分别用原生JS 和 jquery 两种技术,生成<external-dashboard-tile>元素,并且设置元素的class 和 属性,最后插入到页面上。   最后写个定时器,分别用两种技术定时修改它们的一个属性

       当我引入external-dashboard-tile.emulated.js  文件时,它是angular模拟组件的方式插入页面的,就是自定义标签里直接嵌入了div,这种模式并不是真正的Shadow Dom ,它只是一种模拟手段,它通过引入_ng_content-c0的属性空间隔离css 样式。

当我引入external-dashboard-tile.native.js  文件时,就是用原生的方式引入了,看效果,页面上有了 #showdow-root节点,并且外部的bootstrap样式传递不进去了,造成组件的样式全无。

     总结一下,通过使用两个种方式操作自定义元素和以前学习的内置元素的概念一模一样。  那么就是说一个angular elements技术打包好的组件可以: build once ,run any framework!  这个黑科技还是让人惊喜的。  

     Angular Elements的开发技术和Angular普通组件是一致的,像Input属性,Output事件,  依赖注入的支持, 内容投影的支持(这个好像要用<slot> 来做)  ,总之并没有因为 Angular Elements需要脱离ng环境,没有Module 没有Route等支持,它就阉割功能,添加限制。没有,全部没有, 这一点谷歌还是良心。

四、Angular Elements应用后记

       组件封装方式分别是native,emulated 。按照以前看的文章说明,Native模式其实用的是Shadow Dom v0,并不是最新的技术,在2018.7.25号的6.1.0升级中,它又引入了新的封装方式ViewEncapsulation.Shadow 。它的目的是为了不改变Native的模式情况下,引入最新的Shadow Dom v1技术 ,而Native已经过时,不鼓励使用。详见  (#24718) 

      现在这种打包模式,对于一个最简单的组件,打包后体积是189kb,是非常之大的。据说伴随angular 7推出的ivy 渲染引擎能大大减小组件的构建体积,忘在哪个视频中看到说打包后可到10kb的量级,但现在找不到该说法的来源。现在angular的commit中,有一半都是关于ivy的提交,只需要大家静等angular 7.0的到来了! 

       现在相关资料还比较少,我也是看youtube视频学习的相关介绍,下面给大家几个学习资料

官方文档:https://www.angular.cn/guide/elements

视频 Elements in v6 and Beyond :https://www.youtube.com/watch?v=Z1gLFPLVJjY

示例项目angular-elements-dashboard:https://github.com/manfredsteyer/angular-elements-dashboard

转载于:https://my.oschina.net/u/1540190/blog/1929672

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卢卡斯定理

卢卡斯定理:解决一类组合数取模问题 A、B是非负整数&#xff0c;p是质数。AB写成p进制&#xff1a;Aa[n]a[n-1]...a[0]&#xff0c;Bb[n]b[n-1]...b[0]。 则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0]) modp同余 即&#xff1a;Lucas(n,m,p)c(n%p,m%p)*Luc…

loadrunner中对https证书的配置

1、准备好网站的证书&#xff0c;一般证书是cer格式&#xff1b; 2、因为loadrunner只支持pem格式的证书&#xff0c;所以要将证书转换格式&#xff0c;利用openssl工具&#xff1b;&#xff08;或者直接让开发提供pem格式的证书&#xff09;3、得到pem格式的证书之后&#xff…

Datapath综合代码规范(Verilog)

一、一般准则 1、有符号数运算 利用类型“signed”完成有符号数运算&#xff0c;而不是用无符号数模拟有符号数运算。这样可以得到更好的QoR。在资源报告中检查操作数的类型和大小。 2、符号/零扩展 尽量不要手动扩展。verilog利用signed/unsigned会自动完成扩展。这样代码可…

CMOS 图像传感器——Skipping 和 Binning 模式

在通常的CMOS读取方式中&#xff0c;由于像素读取规模的差异&#xff0c;不同的分辨率对应不同的帧率。在通道带宽固定的前提下&#xff0c;想要提高帧率就要考虑是否需要缩小视野&#xff08;外圈裁切&#xff09;。若不希望视野缩小&#xff0c;需要减少采样的分辨率。 常用的…

APB协议学习

APB(Advanced Peripheral Bus) 1、APB的概述与特点 APB主要用于低带宽的周边外设之间的连接&#xff0c;例如UART、1284等&#xff0c;它的总线架构不像AHB支持多个主模块&#xff0c;在APB里面唯一的主模块就是APB 桥。其特性包括&#xff1a;两个时钟周期传输&#xff1b;无…

私有协议栈开发

通信协议从广义上区分&#xff0c;可以分为公有协议和私有协议。由于私有协议的灵活性&#xff0c;它往往会在某个公司或者组织内部使用&#xff0c;按需定制&#xff0c;也因为如此&#xff0c;升级起来会非常方便&#xff0c;灵活性好。绝大多数的私有协议传输层都基于TCP/IP…

数字图像处理——2D降噪

图像降噪处理主要分为2D&#xff08;空域&#xff09;与3D降噪&#xff08;时域/多帧&#xff09;&#xff0c;而2D降噪由于相关的实现算法丰富&#xff0c;效果各异&#xff0c;有着丰富的研究价值。理解2D降噪算法的流程&#xff0c;也对其他的增强算法有很大的帮助&#xff…

项目开发(Require + E.js)

最近在做的几个项目&#xff0c;分别用了不同的框架跟方式&#xff0c;有个H5的项目&#xff0c;用了vue框架&#xff0c; 这个项目我还没有正式加入进去&#xff0c; 等手头的这个项目完成就可以去搞vue了&#xff0c; 现在手头的这个项目是一个招聘的项目&#xff0c; 用到了…

AHB协议学习

1. 简介 AHB(Advanced High Performance Bus)总线规范是AMBA(Advanced Microcontroller Bus Architecture) V2.0总线规范的一部分&#xff0c;AMBA总线规范是ARM公司提出的总线规范&#xff0c;被大多数SoC设计采用&#xff0c;它规定了AHB (Advanced High-performance Bus)、A…

数字图像处理——引导滤波

一、概述 引导滤波是由何恺明等人于2010年发表在ECCV的文章《Guided Image Filtering》中提出的&#xff0c;后续于2013年发表。引导过滤器根据局部线性模型原理&#xff0c;通过考虑引导图像的内容来计算过滤输出&#xff0c;引导图像可以是输入图像本身或另一个不同的图像。具…

Ubuntu 18.04换国内源

2019独角兽企业重金招聘Python工程师标准>>> 参考文档&#xff1a; https://blog.csdn.net/zhangjiahao14/article/details/80554616 https://blog.csdn.net/xiangxianghehe/article/details/80112149 1.复制源文件备份&#xff0c;以防万一 我们要修改的文件是sour…

数字后端——布图规划

布图规划&#xff08;floorplan&#xff09;与布局&#xff08;place&#xff09;在芯片设计中占据着重要的地位&#xff0c;它的合理与否直接关系到芯片的时序收敛、布线通畅、电源稳定以及良品率。所以在整个芯片设计中&#xff0c;从布图规划到完成布局一般需要占据整个物理…

利用SSH传输文件

在linux下一般用scp这个命令来通过ssh传输文件。 1、从服务器上下载文件scp usernameservername:/path/filename /var/www/local_dir&#xff08;本地目录&#xff09; 2、上传本地文件到服务器scp /path/filename usernameservername:/path 例如scp /var/www/test.php root19…

App WebView实例化

a&#xff0c;高级设置里的环境变量 jdk的配置 b&#xff0c;下载Google的sdk&#xff0c;里面直接包含eclipse 1&#xff0c;新建一个项目 2&#xff0c;起个名字 3&#xff0c;设么走不做&#xff0c;next 4&#xff0c;只操作选择显示的三种方式 5&#xff0c;next什么都不做…

[动态代理三部曲:下] - 从动态代理,看Retrofit的源码实现

前言 关于动态代理的系列文章&#xff0c;到此便进入了最后的“一出好戏”。前俩篇内容分别展开了&#xff1a;从源码上&#xff0c;了解JDK实现动态代理的原理&#xff1b;以及从动态代理切入&#xff0c;学会看class文件结构的含义。 如果还没有看过这俩篇文章的小伙伴&#…

数字后端——电源规划

电源规划是给整个芯片的供电设计出一个均勻的网络&#xff0c;它是芯片物理设计中非常关键的一部分。电源规划在芯片布图规划后或在布图规划过程中交叉完成,它贯穿于整个设计中&#xff0c;需要在芯片设计的不同阶段对电源的供电网络进行分析并根据要求进行修改。&#xff0c;主…

逆向project实战--Acid burn

0x00 序言 这是第二次破解 crackme 小程序&#xff0c;感觉明显比第一次熟练。破解过程非常顺利&#xff0c;差点儿是分分钟就能够找到正确的 serial&#xff0c;可是我们的目标是破解计算过程。以下将具体介绍。 0x01 初次执行 刚開始拿到 crackme 先执行程序。看看有哪些明显…

PyCharm使用技巧(六):Regullar Expressions的使用

2019独角兽企业重金招聘Python工程师标准>>> PyCharm v2018.2最新版本下载 使用正则表达式查找和替换文件中的文本 示例代码 使用正则表达式查找和替换字符串 假设您想用扩展标记<title> </title>替换元素&#xff08;title&#xff09;中的属性&#x…

jQuery笔记总结

来源于&#xff1a;http://blog.poetries.top/2016/10/20/review-jQuery/ http://www.jianshu.com/p/f8e3936b34c9 首先&#xff0c;来了解一下jQuery学习的整体思路 第一节 jQuery初步认知 jQuery概述 JQuery概念 javascript概念 基于Js语言的API和语法组织逻辑&#xff0c;通…

芯片生产流程

每个半导体产品的制造都需要数百个工艺&#xff0c;泛林集团将整个制造过程分为八个步骤&#xff1a;晶圆加工-氧化-光刻-刻蚀-薄膜沉积-互连-测试-封装。 一、晶圆加工 所有半导体工艺都始于一粒沙子&#xff01;因为沙子所含的硅是生产晶圆所需要的原材料。晶圆是将硅(Si)或砷…