我建议你看看Angular Elements,更具体地说是createCustomElement。这将帮助您准确地实现您所需要的。
我可以给你一个简短的指南,告诉你你可以做什么。
My Github Repo for example
1) 首先是安装@angular/elements
npm i @angular/elements --save
2) 此步骤包括修改您的app.module.ts。如果您只想构建一组选定的组件(自定义日期选择器、数字输入等),您将不得不暂时删除 bootstrap: [ ] 并将其替换为 @ 987654327@。在 entryComponents 中,您将放置您想要构建的自定义组件。
entryComponents: [MyCustomDatePickerComponent, CustomButtonComponent]
3) 现在是时候告诉 Angular 引导您的自定义组件了。您还必须为自定义组件定义选择器。您将在注入它们的任何其他应用程序中使用该选择器调用它们。例如:<my-button-element></my-button-element>
export class AppModule {
constructor(private injector: Injector) {}
ngDoBootstrap() {
const el = createCustomElement(CustomButtonComponent,
{ injector: this.injector });
customElements.define('my-button-element', el);
const el2 = createCustomElement(MyCustomDatePickerComponent,
{ injector: this.injector });
customElements.define('custom-date-picker', el2);
}
}
4) 构建组件 - 如果您运行ng build --prod,您将获得多个文件。我们希望将这些文件合并为一个,以便更轻松地使用和注入我们构建的自定义元素。有两个软件包可以帮助我们做到这一点。 npm install --save-dev concat fs-extra
在您的应用程序的root 中创建一个elements-build.js 并粘贴它。 (它会将构建输出合并到一个.js 和.css 文件中,并将它们放在root/elements 文件夹中。
const concat = require('concat');
const fs = require('fs-extra');
(async function build() {
// Instead of /CustomElements/ put your project name - just check a dist folder to see how its formatted and make it that way
const files = [
'./dist/CustomElements/runtime-es2015.js',
'./dist/CustomElements/polyfills-es2015.js',
'./dist/CustomElements/main-es2015.js'
];
await fs.ensureDir('elements');
await concat(files, 'elements/myCustomElements.js');
await fs.copyFile(
'./dist/CustomElements/styles.css',
'elements/styles.css'
);
})();
5) 在你的 package.json 添加
"build:elements": "ng build --prod --output-hashing none && node elements-build.js",
6) 就是这样。您已经构建了自定义元素,并且可以在其他 Angular 应用程序甚至非 Angular 应用程序中的任何地方重用它们。您唯一需要做的就是导入您刚刚创建的.js 和.css。您甚至可以像往常一样使用 Input() 和 Output()。
<custom-date-picker dateTitle="My Date Title"></custom-date-picker>
注意:
如果您决定将它导入另一个 Angular 应用程序,您可能会遇到zone.js 的问题,因为它将被导入两次。解决方案是只导入一次(无论是从核心应用程序还是自定义元素)。