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

Angular 13私有库导入项目时报错:moment is not a function

解决Angular 13私有库导入后moment报错"moment is not a function"的问题

问题场景

私有库privLib升级到Angular 13后,本地开发、构建、发布均正常,但其他项目导入使用库中依赖moment的组件时,抛出ERROR TypeError: moment is not a function错误。

核心原因分析

这个问题通常是moment的模块导入处理与Angular库打包机制不兼容导致的:

  • moment本质是CommonJS模块,默认导出的处理在ES模块环境中容易出现偏差
  • ng-packagr打包库时,可能没有正确处理moment的依赖关系,导致消费项目中moment无法被正确识别为函数

解决方案

1. 修改moment的导入方式

将当前的默认导入改为命名空间导入,适配CommonJS模块的导出结构:

// service.ts
import * as moment from 'moment';
// 调用方式保持不变
moment([dateParsed.getFullYear(), dateParsed.getMonth(), dateParsed.getDate()])

2. 调整库的package.json依赖配置

将moment从dependencies移到peerDependencies,确保消费项目安装与库兼容的moment版本,同时避免库打包时重复打包moment:

// package.json
"dependencies": {
  // 移除moment
},
"peerDependencies": {
  "moment": "^2.29.1",
  // 保留其他Angular相关peer依赖
  "@angular/core": "~13.4.0",
  "@angular/common": "~13.4.0"
}

3. 优化ng-packagr配置

更新ng-package.json,明确将moment标记为外部依赖,让消费项目提供该依赖:

// ng-package.json
{
  "$schema": "./node_modules/ng-packagr/ng-package.schema.json",
  "assets": [
    "src/assets",
    "src/scss/style-mixins.scss"
  ],
  "lib": {
    "entryFile": "public_api.ts",
    "styleIncludePaths": [
      "src/scss/"
    ],
    "externalDependencies": ["moment"]
  },
  "allowedNonPeerDependencies": [
    "."
  ]
}

4. 验证打包与导入流程

  • 重新执行库的打包命令:npm run build:ux:lib
  • 在消费项目中重新安装更新后的库,并确保项目中已安装moment@^2.29.1
  • 重启消费项目的开发服务器,测试使用moment的组件是否正常运行

额外排查点

  • 确认消费项目的tsconfig.json中同样开启了esModuleInterop: true和allowSyntheticDefaultImports: true
  • 如果使用Angular Material的moment适配器,确保消费项目中也正确导入了MatMomentDateModule并配置了moment

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:40:29