我编写了一个 NPM 模块,供在使用 reflect-metadata
的 SharePoint 框架 Web 部件中使用
import "reflect-metadata";
export function someDecorator(name: string): ClassDecorator {
return target => {
Reflect.defineMetadata("MyDecorator", name, target);
}
}
这几个月使用得很好,直到昨天我的 spfx 应用程序突然开始失败:
NonErrorEmittedError: (Emitted value instead of an instance of Error) Cannot find source file 'Reflect.ts': Error: Can't resolve './Reflect.ts' in '/mnt/tmp/my-webpart/node_modules/reflect-metadata'
at emitWarning (/mnt/tmp/my-webpart/node_modules/webpack/lib/NormalModule.js:117:16)
at /mnt/tmp/my-webpart/node_modules/source-map-loader/index.js:64:7
at onError (/mnt/tmp/my-webpart/node_modules/enhanced-resolve/lib/Resolver.js:65:10)
at loggingCallbackWrapper (/mnt/tmp/my-webpart/node_modules/enhanced-resolve/lib/createInnerCallback.js:31:19)
at runAfter (/mnt/tmp/my-webpart/node_modules/enhanced-resolve/lib/Resolver.js:158:4)
at innerCallback (/mnt/tmp/my-webpart/node_modules/enhanced-resolve/lib/Resolver.js:146:3)
at loggingCallbackWrapper (/mnt/tmp/my-webpart/node_modules/enhanced-resolve/lib/createInnerCallback.js:31:19)
at next (/mnt/tmp/my-webpart/node_modules/tapable/lib/Tapable.js:252:11)
at /mnt/tmp/my-webpart/node_modules/enhanced-resolve/lib/UnsafeCachePlugin.js:40:4
at loggingCallbackWrapper (/mnt/tmp/my-webpart/node_modules/enhanced-resolve/lib/createInnerCallback.js:31:19)
at runAfter (/mnt/tmp/my-webpart/node_modules/enhanced-resolve/lib/Resolver.js:158:4)
at innerCallback (/mnt/tmp/my-webpart/node_modules/enhanced-resolve/lib/Resolver.js:146:3)
at loggingCallbackWrapper (/mnt/tmp/my-webpart/node_modules/enhanced-resolve/lib/createInnerCallback.js:31:19)
at next (/mnt/tmp/my-webpart/node_modules/tapable/lib/Tapable.js:252:11)
at innerCallback (/mnt/tmp/my-webpart/node_modules/enhanced-resolve/lib/Resolver.js:144:11)
at loggingCallbackWrapper (/mnt/tmp/my-webpart/node_modules/enhanced-resolve/lib/createInnerCallback.js:31:19)
这是通过构建与两天前运行良好的完全相同的代码而得到的。
那么什么可能导致这种情况呢?为什么它突然寻找一个不存在的 Reflect.ts
文件?而且,最重要的是,我怎样才能让它再次工作?
最佳答案
如果您手动添加Reflect.ts到 /node_modules/reflect-metadata
您的构建应该会成功。
我选择将 Reflect.ts 复制到源代码中并导入此本地文件,而不是“reflect-metadata”
。
此解决方案的注意事项:
- 发生了 tslint 警告,因此我将
/* tslint:disable */
添加到文件顶部。 - ts 错误位于文件“类型‘符号’不能用作索引类型。”由于 spfx 使用的 TS 版本与 Reflect-metadata 使用的版本不同。我将
map[key]
替换为map[key as string | number]
来消除错误。
或者,您可以 fork Reflect-metadata 并发布包含 Reflect.ts 的更新的 npm 模块。
关于javascript - Sharepoint 框架中的反射元数据突然崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49753315/