我可以拥有在单个 js 文件中发出 Angular 元素的 Angular 库吗?

2024-03-03

我开始接触 Angular 6 位,并且对 Angular Elements 以及新的库项目非常感兴趣。我即将开展一个项目,可能需要这两个新功能。

我需要创建可跨 Web 框架重用的自定义 UI 组件,但我也希望获得在 Angular 项目中使用它们的一流支持。我已经关注了这个tutorial https://medium.com/@tomsu/building-web-components-with-angular-elements-746cd2a38d5b并有一个 angular6 应用程序来注册自定义元素,并将 webpack 捆绑包连接到单个文件中。然后我可以在纯 html 页面中使用该单个 js 文件,一切都运行良好。

关键点是在库项目中创建这些自定义元素会很棒。这样我就可以在我们的内部 npm 注册表上分发我的库,以及构建包含所有自定义元素的 js 并将其部署在 CDN 上。

是否可以在新的库项目中构建 Angular Elements?


介绍

我将在这里描述的是一种方法单一回购协议包含一个主 Angular 应用程序(主机)和一个或多个角元素基于应用程序(儿童)。您将能够通过将所有元素捆绑在一起来使用主应用程序中的元素,或者您可以使用 npm 打包元素并将其作为 npm 依赖项导入。这在很大程度上基于曼弗雷德·斯泰尔 (Manfred Steyer) 在他的著作中所描述的内容。Angular Elements 博客系列 https://www.softwarearchitekt.at/post/2018/07/13/angular-elements-part-i-a-dynamic-dashboard-in-four-steps-with-web-components.aspx所以我建议你阅读这篇文章以了解一些背景信息并填补一些缺失的部分。

但请注意,目前我在此描述的方法无法避免多个应用程序之间的重复依赖关系。

Solution

在现有的 Angular 项目中,您可以使用以下命令创建子应用程序ng generate application <name>. See 文档 https://angular.io/cli/generate#application-command更多细节。

将您新创建的项目转变为角元素 https://angular.io/guide/elements.

为了帮助您构建项目,请查看 Angular CLI 扩展ngx-build-plus here https://github.com/manfredsteyer/ngx-build-plus。就我而言,我没有应用中描述的大部分食谱ngx-build-plus文档,因为它是关于跨项目共享依赖项的,我不会在这里详细说明。我所需要的就是下面的内容。

构建这个架构的步骤大致是:

  • ng add ngx-build-plus
  • ng add ngx-build-plus --project <name>
  • create npm scripts:
    • 对于元素项目:"build:client-a": "ng build --prod --project client-a --single-bundle true --output-hashing none --vendor-chunk false"
    • 对于主机应用程序,常规构建命令如ng build, ng serve
  • 将生成的 elements JS 文件的路径添加到主机应用程序构建配置中 - 将其添加到脚本属性中angular.json
  • 将自定义元素 polyfill JS 文件的路径添加到元素应用程序构建配置中 - 将其添加到 script 属性中angular.json。每个应用程序都有自己的配置和脚本条目。

构建 elements 项目后,其单个文件包通常会转到./dist/<project-name>/。您可以创建一个npm 包从该内容中提取并将其用作库。

Notes

  • 将子应用程序与主机应用程序捆绑在一起的两种方法。在主机应用程序脚本配置中,您可以将子应用程序的路径添加到dist/文件夹或添加子应用程序的路径node-modules/文件夹(当子应用程序作为 npm 包导入时)。

  • 创建一个角度library而不是 Angular应用以此目的不管用因为 CLI 生成的 Angular 库不能在 Angular 项目之外使用 - 这在文档中不是很清楚。

  • 确保该组件不依赖于父应用程序你应该没问题。我通过将依赖项转换为组件输入或通过执行以下操作来处理依赖项内容投影.

  • 当你有一个A组份其中包括一个B组份。你想转A组份成一个有角度的元素但是B组份在您的应用程序的多个部分中使用。如果您不想保留两份副本,一份在申请表中,另一份在您的A组份图书馆,这可能是一个很好的例子利用内容投影 https://www.softwarearchitekt.at/post/2018/10/31/content-projection-with-slots-in-angular-elements-7.aspx (aka Web 组件插槽 https://developer.mozilla.org/en-US/docs/Web/HTML/Element/slot).

  • 请注意,我还没有在生产中这样做,它不是您所谓的稳定架构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以拥有在单个 js 文件中发出 Angular 元素的 Angular 库吗? 的相关文章

随机推荐

  • 将自定义菜单项添加到 Finder 上下文菜单

    如何将自定义菜单项添加到 Finder 中文件的上下文菜单 不幸的是 Internet 和 Stack Overflow 上的大多数信息在 10 6 中不起作用或者太有限 例如 Automator 不允许您动态创建项目或创建子菜单 我知道仍
  • 在 Python 中建立 Web 连接的这两种方法之间有什么实际区别?

    我注意到有几种方法可以启动 http 连接以进行网络抓取 我不确定某些是否是更新的编码方式 或者它们是否只是具有不同优点和缺点的不同模块 更具体地说 我试图了解以下两种方法之间有什么区别 您会推荐什么 1 使用urllib3 http Po
  • 1x1 Android 小部件在 WXGA720 屏幕上显示为 2x2 小部件

    我正在创建一个 1x1 Android 小部件 我为每种屏幕密度设计了图像 如下所示 ldpi 120 DPI 72 120 160 54 x 54 pixels mdpi 160 DPI 72 160 160 72 x 72 pixels
  • 如何限制 Web Api 中的请求?

    我正在尝试通过以下方式实现请求限制 在 ASP NET MVC 中实现请求限制的最佳方法 https stackoverflow com questions 33969 best way to implement request throt
  • 如何在 Entity Framework Core 中实现环境事务?

    我需要在两种模型下实现事务 使用两个独立的有界上下文 所以代码如下 using TransactionScope scope new TransactionScope Operation 1 using var context1 new C
  • malloc() 和 free() 在哪里存储分配的大小和地址?

    在哪里malloc and free 存储分配的地址及其大小 Linux GCC 我读过一些实现将它们存储在实际分配的内存之前的某个位置 但我无法在测试中确认这一点 背景 也许有人对此有另一个提示 我正在尝试分析一个进程的堆内存 以确定另一
  • 如何删除精明图像中的直线或非曲线

    I have a canny edge image 我想删除除了看起来像半圆 椭圆或 C 的线之外的所有线 尝试过霍夫圆变换 它检测所有曲线 不需要 一个简单的方法是 查找连接的组件 找到最小定向边界框 计算盒子的长宽比 并检查是否太大拉长
  • capistrano 顺序重启

    我将 capistrano 配置为跨三台物理服务器进行部署 我想将重新启动任务配置为按顺序转到每个服务器并重新启动应用程序 而不是立即转到所有服务器的默认方式 这是当前的部署任务 namespace deploy do task start
  • ASP.NET MVC 路由失败。这是错误还是极端情况?

    我有一个 ASP NET MVC 3 应用程序 用户可以在其中发布类似于 bla bla如果会更好雅达雅达雅达 对于建议详细信息页面 我定义了一个很好的搜索引擎优化友好路线如下 routes MapRoute null suggestion
  • Espresso webView webkeys 在 Android 8.0 模拟器上失败

    我正在从 Espresso Web 运行一些测试代码 Test public void typeTextInInput clickButton SubmitsForm Lazily launch the Activity with a cu
  • 如何使用 tvOS 打开另一个应用程序?

    Does UIApplication openURL work NSString iTunesLink http www youtube com watch v TFFkK2SmPg4 BOOL did UIApplication shar
  • 如何创建一个使用 gzip 压缩静态文件的简单节点服务器

    我已经在这几个小时了 我做的第一件事就是跟随this http blog modulus io nodejs and express static content教程有这个代码 var express require express var
  • 在 DateTimePicker 中设置小时超过 23

    在我的项目中 我需要使用格式为 HH MM 的 Timepicker 但我将它用作持续时间 而不是时间 所以是否可以将 HH 增加到 99 而不是停留在 23 我使用此页面中的日期时间选择器 http tarruda github io b
  • 以干净的方式打破 javascript 承诺链

    我正在尝试将承诺串联起来 这样如果一个承诺被拒绝 链条就会断裂 我跟随一个人的线索上一个SO问题 https stackoverflow com questions 20714460 break promise chain and call
  • (413) 请求实体太大 |上传预读大小

    我使用 NET 4 0 编写了一个 WCF 服务 该服务托管在我的 Windows 7 上x64带有 IIS 7 5 的终极系统 其中一个服务方法有一个 对象 作为参数 我正在尝试发送一个包含图片的字节 只要该图片的文件大小小于约 48KB
  • 使用 webpack 配置 CSS 模块时出错

    我正在尝试使用 webpack 配置 CSS 模块 但出现错误 我已经检查了 stackoverflow 上的其他答案 但到目前为止 没有一个解决方案对我有用 我已经按照文档的建议添加了加载程序 但它仍然显示错误 这是我的 webpack
  • 在 jQuery mobile 中创建侧边栏

    通常 当您使用 jQuery mobile 创建 data role page 元素时 它会占据整个查看区域 因此 我不明白如何创建侧边栏 我想模拟以下内容 但查看源代码没有多大帮助 http jquerymobile com demos
  • 嵌套字典到 MultiIndex pandas DataFrame(3 级)

    我想对 3 级嵌套字典执行相当于此操作 嵌套字典到多索引数据框 其中字典键是列标签 https stackoverflow com questions 24988131 nested dictionary to multiindex dat
  • 来自 CALayer 的 CGImage(或 UIImage)

    我创建了一个CALayer 我向图层添加了几个形状 但最终我只有一个 CALayer 并且将其添加到 CGImage 时遇到了很多麻烦 我找到了一些参考资料 CALayer renderInContext ctx 但我不知道如何实现它 以前
  • 我可以拥有在单个 js 文件中发出 Angular 元素的 Angular 库吗?

    我开始接触 Angular 6 位 并且对 Angular Elements 以及新的库项目非常感兴趣 我即将开展一个项目 可能需要这两个新功能 我需要创建可跨 Web 框架重用的自定义 UI 组件 但我也希望获得在 Angular 项目中