最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Webpack bundle missing some node_modules and assets after Angular update - Stack Overflow

programmeradmin0浏览0评论

After updating all the front and backend frameworks in my .NET/ABP/Angular app, the Webpack bundle in the browser is missing some directories and files in Webpack/node_modules and Webpack/src/assets that were present prior to the updates (i.e. Webpack/node_modules/@angular/common and Webpack/src/assets/abp-web-resources are missing, among others). The app builds but page load errors out while executing appInitializerFactory() because objects used in the method that should be made available from the Webpack bundle are instead undefined/missing.

Framework updates:

  • .NET 6.0 -> .NET 9.0
  • Abp 7.2.1 -> 10.0.0
  • Angular 13.x -> 19.1.4

The first error:

ERROR ReferenceError: abp is not defined
    appInitializerFactory app.config.ts:443
    providers app.config.ts:253
    Angular
        runInInjectionContext
        runInitializers
        bootstrap
        _callAndReportToErrorHandler
        bootstrap
        invoke
        onInvoke
        invoke
        run
        run
        bootstrap
        internalCreateApplication
        bootstrapApplication
    _ref main.ts:15

If I remove all references to abp, I get problems with moment being undefined. If I remove references to moment, I instead get an error that @angular/common/locales can't be found. If I remove the references to that directory....

package.json:

{
  "angular-cli": {},
  "scripts": {
    "ng": "ng",
    "publish": "cross-env NODE_OPTIONS=--max-old-space-size=4096 ng build --output-hashing=all --configuration production",
    "start": "ng serve --host 0.0.0.0 --port 4200",
    "hmr": "ng serve --host 0.0.0.0 --port 4200 --hmr --disable-host-check",
    "preinstall2": "npx npm-force-resolutions"
  },
  "dependencies": {
    "@angular/animations": "^19.1.4",
    "@angular/cdk": "^19.1.2",
    "@angular/common": "^19.1.4",
    "@angular/compiler": "^19.1.4",
    "@angular/core": "^19.1.4",
    "@angular/forms": "^19.1.4",
    "@angular/platform-server": "^19.1.4",
    "@angular/router": "^19.1.4",
    "@microsoft/signalr": "^8.0.7",
    "@primeng/themes": "^19.0.5",
    "abp-ng2-module": "^12.0.0",
    "abp-web-resources": "^6.0.1",
    "angular2-counto": "^1.2.5",
    "bootstrap": "^5.3.3",
    "core-js": "^3.40.0",
    "cross-env": "^7.0.3",
    "jquery-ui": "1.13",
    "js-cookie": "^2.2.0",
    "json5": "^2.2.2",
    "loader-utils": "^3.2.1",
    "localforage": "^1.10.0",
    "moment": "^2.29.4",
    "moment-timezone": "^0.5.43",
    "ngx-bootstrap": "^19.0.2",
    "npm-force-resolutions": "^0.0.10",
    "object-path": "^0.11.6",
    "rxjs": "^7.8.1",
    "ts-node": "~7.0.1",
    "tslib": "^2.8.1",
    "webpack": "^5.97.1",
    "zone.js": "~0.15.0"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "^19.0.6",
    "@angular/cli": "^19.0.6",
    "@angular/compiler-cli": "^19.0.5",
    "@angularclass/hmr": "^2.1.3",
    "@angularclass/hmr-loader": "^3.0.4",
    "ts-node": "~7.0.1",
    "tslint": "^5.20.1",
    "typescript": "^5.6.3"
  }
}

angular.json:

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "newProjectRoot": "projects",
  "projects": {
    "abp-zero-template": {
      "root": "",
      "sourceRoot": "src",
      "projectType": "application",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist",
            "index": "src/index.html",
            "main": "src/main.ts",
            "tsConfig": "src/tsconfig.json",
            "polyfills": "src/polyfills.ts",
            "assets": [
              "src/assets",
              "src/metronic",
              "src/favicon.ico",
              {
                "glob": "abp.signalr-client.js",
                "input": "node_modules/abp-web-resources/Abp/Framework/scripts/libs",
                "output": "/assets/abp"
              }
            ],
            "scripts": [
              "node_modules/@microsoft/signalr/dist/browser/signalr.min.js",
              "node_modules/localforage/dist/localforage.js",
              "node_modules/moment/min/moment-with-locales.js",
              "node_modules/moment-timezone/builds/moment-timezone-with-data.js",
              "node_modules/push.js/bin/push.js",
              "node_modules/quill/dist/quill.js",
              "node_modules/sweetalert2/dist/sweetalert2.js",
              "node_modules/cookieconsent/build/cookieconsent.min.js",

              "src/assets/FreezeUI/freeze-ui.js",
              "src/assets/abp-web-resources/abp.js",
              "src/assets/abp-web-resources/abp.sweet-alert.js",
              "src/assets/abp-web-resources/abp.notify.js",
              "src/assets/abp-web-resources/abp.freeze-ui.js",
              "node_modules/abp-web-resources/Abp/Framework/scripts/libs/abp.moment.js",

              "src/assets/metronic/assets/vendors/base/vendors.bundle.js",
              "src/assets/metronic/assets/demo/default/base/scripts.bundle.js",
              "node_modules/jquery/dist/jquery.min.js",
              "src/assets/calendar_scripts/jquery-ui.bundle.js",
              "src/assets/calendar_scripts/fullcalendar.bundle.js",
              "node_modules/pdfjs-dist/build/pdf.min.mjs",
              "node_modules/pdfjs-dist/build/pdf.worker.min.mjs"
            ],
            "aot": false,
            "vendorChunk": true,
            "extractLicenses": false,
            "buildOptimizer": false,
            "sourceMap": true,
            "optimization": false,
            "namedChunks": true
          },
          "configurations": {
            "hmr": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.hmr.ts"
                }
              ]
            },
            "docker": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.docker.ts"
                }
              ]
            },
            "local-external": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.local-external.ts"
                }
              ]
            }
          },
          "defaultConfiguration": ""
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "buildTarget": "abp-zero-template:build",
            "allowedHosts": ["all"],
            "liveReload": false
          },
          "configurations": {
            "hmr": {
              "buildTarget": "abp-zero-template:build:hmr"
            },
            "docker": {
              "buildTarget": "abp-zero-template:build:docker"
            },
            "local-external": {
              "buildTarget": "abp-zero-template:build:local-external"
            }
          }
        }
      }
    }
  }
}

tsconfig.json:

{
  "compilerOptions": {
    "declaration": false,
    "downlevelIteration": true,
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "forceConsistentCasingInFileNames": true,
    "lib": [ "es6", "dom", "ES2022" ],
    "mapRoot": "./",
    "module": "commonjs",
    "skipLibCheck": true,
    "moduleResolution": "node",
    "outDir": "../dist/out-tsc",
    "sourceMap": true,
    "target": "ES2022",
    "typeRoots": [
      "../node_modules/@types"
    ],
    "baseUrl": "./",
    "paths": {
      "@app/*": [ "./app/*" ],
      "@shared/*": [ "./shared/*" ],
      "@node_modules/*": [ "../node_modules/*" ],
      "@metronic/*": [ "./assets/metronic/*" ]
    }
  },
  "exclude": [
    "../node_modules"
  ]
}

It breaks at the first instance of abp here. If I comment it out, it breaks in AppPreBootstrap.run(). If I remove those undefined objects, it breaks in registerLocales() in the callback, etc.

function appInitializerFactory(
    injector: Injector,
    platformLocation: PlatformLocation) {
    return () => {
        abp.ui.setBusy();

        handleLogoutRequest(injector.get(AppAuthService));

        return new Promise<boolean>((resolve, reject) => {
            AppConsts.appBaseHref = getBaseHref(platformLocation);
            let appBaseUrl = getDocumentOrigin() + AppConsts.appBaseHref;

            AppPreBootstrap.run(appBaseUrl, () => {

                let appSessionService: AppSessionService = injector.get(AppSessionService);
                appSessionService.init().then((result) => {
                        registerLocales(resolve, reject);
                    },
                    (err) => {
                        abp.ui.clearBusy();
                        reject(err);
                    }
                );
            }, resolve, reject);
        });
    };
}

app.config.ts where appInitializerFactory is used:

export let appConfig: ApplicationConfig = {
    providers: [
        provideRouter(routes, withPreloading(PreloadAllModules)),
        provideAppInitializer(() => {
            const initializerFn = (appInitializerFactory)(inject(Injector), inject(PlatformLocation));
            return initializerFn();
        }),
        {
            provide: LOCALE_ID,
            useFactory: getCurrentLanguage
        },
        provideHttpClient(withInterceptorsFromDi()),
        { provide: HTTP_INTERCEPTORS, useClass: AbpHttpInterceptor, multi: true },
        { provide: API_BASE_URL, useFactory: getRemoteServiceBaseUrl },
    ]

and main.ts where appConfig is passed to the bootstrap function:

const bootstrap = async (): Promise<ApplicationRef> => {
    try {
        return await bootstrapApplication(RootComponent, appConfig);
    } catch (err) {
        console.error(err);
        throw err;
    }
};

if (environment.hmr) {
    if (module['hot']) {
        hmrBootstrap(module, bootstrap); //HMR enabled bootstrap
    }
} else {
    bootstrap(); //Regular bootstrap
}

I'm not using a webpack config file. I've ensured that the correct node_modules and assets are present in my local file structure. I made sure that the necessary scripts are present in angular.json. I deleted .angular and cleared my npm cache. I've scoured the Angular update guides. I downloaded this template from aspnetboilerplate and compared the config files. Nothing stood out. I've tried different lib and target options in tsconfig. I've checked stackoverflow and Angular support forums. At this point I'm just making random guesses and hoping.

发布评论

评论列表(0)

  1. 暂无评论