Dynamics 365无法引用导出TypeScript类编译的JS函数问题问询
问题根因
当前tsconfig.json中module配置为ES2015,带export声明的TS文件会被编译为标准ES模块,内部声明的类、命名空间默认不会暴露到全局作用域;而Dynamics 365加载Web资源后,会从全局window对象上查找你配置的函数路径,因此会报找不到函数的错误。移除export后命名空间直接注册到全局,Dynamics可正常调用,但此时文件不属于标准模块,单元测试无法导入引用。
可行解决方案
方案1:代码层面兼容(改动最小,无需修改配置)
保留原有命名空间逻辑,新增导出声明供测试使用,同时手动将命名空间挂载到全局window供Dynamics调用,代码示例如下:
namespace Referral { export function OpenDialogOnHold(context: Xrm.Events.EventContext) { try { Xrm.Navigation.navigateTo( // 原有业务逻辑不变 ); } catch (exception) { console.error(exception); } } } // 导出命名空间,单元测试可直接导入使用 export default Referral; // 声明全局类型,避免TS类型报错 declare global { interface Window { Referral: typeof Referral; } } // 挂载到全局window,Dynamics表单可正常识别 window.Referral = Referral;
该方案无需修改Dynamics表单原有事件配置,单元测试中直接通过import Referral from '对应文件路径'即可导入函数进行测试。
方案2:修改编译配置适配(无需修改业务代码)
调整tsconfig.json的编译配置,将模块格式改为UMD,编译后会自动兼容模块导入和全局挂载两种场景,修改后的配置如下:
{ "compileOnSave": true, "compilerOptions": { "target": "ES5", // 将module从ES2015改为UMD "module": "UMD", // 新增全局挂载的命名空间名称 "library": "Referral", "rootDir": "ts", "moduleResolution": "node", "sourceMap": true, "outDir": "Webresources/ih_/js", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true }, "exclude": ["tests/**/*"] }
该方案无需修改原有业务代码,编译后的JS会自动将导出的内容挂载到window.Referral,Dynamics可正常调用,单元测试也可正常导入模块。
方案3:多配置适配(适合有打包流程的大型项目)
如果不想改动业务代码和全局配置,可以配置两套编译配置:
- 生产构建(输出给Dynamics的JS):用打包工具(Rollup、Webpack等)将ES模块打包为IIFE格式,自动将导出内容挂载到全局作用域
- 测试构建:保留原有ES模块配置,正常执行单元测试即可
内容的提问来源于stack exchange,提问作者user9261593
相关产品推荐
相关产品推荐

