ReferenceError:self 未定义 SSR Angular 14

问题描述 投票:0回答:1

Screenshot of the error 在 Angular 中创建 SSR 构建时出现错误。

0|main     | ReferenceError: self is not defined
0|main     |     at Object.96170 (/opt/hpk-testing/landing-site/_staging-build/server/main.js:1:8873)
0|main     |     at __webpack_require__ (/opt/hpk-testing/landing-site/_staging-build/server/main.js:1:7534154)
0|main     |     at Object.1159 (/opt/hpk-testing/landing-site/_staging-build/server/main.js:1:1937311)
0|main     |     at __webpack_require__ (/opt/hpk-testing/landing-site/_staging-build/server/main.js:1:7534154)
0|main     |     at Object.90158 (/opt/hpk-testing/landing-site/_staging-build/server/main.js:1:1194156)
0|main     |     at __webpack_require__ (/opt/hpk-testing/landing-site/_staging-build/server/main.js:1:7534154)
0|main     |     at Object.36747 (/opt/hpk-testing/landing-site/_staging-build/server/main.js:1:1198393)
0|main     |     at __webpack_require__ (/opt/hpk-testing/landing-site/_staging-build/server/main.js:1:7534154)
0|main     |     at Object.28061 (/opt/hpk-testing/landing-site/_staging-build/server/main.js:1:1201791)
0|main     |     at __webpack_require__ (/opt/hpk-testing/landing-site/_staging-build/server/main.js:1:7534154)

之前得到过这个

ReferenceError: window is not defined

下面是package.json文件

{
    "name": "landing-site",
    "version": "0.0.0",
    "scripts": {
        "ng": "ng",
        "start": "ng serve",
        "build": "ng build",
        "test": "ng test",
        "lint": "ng lint",
        "e2e": "ng e2e",
        "dev:ssr": "ng run landing-site:serve-ssr",
        "serve:ssr": "node dist/landing-site/server/main.js",
        "build:ssr": "ng build --configuration production && ng run landing-site:server:production",
        "build:ssr-staging": "ng build --configuration staging  && ng run landing-site:server:staging",
        "prerender": "ng run landing-site:prerender"
    },
    "private": true,
    "dependencies": {
        "@angular/animations": "^14.3.0",
        "@angular/cdk": "^14.2.7",
        "@angular/common": "^14.3.0",
        "@angular/compiler": "^14.3.0",
        "@angular/core": "^14.3.0",
        "@angular/forms": "^14.3.0",
        "@angular/material": "^14.2.7",
        "@angular/platform-browser": "^14.3.0",
        "@angular/platform-browser-dynamic": "^14.3.0",
        "@angular/platform-server": "^14.3.0",
        "@angular/router": "^14.3.0",
        "@angular/service-worker": "^14.3.0",
        "@angular/youtube-player": "^14.2.7",
        "@ckeditor/ckeditor5-angular": "^7.0.0",
        "@ckeditor/ckeditor5-build-classic": "^38.1.1",
        "@ckeditor/ckeditor5-core": "^38.1.1",
        "@ckeditor/ckeditor5-engine": "^38.1.1",
        "@ckeditor/ckeditor5-utils": "^38.1.1",
        "@ckeditor/ckeditor5-watchdog": "^38.1.1",
        "@fortawesome/fontawesome-free": "^5.14.0",
        "@nguniversal/builders": "^14.2.3",
        "@nguniversal/express-engine": "^14.2.3",
        "@popperjs/core": "^2.11.8",
        "angular-feather": "^6.5.0",
        "bootstrap": "^5.2.3",
        "date-fns": "^2.29.1",
        "date-fns-tz": "^2.0.0",
        "domino": "^2.1.6",
        "express": "^4.15.2",
        "font-awesome": "^4.7.0",
        "jquery": "^3.5.1",
        "ng-chartjs": "0.2.0",
        "ngx-cookie-service": "^14.0.1",
        "ngx-infinite-scroll": "^10.0.0",
        "ngx-owl-carousel-o": "^14.0.1",
        "ngx-pagination": "^6.0.3",
        "popper": "^1.0.1",
        "rxjs": "~6.6.0",
        "simplebar-angular": "^3.2.4",
        "socket.io-client": "^4.4.1",
        "tslib": "^2.0.0",
        "zone.js": "~0.11.4"
    },
    "devDependencies": {
        "@angular-devkit/build-angular": "^14.2.11",
        "@angular-eslint/builder": "14.0.0",
        "@angular-eslint/eslint-plugin": "14.0.0",
        "@angular-eslint/eslint-plugin-template": "14.0.0",
        "@angular-eslint/template-parser": "14.0.0",
        "@angular/cli": "^14.2.11",
        "@angular/compiler-cli": "^14.3.0",
        "@types/express": "^4.17.0",
        "@types/jasmine": "~3.8.0",
        "@types/node": "^12.11.1",
        "@typescript-eslint/eslint-plugin": "5.29.0",
        "@typescript-eslint/parser": "5.29.0",
        "codelyzer": "^6.0.0",
        "eslint": "^8.18.0",
        "jasmine-core": "^3.9.0",
        "jasmine-spec-reporter": "~5.0.0",
        "karma": "~6.4.1",
        "karma-chrome-launcher": "~3.1.0",
        "karma-coverage": "~2.0.3",
        "karma-jasmine": "~4.0.0",
        "karma-jasmine-html-reporter": "^1.7.0",
        "protractor": "~7.0.0",
        "ts-node": "~8.3.0",
        "tslint": "~6.1.0",
        "typescript": "~4.6.4"
    }
}

下面是 angular.json

{
    "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
    "cli": {
        "analytics": false
    },
    "version": 1,
    "newProjectRoot": "projects",
    "projects": {
        "landing-site": {
            "projectType": "application",
            "schematics": {
                "@schematics/angular:component": {
                    "style": "scss"
                }
            },
            "root": "",
            "sourceRoot": "src",
            "prefix": "app",
            "architect": {
                "build": {
                    "builder": "@angular-devkit/build-angular:browser",
                    "options": {
                        "outputPath": "dist/landing-site/browser",
                        "index": "src/index.html",
                        "main": "src/main.ts",
                        "polyfills": "src/polyfills.ts",
                        "tsConfig": "tsconfig.app.json",
                        "assets": [
                            "src/favicon.ico",
                            "src/assets",
                            {
                                "glob": "**/*",
                                "input": "./node_modules/@ant-design/icons-angular/src/inline-svg/",
                                "output": "/assets/"
                            },
                            {
                                "glob": "**/*",
                                "input": "./node_modules/edaiva-library/assets",
                                "output": "/assets/"
                            },
                            "src/manifest.webmanifest",
                            "src/sitemap.xml",
                            "src/robots.txt"
                        ],
                        "styles": [
                            "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css",
                            "./node_modules/bootstrap/dist/css/bootstrap.min.css",
                            "./node_modules/font-awesome/css/font-awesome.css",
                            "node_modules/ngx-owl-carousel-o/lib/styles/prebuilt-themes/owl.carousel.min.css",
                            "node_modules/ngx-owl-carousel-o/lib/styles/prebuilt-themes/owl.theme.default.min.css",
                            "src/styles.css",
                            "src/styles.scss"
                        ],
                        "scripts": [
                            "node_modules/jquery/dist/jquery.js",
                            "./node_modules/@popperjs/core/dist/umd/popper.min.js",
                            "./node_modules/bootstrap/dist/js/bootstrap.min.js",
                            "src/assets/lib/hljs/highlight.pack.js"
                        ],
                        "serviceWorker": true,
                        "ngswConfigPath": "ngsw-config.json",
                        "vendorChunk": true,
                        "extractLicenses": false,
                        "buildOptimizer": false,
                        "sourceMap": true,
                        "optimization": false,
                        "namedChunks": true
                    },
                    "configurations": {
                        "production": {
                            "fileReplacements": [
                                {
                                    "replace": "src/environments/environment.ts",
                                    "with": "src/environments/environment.prod.ts"
                                }
                            ],
                            "optimization": true,
                            "outputHashing": "all",
                            "sourceMap": false,
                            "namedChunks": false,
                            "extractLicenses": true,
                            "vendorChunk": false,
                            "buildOptimizer": true,
                            "budgets": [
                                {
                                    "type": "initial",
                                    "maximumWarning": "2mb",
                                    "maximumError": "5mb"
                                },
                                {
                                    "type": "anyComponentStyle",
                                    "maximumWarning": "6kb",
                                    "maximumError": "25kb"
                                }
                            ]
                        },
                        "staging": {
                            "fileReplacements": [
                                {
                                    "replace": "src/environments/environment.ts",
                                    "with": "src/environments/environment.staging.ts"
                                }
                            ],
                            "optimization": true,
                            "outputHashing": "all",
                            "sourceMap": false,
                            "namedChunks": false,
                            "extractLicenses": true,
                            "vendorChunk": false,
                            "buildOptimizer": true,
                            "budgets": [
                                {
                                    "type": "initial",
                                    "maximumWarning": "3mb",
                                    "maximumError": "5mb"
                                }
                            ],
                            "outputPath": "./_staging-build/browser"
                        }
                    },
                    "defaultConfiguration": ""
                },
                "serve": {
                    "builder": "@angular-devkit/build-angular:dev-server",
                    "options": {
                        "browserTarget": "landing-site:build"
                    },
                    "configurations": {
                        "production": {
                            "browserTarget": "landing-site:build:production"
                        }
                    }
                },
                "extract-i18n": {
                    "builder": "@angular-devkit/build-angular:extract-i18n",
                    "options": {
                        "browserTarget": "landing-site:build"
                    }
                },
                "test": {
                    "builder": "@angular-devkit/build-angular:karma",
                    "options": {
                        "main": "src/test.ts",
                        "polyfills": "src/polyfills.ts",
                        "tsConfig": "tsconfig.spec.json",
                        "karmaConfig": "karma.conf.js",
                        "assets": [
                            "src/favicon.ico",
                            "src/assets",
                            "src/manifest.webmanifest"
                        ],
                        "styles": [
                            "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css",
                            "src/styles.scss"
                        ],
                        "scripts": []
                    }
                },
                "lint": {
                    "builder": "@angular-devkit/build-angular:tslint",
                    "options": {
                        "tsConfig": [
                            "tsconfig.app.json",
                            "tsconfig.spec.json",
                            "e2e/tsconfig.json",
                            "tsconfig.server.json"
                        ],
                        "exclude": ["**/node_modules/**"]
                    }
                },
                "e2e": {
                    "builder": "@angular-devkit/build-angular:protractor",
                    "options": {
                        "protractorConfig": "e2e/protractor.conf.js",
                        "devServerTarget": "landing-site:serve"
                    },
                    "configurations": {
                        "production": {
                            "devServerTarget": "landing-site:serve:production"
                        }
                    }
                },
                "server": {
                    "builder": "@angular-devkit/build-angular:server",
                    "options": {
                        "outputPath": "dist/landing-site/server",
                        "main": "server.ts",
                        "tsConfig": "tsconfig.server.json",
                        "sourceMap": true,
                        "optimization": false
                    },
                    "configurations": {
                        "production": {
                            "outputHashing": "media",
                            "fileReplacements": [
                                {
                                    "replace": "src/environments/environment.ts",
                                    "with": "src/environments/environment.prod.ts"
                                }
                            ],
                            "sourceMap": false,
                            "optimization": true
                        },
                        "staging": {
                            "outputHashing": "media",
                            "fileReplacements": [
                                {
                                    "replace": "src/environments/environment.ts",
                                    "with": "src/environments/environment.staging.ts"
                                }
                            ],
                            "sourceMap": false,
                            "optimization": true,
                            "outputPath": "_staging-build/server"
                        }
                    },
                    "defaultConfiguration": ""
                },
                "serve-ssr": {
                    "builder": "@nguniversal/builders:ssr-dev-server",
                    "options": {
                        "browserTarget": "landing-site:build",
                        "serverTarget": "landing-site:server"
                    },
                    "configurations": {
                        "production": {
                            "browserTarget": "landing-site:build:production",
                            "serverTarget": "landing-site:server:production"
                        }
                    }
                },
                "prerender": {
                    "builder": "@nguniversal/builders:prerender",
                    "options": {
                        "browserTarget": "landing-site:build:production",
                        "serverTarget": "landing-site:server:production",
                        "routes": ["/"]
                    },
                    "configurations": {
                        "production": {}
                    }
                }
            }
        }
    }
}

我对 server.ts 文件进行了以下更改

添加到server.ts

import { createWindow } from 'domino';
// Polyfills
(global as any).window = win;
(global as any).document = win.document;
(global as any).navigator = win.navigator;

我还创建了一个 window-ref.service.ts 并将其传递到提供程序部分的 app.module.ts 中。

import { Injectable } from '@angular/core';

function _window(): any {
    return window;
}
@Injectable({
    providedIn: 'root',
})
export class WindowRefService {
    get nativeWindow(): any {
        return _window();
    }
    constructor() {}
}
angular server-side-rendering angular-universal
1个回答
0
投票

您可能知道,使用 SSR,您的 JS 不是在浏览器环境中运行,而是在 NodeJS 上运行。节点运行时中不存在像

window
self
这样的全局变量。

因此,您需要放弃使用这些变量,并可能删除使用此类代码的库。

如果您需要访问nodejs和浏览器运行时中都存在的全局对象,您可以使用

globalThis

© www.soinside.com 2019 - 2024. All rights reserved.