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.pswp.cn/news/253767.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253767.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253767.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(轉) android里,addContentView()動態增加view控件,并實現控件的頂部,中間,底部布局...

http://blog.csdn.net/bfboys/article/details/52563089轉載于:https://www.cnblogs.com/zhangminghan/p/6182909.html

verilog仿真——$test$plusargs 和 $value$plusargs

VERILOG的參數可以用define和parameter的方式定義&#xff0c;這種方法要求我們在編譯前將變量必須定義好&#xff0c;編譯完成之后再也不能修改&#xff1b; 然而&#xff0c;有時候我們在進行仿真時&#xff0c;需要從外部傳遞參數&#xff0c;這個要求怎么滿足呢&#xff1…

盧卡斯定理

盧卡斯定理:解決一類組合數取模問題 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…

內核理解

在純技術方面&#xff0c;內核是硬件與軟件之間的一個中間層。其作用是將應用程序的請求傳遞給硬件&#xff0c;并充當底層的驅動程序&#xff0c;對系統中的各種設備和組件。內核啟動init程序作為第一個進程&#xff0c;該進程負責進一步的系統初始化操作&#xff0c;并顯示登…

loadrunner中對https證書的配置

1、準備好網站的證書&#xff0c;一般證書是cer格式&#xff1b; 2、因為loadrunner只支持pem格式的證書&#xff0c;所以要將證書轉換格式&#xff0c;利用openssl工具&#xff1b;&#xff08;或者直接讓開發提供pem格式的證書&#xff09;3、得到pem格式的證書之后&#xff…

Android 9 Pie震撼來襲 同步登陸WeTest

作者&#xff1a;We Test小編商業轉載請聯系騰訊WeTest獲得授權&#xff0c;非商業轉載請注明出處。原文鏈接&#xff1a;wetest.qq.com/lab/view/40…WeTest 導讀2018年8月7日&#xff0c;Google對外發布最新 Android 9.0 正式版系統&#xff0c;并宣布系統版本Android P 被正…

Datapath綜合代碼規范(Verilog)

一、一般準則 1、有符號數運算 利用類型“signed”完成有符號數運算&#xff0c;而不是用無符號數模擬有符號數運算。這樣可以得到更好的QoR。在資源報告中檢查操作數的類型和大小。 2、符號/零擴展 盡量不要手動擴展。verilog利用signed/unsigned會自動完成擴展。這樣代碼可…

Linux下V4L2編程小結

http://www.360doc.com/content/12/0318/16/532901_195392228.shtml :davind dm365linux移植 http://www.embedhq.org/html/jsbw/2010/0425/390.html :Linux下V4L2編程小結

百(垃)度(圾)之星初賽B hdu6114

Chess 題意&#xff1a;中文題 思路&#xff1a;其實就是在n個格子上放m個棋子&#xff08;n>m&#xff09;&#xff08;xjb套Lucas的板子... AC代碼&#xff1a; #include "iostream" #include "string.h" #include "stack" #include "…

variable 'xxx' unsafe in 'case'的處理

問題描述&#xff1a; case get(?Player_LoopTaskInfo) of{TargetCnt, TaskStar, TaskExp} ->ok;_ ->throw("not_found_loop_task_info") end 在case語句中&#xff0c;這樣寫&#xff0c;編譯時&#xff0c;會提示變量unsafe&#xff0c;解決編譯器報錯的…

SDUT 3347 數據結構實驗之數組三:快速轉置

數據結構實驗之數組三&#xff1a;快速轉置 Time Limit: 1000 ms Memory Limit: 65536 KiBProblem Description 轉置運算是一種最簡單的矩陣運算&#xff0c;對于一個m*n的矩陣M( 1 < m < 10000,1 < n < 10000 )&#xff0c;它的轉置矩陣T是一個n*m的矩陣&…

linux設備和驅動加載的先后順序

Linux驅動先注冊總線&#xff0c;總線上可以先掛device&#xff0c;也可以先掛driver&#xff0c;那么究竟怎么控制先后的順序呢。 Linux系統使用兩種方式去加載系統中的模塊&#xff1a;動態和靜態。 靜態加載&#xff1a;將所有模塊的程序編譯到Linux內核中&#xff0c;由do_…

CMOS 圖像傳感器——Skipping 和 Binning 模式

在通常的CMOS讀取方式中&#xff0c;由于像素讀取規模的差異&#xff0c;不同的分辨率對應不同的幀率。在通道帶寬固定的前提下&#xff0c;想要提高幀率就要考慮是否需要縮小視野&#xff08;外圈裁切&#xff09;。若不希望視野縮小&#xff0c;需要減少采樣的分辨率。 常用的…

DAVINCI DM365-368中 linux-2.6.32的移植

http://www.360doc.com/content/12/0318/16/532901_195392228.shtml 很詳細的一篇文章&#xff0c;在此感謝了&#xff01; http://www.rosoo.net/a/201001/8316.html DM系列芯片外設詳細介紹

Jacoco--測試覆蓋率工具

介紹JaCoCo&#xff08;Java Code Coverage&#xff09;是一種分析單元測試覆蓋率的工具&#xff0c;使用它運行單元測試后&#xff0c;可以給出代碼中哪些部分被單元測試測到&#xff0c;哪些部分沒有沒測到&#xff0c;并且給出整個項目的單元測試覆蓋情況百分比&#xff0c;…

HTML 標記大全參考手冊

1.文件結構 文件類型 <HTML></HTML> &#xff08;放在文檔的開頭與結尾&#xff09; 文件主題 <TITLE></TITLE> &#xff08;必須放在「文頭」區塊內&#xff09; 文頭 <HEAD></HEAD> &#xff08;描述性資料&#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…

制作NFS

最近學習NFS&#xff0c;用本地測試. 以下是我的測試過程 環境 ubuntu 10.4 vm 7.1 終端 ifconfig 得到 ubuntu資料 INET ADDR 192.168.0.4 BCAST 192.168.0.255 MASK 255.255.255.0 一 安裝NFS $ sudo apt-get install nfs-kernel-server $ sudo apt-get install nfs…

【筆記篇】C#筆記2

返回目錄&#xff1a;目錄請戳這里~ C#數組 基本概念不提。。int[] a; bool[] b new bool[10]; float[] c {0.5, 57.0, 233.3, 12345.67 }; double[] d new double[/*3*/]{233.33, 1926.0817, 4396.0 }; 然后數組和指針有很大的不同。。。 Array類不會用…… 有多維數組和…