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

Electron+React+TS项目引入Annotorious无类型库报错排查

解决Annotorious在Electron Forge + Webpack环境下"is not a function"错误

问题原因

迁移到Electron Forge的TypeScript-Webpack模板后,Webpack对ES模块的解析规则与create-react-app存在差异,原import * as Annotorious的命名空间导入无法正确获取Annotorious的构造函数(create-react-app的默认Webpack配置做了兼容处理,而Electron Forge的模板更严格)。

解决方案

1. 调整导入方式为默认导入

@recogito/annotorious-openseadragon的ES模块采用默认导出,替换原命名空间导入:

import OpenSeadragon from "openseadragon";
//@ts-ignore
import Annotorious from "@recogito/annotorious-openseadragon";
import "@recogito/annotorious-openseadragon/dist/annotorious.min.css";

2. 修正初始化代码

确保在OpenSeadragon的open事件中正确调用构造函数:

const viewer = OpenSeadragon({
  // 你的Viewer配置项
});

viewer.addHandler('open', () => {
  // 直接调用默认导入的Annotorious函数
  const anno = Annotorious(viewer);
  
  // 后续标注逻辑,例如加载已有标注
  // anno.loadAnnotations('/path/to/annotations.json');
});

3. 备选方案:使用全局挂载对象

若默认导入仍不生效,可尝试直接访问全局对象(部分UMD模块会将构造函数挂载到window):

import OpenSeadragon from "openseadragon";
//@ts-ignore
import "@recogito/annotorious-openseadragon"; // 仅导入模块,不赋值
import "@recogito/annotorious-openseadragon/dist/annotorious.min.css";

viewer.addHandler('open', () => {
  const anno = (window as any).Annotorious(viewer);
});

4. 检查Webpack渲染进程配置

确保Electron Forge的Webpack配置正确处理ES模块与CSS:
在webpack.renderer.config.js中补充或调整规则:

module.exports = {
  resolve: {
    extensions: ['.tsx', '.ts', '.jsx', '.js'], // 确保包含JS/JSX后缀
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx|ts|tsx)$/,
        exclude: /node_modules/,
        use: 'babel-loader', // 转译ES模块
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader'], // 正确加载Annotorious的CSS文件
      },
    ],
  },
};

内容的提问来源于stack exchange,提问作者Lau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:13:17