32

使用“ng build --prod”构建 Angular 应用程序时出现以下错误。当我使用 Angular 4 构建并使用 Angular 5 出错时,这是有效的。使用 Angular 5,“ng serve”运行良好。

错误中的错误:无法确定 mypath/node_modules/time-ago-pipe/time-ago-pipe.ts 中 TimeAgoPipe 类的模块!将 TimeAgoPipe 添加到 NgModule 以修复它。

https://www.npmjs.com/package/time-ago-pipe出现错误

有什么解决办法吗?

4

14 回答 14

46

检查大小写敏感性

import { MyComponent } from "./User/my-component";

就我而言,问题是文件夹用户是在我的导入语句中以U作为大写创建的。但实际上,在磁盘上,它是小型的。当我在导入语句中将路径名更改为用户(u 小写)时,它对我有用。

import { MyComponent } from "./user/my-component";

因此,请检查您的导入路径是否区分大小写。

于 2018-05-22T19:28:24.180 回答
18

Angular 5,特别是 Angular cli 1.5 已打开默认提前编译,如果您有一些未在任何模块中声明的组件,它需要知道它在项目文件夹中找到的所有组件/管道等模块抛出错误。

您可以TimeAgoPipe在某个模块中声明:

@NgModule({
  declarations: [TimeAgoPipe, ...]
})
export class AppModule {}// for example can be any other used module

或尝试在不提前编译的情况下运行构建,结果代码会运行得更慢

ng build --prod --aot=false

第三种方式,如果您根本不使用该管道,您可以将其添加到排除的文件中tsconfig.json

{
  ...
  "exclude": [ "path/to/unused/component.ts", ... ]
}
于 2017-11-05T18:04:01.700 回答
13

就我而言,该错误是由于不同文件中同一类的多个定义造成的。这是由于某些开发人员复制粘贴代码而发生的。

于 2018-10-06T16:18:14.710 回答
6

我遇到了完全相同的问题并且可以提供一种解决方法,尽管不确定为什么这个特定的管道没有被 aot 构建成功拾取:

解决方法

从 node_modules/time-ago-pipe 复制 time-ago-pipe.ts 并将此文件复制到您自己的项目中。

像往常一样将其添加到模块中的声明中,并将其导入到您的导入中,例如:

import { TimeAgoPipe } from './_pipes/time-ago-pipe';

这将在 AOT 构建中成功编译,您仍然可以使用管道。

于 2017-11-19T12:08:15.203 回答
5

遇到这个问题并想巩固现有的建议,并在没有其他方法对我有用的情况下提出一些一般策略:

  1. 就我而言,错误是它无法确定 a 的模块Pipe;我正在使用Pipe直接注入 Angular 的Service自定义。
  • 当我停止使用 时Pipe,问题就消失了;所以我删除了Pipe变换——我把变换移到了一个不同的Service地方,完全停止Pipe了。
  1. 确保您在您的(和)属性中正确声明(和导出)您的管道/组件declarationsexportsNgModule
  2. 如果它是第 3 方管道/组件(即内部node_modules),请将管道复制到您自己的项目(如果可能),和/或从您的其中一个重新导出管道NgModule
  3. 如果您不需要管道/组件,您可以通过添加到的属性来排除文件(这可能不是每个人都可以选择的) excludetsconfig.json
  4. 或者在没有提前编译的情况下ng build --aot=false构建(可能是更快的构建,但会创建一个未优化的应用程序;了解有关 AOT 的更多信息)
  5. 如果它是您的管道/组件(与第 3 方相比),请确认您没有双重定义您的管道类,也不要双重声明您的管道:即添加到两个或多个不同s 的declaratations数组 NgModule
  6. 在您的 Angular 打字稿文件中import { YourPipe } from './yoUr-pippe.ts',确保您的导入语句中没有拼写错误或大小写问题,尤其是文件名
  7. 就我而言,以上并没有解决我的问题。我做了以下许多步骤,最终问题停止了。我不确定是哪一个成功了:
    • 确保使用有问题的管道/组件的任何ts文件都存在于定义管道/组件NgModule 哪个importNgModule文件中!

      • 例如 if AModule, defined ,AComponent其中使用BPipe, defined in BModule, 那么AModule必须importBModule
        • 就我而言,我重新安排了我的NgModule依赖关系树。我使用了“共享模块”模式,因此我的 Pipe 可以在多个地方重复使用。
    • 确保没有循环NgModule依赖,就像在这些 示例中一样

    • 如果可以,请升级NodeJS自身和/或其angular工具(angular-cli等)

      • 我遇到了不相关的问题,所以我找到了这个建议列表......但是这些建议解决了其他问题,让我重新处理这个Cannot determine the module... 问题(它停止发生了!)
    • 小心使用index.ts文件又名“桶文件”,以及exports

    • 解决问题的一般方法:删除/注释掉对有问题文件的任何引用

      • 从每个文件中一次删除一个引用,直到您的 Angular 应用程序构建工作。如果从特定文件中删除解决了问题,您就知道哪个文件是问题的根源
      • 如果您从所有文件中删除引用(这可能太难了;对我来说这不是太多/不是太难);那么你的角度应用程序应该构建......
      • 确认您的 Angular 应用程序仍在构建。就我而言,我的 angular build 有一些不相关的错误,我可以轻松修复(例如 Can't bind to '___' since it isn't a known property of '___',、或Property '___' does not exist on type '___'. Did you mean '____'、或Expected 0 arguments, but got 1.
      • 修复任何其他问题后,您可以逐渐取消注释您的代码,同时确保您的ng build工作正常。当我取消注释/添加我的所有代码时......我ng build不再有这个Cannot determine the module...问题
于 2019-09-22T22:01:05.530 回答
0

我在生产构建中也遇到了同样的错误,我的类 ToastComponent。我最终没有导出类(ToastComponent)并像这样使用它:

class ToastComponent extends Toast {
  options: ToastIndividualConfig;
}

interface ToastIndividualConfig extends IndividualConfig {
  template: TemplateRef<any>;
  type: string;
}
@Component({
  selector: 'template-toast-component',
  templateUrl: './template-toast.component.html',
  styleUrls: ['./template-toast.component.scss'],
})
export class TemplateToastComponent extends ToastComponent {
于 2022-01-21T07:50:37.087 回答
0

确保在 @NgModule 中导入组件。

于 2021-03-03T18:45:55.950 回答
0

对我来说,即使声明中有组件,它也不起作用。因此,我也从声明和导入中删除了该组件。然后我通过使用 Visual Studio 代码智能感知在声明中自动完成组件名称并使用自动导入在模块文件顶部导入组件来读取它。令我惊讶的是,它奏效了。

如果上述任何解决方案都不适合您,那么这也值得尝试。

于 2018-07-03T13:38:59.600 回答
0

对我来说,问题是在导入路径中区分大小写。但是您必须找到所有有问题的导入路径。不仅导入模块中使用的内容。

于 2019-07-03T03:34:19.157 回答
0

通常,当您创建组件但未将其导入任何模块时会发生此错误。

于 2020-02-26T07:25:34.490 回答
0

我也只在 prod build 上遇到了同样的错误,但在 dev build 上没有。我在 app.module.ts 中导入了 component.ts 文件,但没有在 NgModule 中使用。所以我删除了导入,它工作正常。

于 2019-07-30T13:40:47.203 回答
0
  1. 导入特定组件。
  2. 将组件添加到 @NgModule。
于 2019-05-28T09:24:06.200 回答
0

mypipe.ts就我而言,app.component.ts出于某种原因,我有一个管道声明为他们自己的类。我删除了 app.component 中的那个,它编译得很好。

在错误消息中,检查它到底在哪里抱怨,看看这是否是您项目中的双重代码。

于 2019-07-23T13:30:15.173 回答
0

就我而言,有两个组件名称相同。我删除了其中一个,它已修复。

于 2019-09-02T10:50:34.780 回答