如何在外部Node项目中访问Angular组件类的reflect-metadata元数据?
解决方法
方案一:调整Angular库构建配置,输出纯ES模块
Angular默认打包的库会绑定大量框架运行时代码,非Angular项目根本用不上。你得改库的构建配置,生成只保留类和自定义元数据的纯ES包:
- 打开库的
ng-package.json,添加"flatModuleFile": "your-library-name",并把"format"设为["esm2020"],确保输出的是未经Angular编译处理的原始ES模块。 - 重新构建发布:
ng build your-library,然后把新包发布到你们的私有npm源。
方案二:直接导入库的ES源码文件
如果暂时没法改库的构建配置,试试直接导入库的未编译源码(前提是库发布时包含了src目录):
// 跳过编译后的Angular包,直接导入组件源文件 import { ComponentOne } from '@org/the-library/src/lib/component-one.component'; console.log(Reflect.getMetadataKeys(ComponentOne));
同时给Node项目的tsconfig.json加这些配置:
{ "compilerOptions": { "module": "NodeNext", "moduleResolution": "NodeNext", "target": "ES2020", "experimentalDecorators": true, "emitDecoratorMetadata": true } }
别忘了安装reflect-metadata,并在项目最开始导入:
import 'reflect-metadata';
方案三:用ts-node直接运行,别用Webpack打包
Webpack会把Angular库的所有依赖一股脑打包进来,导致引入不必要的Angular运行时。换成ts-node直接跑TypeScript文件更简单:
- 装依赖:
npm install ts-node typescript reflect-metadata --save-dev - 配置
tsconfig.json(和方案二的配置一致) - 写入口文件
index.ts:
import 'reflect-metadata'; import { ComponentOne } from '@org/the-library'; console.log(Reflect.getMetadataKeys(ComponentOne));
- 运行:
ts-node index.ts
报错原因说明
你碰到的错误是因为Angular库默认打包的包里有需要JIT编译器处理的注入器元数据,但非Angular项目里没有@angular/compiler,所以运行时解析失败。我们要做的就是绕开Angular的这些依赖,只拿自己用reflect-metadata加的自定义元数据。
内容的提问来源于stack exchange,提问作者Radu
相关产品推荐
相关产品推荐

