我设置了一个 Angular SSR 项目来运行我的 Express API 作为 SSR 服务的一部分。我所有的应用程序代码都位于
/src/app
中,我所有的 API 代码都位于 /src/api
中。我的 API 代码中有一些导入到应用程序代码中,但我尝试将其限制为仅使用我的后端使用的相同类型定义(因此有像 import type {MyBackendResponse} from '../../../api/types/myBackend.ts'
这样的东西)。
当我在应用程序中运行
ng build
时,它会编译,但会出现一堆如下所示的警告:
▲ [Warning] Module 'express-session' used by 'src/api/index.ts' is not ESM
CommonJS or AMD dependencies can cause optimization bailouts.
For more information see: https://angular.io/guide/build#configuring-commonjs-dependencies
我确信这些模块都没有包含在浏览器代码中 - 我搜索了所有
dist/<appname>/browser
文件夹,没有提及这些库,而 server
文件夹则提及。我目前忽略了这些警告,但如果 Angular 真的因为这些警告进入我的浏览器代码包而责骂我,我真的很高兴。
我实际上是否以某种方式搞砸了我的设置,并且这些警告是准确的?或者有没有办法让 Angular 不抱怨这些文件? (注意:我不想只是关闭这些包的警告 - 如果这些包包含在浏览器包中,我希望 Angular 对我大喊大叫!我只是不在乎它是否包含在服务器端代码中。)
修复了它(同时还有另一个问题)!
事实证明,这是由于 Angular 试图将这些依赖项捆绑到其
.mjs
服务器输出中造成的。可以通过将库添加到 projects.<appName>.architect.build.options.externalDependencies
中的 angular.json
属性来解决此问题。添加此操作会导致所有警告消失,而且作为额外的好处,我的应用程序现在实际上在服务器端运行! (之前有人抱怨对 __dirname
的引用未定义。)