【问题标题】:Angular2 build under angular-cli with directive and ng build --prodAngular2 在 angular-cli 下使用指令和 ng build --prod 构建
【发布时间】:2023-03-09 06:40:02
【问题描述】:

我有一个 angular-cli 应用程序,

npm -v 3.10.8
node -v v6.9.1
angular2 ^2.4.0
angular/cli 1.0.0-beta.32.3

当我添加到 package.json 这个

"angular2-auto-scroll": "1.0.12"

angular2-auto-scrol website

并在 app.module.ts 中导入它

import { Angular2AutoScroll } from "angular2-auto-scroll/lib/angular2-auto-scroll.directive";

并将其添加到 declarations 部分 ng build --prod 失败并出现此错误

ERROR in Unexpected value 'Angular2AutoScroll in C:/coding/workspace/myapp/myapp-web/node_modules/angular2-auto-scroll/lib/angular2-auto-scroll.directive.d.ts' declared by the module 'AppModule in C:/coding/workspace/myapp/myapp-web/app_code/app/app.module.ts'
ERROR in ./app_code/main.ts Module not found: Error: Can't resolve './$$_gendir/app/app.module.ngfactory' in 'C:\coding\workspace\myapp\myapp-web\app_code'
 @ ./app_code/main.ts 6:0-74
 @ multi ./app_code/main.ts

但是,当我仅使用 ng build 构建而没有 --prod 时,一切构建都很好。 有谁知道可能是什么原因?或者任何其他方式我可以导入这个 npm 包,这样它就不会失败 PROD 构建?

【问题讨论】:

  • 试试ng build --prod --aot false,看看是否可行。您添加的库可能对 AOT 不友好。 AOT = true 是 prod 构建的默认编译模式,从 beta 28 开始。
  • 似乎没有燕麦也可以,非常感谢!我现在唯一需要考虑的是对我的应用程序性能的影响是什么,是不是真的很大?
  • 下载时间可能会成为一个因素,应用程序必须在没有 AOT 的情况下在运行时编译。这真的归结为应用程序的复杂性、内部/外部受众等。JIT 还不错,但如果你的应用程序有变大的潜力,或者拥有庞大的用户群,AOT 真的很好。以字节为单位发送给客户端的内容存在巨大差异。不过,AOT 需要做一些前期工作 -> angular.io/docs/ts/latest/cookbook/aot-compiler.html

标签: node.js angular npm angular-cli autoscroll


【解决方案1】:

问题在于 AOT 编译。使用 --prod 标志时默认发生 AOT。

查看angular2-auto-scroll的源代码,该项目在src/angular2-auto-scroll.directive.ts中定义了一个TS文件

如果您查看tsconfig.js file,特别是"module": "commonjs"。你会看到这个指令转换成的模块是commonjs 如果您在C:/coding/workspace/myapp/myapp-web/node_modules/angular2-auto-scroll/lib/ 下查看您的项目,您将看到一个TS 类型定义.d.ts、一个.js 和一个.map 文件。 js 文件是一个commonjs 模块。

AOT 不喜欢commonjs 模块,您可以自行研究,它需要es5es6 模块。

说了这么多,这里有一些解决方法

  • 将指令 TS 文件从源 github angular2-auto-scroll.directive.ts 复制到您的项目并删除依赖项。
  • 您可以向 repo 发出拉取请求,要求将 "module": "commonjs" 更改为 "module": "es6" 注意:我为它打开了一个问题 here
  • 如果您不关心 aot,(强烈推荐顺便说一句),您可以通过在构建选项上运行 buildcommand 和 --aot=false read here 来取消它

希望这会有所帮助。

关于 AOT 的资源: https://angular.io/docs/ts/latest/cookbook/aot-compiler.html https://github.com/angular/angular-cli/issues/1732

【讨论】:

  • 非常好的答案,我会使用您推荐的第一个选项(不确定还需要复制什么)
  • 这是一个单独的 ts 文件,仅依赖于您项目中的 Angular。应该像复制粘贴一样简单。如果您仍然发现问题,请告诉我。
  • 但是第二个文件呢?我们有两个文件:angular2-auto-scroll.directive.d.tsangular2-auto-scroll.directive.d.ts
  • 好的,我明白了。应该是这个文件github.com/NagRock/angular2-auto-scroll/blob/master/src/…而不是我通过npm下载的那些
  • 是的,你是对的。只有一个源文件。所有其他文件由打字稿转译器生成。只需将 TS 文件从 github 存储库复制到您的项目并像您自己编写的指令一样导入它。另外,添加一条评论,注明该回购的作者和一个链接;)
猜你喜欢
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多