You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:45:04