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

Angular 17+SSR项目执行构建命令无限加载无dist输出求助

poc

我开发的Angular 17+SSR全功能电商项目已完成80%,但执行构建命令时出现无限加载状态,无法生成dist输出目录。

配置详情

  • Angular CLI: 17.3.8
  • Node: 20.9.0
  • 包管理器: npm 10.1.0
  • 操作系统: win32 x64

angular.json 文件

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "petszone": {
      "projectType": "application",
      "schematics": {
        "@schematics/angular:component": {
          "style": "scss"
        }
      },
      "root": "",
      "sourceRoot": "src",
      "prefix": "app",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:application",
          "options": {
            "outputPath": "dist/petszone",
            "index": "src/index.html",
            "browser": "src/main.ts",
            "allowedCommonJsDependencies": [
              "undici"
            ],
            "polyfills": [
              "zone.js"
            ],
            "tsConfig": "tsconfig.app.json",
            "inlineStyleLanguage": "scss",
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/styles.scss"
            ],
            "scripts": [],
            "server": "src/main.server.ts",
            "prerender": true,
            "ssr": {
              "entry": "server.ts"
            }
          },
          "configurations": {
            "production": {
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "1mb",
                  "maximumError": "2mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "200kb",
                  "maximumError": "400kb"
                }
              ],
              "outputHashing": "all"
            },
            "development": {
              "optimization": false,
              "extractLicenses": false,
              "sourceMap": true,
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.development.ts"
                }
              ]
            }
          },
          "defaultConfiguration": "production"
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "configurations": {
            "production": {
              "buildTarget": "petszone:build:production"
            },
            "development": {
              "buildTarget": "petszone:build:development"
            }
          },
          "defaultConfiguration": "development"
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "buildTarget": "petszone:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "polyfills": [
              "zone.js",
              "zone.js/testing"
            ],
            "tsConfig": "tsconfig.spec.json",
            "inlineStyleLanguage": "scss",
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/styles.scss"
            ],
            "scripts": []
          }
        }
      }
    }
  },
  "cli": {
    "analytics": false
  }
}

package.json 文件

{
  "name": "petszone",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "build:prod": "ng build --watch --configuration=production",
    "watch": "ng build --watch --configuration development",
    "test": "ng test"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "^17.0.0",
    "@angular/common": "^17.0.0",
    "@angular/compiler": "^17.0.0",
    "@angular/core": "^17.0.0",
    "@angular/fire": "^17.0.1",
    "@angular/forms": "^17.0.0",
    "@angular/platform-browser": "^17.0.0",
    "@angular/platform-browser-dynamic": "^17.0.0",
    "@angular/platform-server": "^17.0.0",
    "@angular/router": "^17.0.0",
    "@angular/ssr": "^17.0.0",
    "@fortawesome/fontawesome-free": "^6.5.1",
    "@google-pay/button-angular": "^3.1.0",
    "express": "^4.18.2",
    "rxjs": "~7.8.0",
    "swiper": "^11.0.7",
    "tslib": "^2.3.0",
    "zone.js": "~0.14.2"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "^17.0.0",
    "@angular/cli": "^17.0.0",
    "@angular/compiler-cli": "^17.0.0",
    "@types/express": "^4.17.17",
    "@types/jasmine": "~5.1.0",
    "@types/node": "^18.18.0",
    "autoprefixer": "^10.4.16",
    "jasmine-core": "~5.1.0",
    "karma": "~6.4.0",
    "karma-chrome-launcher": "~3.2.0",
    "karma-coverage": "~2.2.0",
    "karma-jasmine": "~5.1.0",
    "karma-jasmine-html-reporter": "~2.1.0",
    "postcss": "^8.4.33",
    "tailwindcss": "^3.4.1",
    "typescript": "~5.2.2"
  }
}

排查解决步骤

  1. 修正生产构建命令
    当前build:prod命令带了--watch参数,该参数会让构建持续监听文件变化,不会自动终止,导致看起来像“无限加载”。修改package.json中的脚本:

    "build:prod": "ng build --configuration=production"
    
  2. 先禁用预渲染验证基础构建
    配置中开启了prerender: true,预渲染阶段若遇到路由无法解析、异步请求卡住等问题,会导致构建挂起。先修改angular.json的build.options,将prerender设为false,执行ng build看是否能正常生成dist目录。如果可以,再逐步排查预渲染问题:检查所有路由组件是否支持SSR、是否有未处理的异步操作(比如未返回的Promise)。

  3. 统一Angular依赖版本
    Angular CLI版本为17.3.8,但核心依赖停留在17.0.0,版本不匹配可能引发构建异常。执行命令统一升级:

    ng update @angular/core@17.3.8 @angular/cli@17.3.8
    
  4. 查看详细构建日志
    执行构建时添加--verbose参数,定位卡住的具体阶段:

    ng build --verbose
    
  5. 检查server.ts文件
    确保服务器入口文件中没有无限循环、未处理的Promise或阻塞代码,比如是否正确处理了Express请求,没有卡在中间件环节。

内容的提问来源于stack exchange,提问作者Berlin Johns. M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:37:04