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

Vue2 + Webpack Module Federation报错:Cannot read properties of undefined (reading 'call')

Vue 2 应用 Webpack Module Federation 运行时错误排查求助

我们有一个基于 Vue 2 开发的应用,需要通过 Webpack Module Federation 拆分为微服务架构。已完成依赖升级以支持 Webpack 5,创建了 Yarn monorepo,拆分出的「content」子包可独立正常运行,但主应用出现运行时错误:

调整导入路径满足 TypeScript 编译要求,且在「content」微服务配置对应端点后,主应用编译成功,但运行时控制台抛出以下错误:

Uncaught TypeError: Cannot read properties of undefined (reading 'call')
    at __webpack_require__ (app.js:436243:33)
    at fn (app.js:436463:21)
    at ./node_modules/babel-loader/lib/index.js!./node_modules/ts-loader/index.js??ruleSet[0].rules[0].use[1]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/dashboard/client/ClientContentCalendarCard.vue?vue&type=script&lang=ts& (app.js:12517:89)
    at __webpack_require__ (app.js:436243:33)
    at fn (app.js:436463:21)
    at ./src/dashboard/client/ClientContentCalendarCard.vue?vue&type=script&lang=ts& (app.js:294006:264)
    at __webpack_require__ (app.js:436243:33)
    at fn (app.js:436463:21)
    at ./src/dashboard/client/ClientContentCalendarCard.vue (app.js:224827:113)
    at __webpack_require__ (app.js:436243:33)

已尝试的方案:

  • 重复三次完整升级流程
  • 移除 vue-cli,改用纯 Webpack 配置
  • 尝试多种 Webpack/TypeScript/Babel/Eslint 配置组合
  • 替换为 FederatedTypesPlugin 确保类型完整性

推测问题可能出在 loader 链异常,因为应用在加载依赖远程 Vue 模板的组件时崩溃,目前陷入困境,求解决或排查思路。


相关配置文件

webpack.dev.js

const { merge } = require('webpack-merge');
const common = require('./webpack.common');
const { FederatedTypesPlugin }= require('@module-federation/typescript');

module.exports = merge(common, {
  mode: 'development',
  devtool: 'inline-source-map',
  devServer: {
    static: './dist',
    client: {
      overlay: false,
    },
    port: 8081,
  },
  plugins: [
    new FederatedTypesPlugin({
      federationConfig: {
        name: "shell",
        remotes: {
          content: "content@http://localhost:8082/remoteEntry.js"
        },
        filename: 'remoteEntry.js',
      },
    }),
  ],
});

注:webpack.common.js 为移除 vue-cli 前通过 vue inspect 导出的配置

tsconfig.json

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "noImplicitAny": false,
    "types": [
      "webpack-env",
      "gapi",
      "gapi.auth2",
      "vue/types",
      "vue-router/types",
      "jest",
    ],
    "paths": {
      "*": [ 
        "@mf-types/*" 
      ],      
      "content/*": [
        "packages/content/src/content/*"
      ],
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "@mf-types/**/*.ts",
  ],
  "exclude": [
    "node_modules"
  ]
}

babel.config.js

module.exports = {
  presets: [
    '@vue/app',
  ],
  plugins: [
    [
      'transform-imports',
      {
        quasar: {
          transform: 'quasar/dist/babel-transforms/imports.js',
          preventFullImport: true,
        },
      },
    ],
  ],
};

.eslintrc.js

module.exports = {
  root: true,

  env: {
    node: true,
  },

  extends: [
    'plugin:vue/essential',
    '@vue/airbnb',
    '@vue/typescript',
  ],

  rules: {
    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    'import/extensions': 'never',
    'no-param-reassign': 'off',
    'max-len': 'off',
    'vue/require-v-for-key': 'off',
    'vue/no-use-v-if-with-v-for': 'off',
    'vue/no-unused-components': 'off',
    'vue/no-side-effects-in-computed-properties': 'off',
    'linebreak-style': 'off',
    'import/prefer-default-export': 'off',
  },

  parserOptions: {
    parser: '@typescript-eslint/parser',
  },

  overrides: [
    {
      files: [
        '**/__tests__/*.{j,t}s?(x)',
        '**/tests/unit/**/*.spec.{j,t}s?(x)'
      ],
      env: {
        jest: true
      }
    }
  ],

  settings: {
    'import/resolver': {
        'node': {
            'paths': ['src', 'packages/content/src'],
            'extensions': ['.js', '.ts', '.d.ts']
        },
    },
  },       
};

package.json

{
  "name": "app",
  "version": "1.0.0",
  "private": true,
  "description": "description",
  "scripts": {
    "serve": "webpack serve --open --config webpack.dev.js",
    "build": "webpack --config webpack.prod.js"
  },
  "workspaces": [
    "packages/content"
  ],
  "dependencies": {
    "@quasar/extras": "1.5.2",
    "animate.css": "^3.7.2",
    "autosize": "^4.0.0",
    "axios": "0.17.1",
    "buefy": "0.6.6",
    "bulma": "^0.6.1",
    "chart.js": "^3.5.1",
    "core-js": "^3.27.2",
    "deepmerge": "^2.0.1",
    "flatpickr": "^4.6.3",
    "gridstack": "^4.2.6",
    "jquery": "^3.4.0",
    "link-prevue": "^1.1.3",
    "lodash": "4.17.15",
    "moment": "^2.21.0",
    "papaparse": "^4.6.3",
    "promise.prototype.finally": "^3.1.0",
    "quasar": "1.9.4",
    "sec-to-min": "^1.0.1",
    "uuid": "^3.3.2",
    "vue": "^2.6.10",
    "vue-ckeditor2": "^1.18.0",
    "vue-class-component": "^7.0.2",
    "vue-dompurify-html": "^2.1.0",
    "vue-flatpickr-component": "^8.1.2",
    "vue-full-calendar": "^2.7.0",
    "vue-property-decorator": "8.4.0",
    "vue-router": "3.1.5",
    "vue-scrollto": "^2.8.0",
    "vue-select": "^3.0.2",
    "vuedraggable": "^2.15.0",
    "vuex": "^3.0.1"
  },
  "devDependencies": {
    "@babel/core": "^7.20.12",
    "@module-federation/typescript": "2.1.5",
    "@types/gapi": "0.0.39",
    "@types/gapi.auth2": "0.0.51",
    "@types/jest": "^24.0.19",
    "@types/lodash": "^4.14.144",
    "@types/promise.prototype.finally": "^2.0.3",
    "@types/uuid": "^8.3.1",
    "@types/vuedraggable": "^2.23.2",
    "@vue/babel-preset-app": "^5.0.8",
    "@vue/eslint-config-airbnb": "^4.0.0",
    "@vue/eslint-config-typescript": "^4.0.0",
    "@vue/test-utils": "^1.2.2",
    "autoprefixer": "^10.4.13",
    "babel-eslint": "^10.0.1",
    "babel-jest": "^24.9.0",
    "babel-loader": "^9.1.2",
    "babel-plugin-transform-imports": "1.5.0",
    "cache-loader": "^4.1.0",
    "case-sensitive-paths-webpack-plugin": "^2.4.0",
    "copy-webpack-plugin": "^11.0.0",
    "css-loader": "1.0.1",
    "css-minimizer-webpack-plugin": "^4.2.2",
    "eslint": "^5.16.0",
    "eslint-plugin-vue": "^5.0.0",
    "file-loader": "^3.0.1",
    "fork-ts-checker-webpack-plugin": "^7.3.0",
    "html-webpack-plugin": "^5.5.0",
    "jest": "^24.9.0",
    "jest-serializer-vue": "^2.0.2",
    "mini-css-extract-plugin": "^2.7.2",
    "node-sass": "^4.9.0",
    "postcss": "^8.4.21",
    "postcss-loader": "^7.0.2",
    "sass": "^1.17.4",
    "sass-loader": "^7.1.0",
    "stylus": "^0.54.5",
    "stylus-loader": "^3.0.2",
    "ts-loader": "^9.4.2",
    "typescript": "^3.9.10",
    "url-loader": "^4.1.1",
    "vue-loader": "^15.10.1",
    "vue-loader-plugin": "^1.3.0",
    "vue-template-compiler": "2.6.10",
    "webpack": "^5.75.0",
    "webpack-cli": "^5.0.1",
    "webpack-dev-server": "^4.11.1",
    "webpack-merge": "^5.8.0"
  },
  "packageManager": "yarn@3.3.1",
  "engines": {
    "node": "^14.21.0"
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:46:05