钻研起因
- ng library生成的模块,尽管有构建过程,实际上仅仅进行了一次繁难的包装,在我的项目中还要走一遍构建流程(尽管有metadata,然而还要剖析一遍...)
- 冀望相似jquery那种,引入一个链接就能够应用,缩小编译时的工夫
改版阐明
- 仅仅是为了反对aot模式的library打包,启动ivy会间接构建能够用的模块,所以此我的项目的钻研,应该有点
过期
了 - 原意是将library打包输入为构建好的ngfactory模块
- 目前绝大部分曾经胜利,惟一bug(已知)应该是ngstyle也就是style不能应用,无奈输入ngstyle
- js间接引入 能够实现的就是近程路由技术,近程模块技术
- 传统引入办法,被引入构建时,依然会从新构建一遍ngfactory,如果要批改,预计要间接批改angular局部包进行反对
应用阐明
{ "extends": "../../tsconfig.json", "compilerOptions": { "outDir": "../../out-tsc/lib", "target": "es2015", "declaration": true, "inlineSources": true, "types": [], "lib": [ "dom", "es2018" ] }, // 这里参考设置 "angularCompilerOptions": { // 必须 "annotateForClosureCompiler": false, // 必须 "skipTemplateCodegen": false, "strictMetadataEmit": true, "fullTemplateTypeCheck": true, "strictInjectionParameters": true, "enableResourceInlining": true, // 必须 "enableIvy":false }, "exclude": [ "src/test.ts", "**/*.spec.ts" ]}
- 将此分支构建当前npm link替换掉原来的
ng-packagr
后,就能够应用了(失常构建流程)
实现原理
- 首先下面的tsconfig设置是要保障代码应用默认的emit形式,既默认输入形式
- 而后在代码中(本我的项目中)将es5的默认配置正文掉,使得和es2015输入统一(umd包是会依据es5打包的)
- 最初通过逻辑,将输入的ngfactory文件退出到导出中(如果不退出,那么umd构建依然不蕴含)
调用构建包
- 间接通过js引入,而后相似动静生成模块那样就Ok了
/**LibAotModuleNgFactory 这个就是通过引入的umd包中的导出*/ const ref = LibAotModuleNgFactory.create(this.inject); console.log(ref); const fac = ref.componentFactoryResolver.resolveComponentFactory( ref.instance.entry ); console.log(fac); this.viewContainerRef.createComponent(fac);
- 通过路由援用
loadChildren
形式,间接援用ngfactory
未测试,然而ng源码的测试用例中能够应用
已知问题(因为占用工夫过多,曾经没精力解决了,违心搞的大牛能够试试)
- 不能应用style,因为没有导出ngstyle文件
- 援用构建好的library后,依然会在构建时生成ngfactory,不晓得是ngfactory有非凡的援用办法,还是须要改ng源码,进行一些重定向或者移除替换操作(因为externals只会移除局部,html模板依然会打进去)
代码地址