【问题标题】:can't run npm run server after build angular app with npm run build:prod使用 npm run build:prod 构建 Angular 应用程序后无法运行 npm run server
【发布时间】:2020-12-25 14:32:29
【问题描述】:

我有一个使用角度通用的角度应用程序。当我使用 npm run build:prod 捆绑我的 Angular 应用程序时,一切看起来都很好,我没有收到任何错误,但是当运行 npm run server 以在浏览器中查看应用程序时,我收到以下错误:

D:\Projects\node.js\darsad-site\dist\server.js:1544155
    Object(tslib_es6["c" /* __metadata */])("design:paramtypes", [Object, Object, Window,
                                                                                  ^

ReferenceError: Window is not defined
    at Module.<anonymous> (D:\Projects\node.js\darsad-site\dist\server.js:1544155:83)
    at __webpack_require__ (D:\Projects\node.js\darsad-site\dist\server.js:50381:30)
    at D:\Projects\node.js\darsad-site\dist\server.js:50445:18
    at Object.<anonymous> (D:\Projects\node.js\darsad-site\dist\server.js:50448:10)
    at __webpack_require__ (D:\Projects\node.js\darsad-site\dist\server.js:25201:30)
    at Module.<anonymous> (D:\Projects\node.js\darsad-site\dist\server.js:1589621:90)
    at __webpack_require__ (D:\Projects\node.js\darsad-site\dist\server.js:25201:30)
    at D:\Projects\node.js\darsad-site\dist\server.js:25265:18
    at Object.<anonymous> (D:\Projects\node.js\darsad-site\dist\server.js:25268:10)
    at __webpack_require__ (D:\Projects\node.js\darsad-site\dist\server.js:21:30)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! darsad@0.0.0 server: `node local.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the darsad@0.0.0 server script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\Parsa\AppData\Roaming\npm-cache\_logs\2020-09-07T06_59_07_473Z-debug.log

这是我的 package.json 文件:

{
  "name": "darsad",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "mode": "production",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "build:server:prod": "ng run darsad:server && webpack --config webpack.server.config.js --progress --colors",
    "build:browser:prod": "ng build --prod",
    "build:prod": "npm run build:browser:prod && npm run build:server:prod",
    "server": "node local.js",
    "build:browser:serverless": "ng build --prod --base-href /production/",
    "build:serverless": "npm run build:browser:serverless && npm run build:server:serverless",
    "build:prod:deploy": "npm run build:prod && npm run deploy",
    "build:serverless:deploy": "npm run build:serverless && npm run deploy",
    "deploy": "serverless deploy",
    "build:server:serverless": "ng run darsad:server:serverless && webpack --config webpack.server.config.js --progress --colors",
    "dev:ssr": "ng run darsad:serve-ssr",
    "serve:ssr": "node dist/server/main.js",
    "build:ssr": "ng build --prod && ng run darsad:server:production",
    "prerender": "ng run darsad:prerender",
    "buildWithIncreaseMemory": "node --max_old_space_size=8192 node_modules/@angular/cli/bin/ng build --prod"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "10.0.14",
    "@angular/common": "^10.1.0",
    "@angular/compiler": "10.0.14",
    "@angular/core": "10.0.14",
    "@angular/forms": "10.0.14",
    "@angular/http": "^7.2.16",
    "@angular/platform-browser": "^10.1.0",
    "@angular/platform-browser-dynamic": "10.0.14",
    "@angular/pwa": "0.802.2",
    "@angular/router": "10.0.14",
    "@fortawesome/angular-fontawesome": "^0.5.0",
    "@fortawesome/fontawesome-svg-core": "^1.2.30",
    "@fortawesome/free-solid-svg-icons": "^5.14.0",
    "@gorniv/ngx-universal": "1.1.5",
    "@ng-toolkit/serverless": "7.1.2",
    "@ng-toolkit/universal": "^1.1.51",
    "@nguniversal/common": "^10.1.0",
    "@nguniversal/express-engine": "^10.1.0",
    "@nguniversal/module-map-ngfactory-loader": "^8.2.6",
    "@schematics/angular": "^10.1.0",
    "angular2-cookie": "^1.2.6",
    "angular2-useful-swiper": "^5.0.1",
    "aws-serverless-express": "^3.3.8",
    "commonjs": "0.0.1",
    "cookie-parser": "1.4.4",
    "core-js": "3.2.1",
    "cors": "~2.8.4",
    "cp-cli": "^1.1.0",
    "express": "^4.15.2",
    "font-awesome": "^4.7.0",
    "highcharts": "^7.2.2",
    "highcharts-angular": "^2.8.0",
    "jquery": "^3.5.1",
    "ng2-jalali-date-picker": "^2.4.2",
    "ngx-cookie-service": "^2.4.0",
    "rxjs": "6.6.2",
    "swiper": "^3.4.2",
    "ts-loader": "4.2.0",
    "tslib": "^1.13.0",
    "zone.js": "^0.10.3"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "^0.1000.8",
    "@angular/cli": "10.0.8",
    "@angular/compiler-cli": "10.0.14",
    "@angular/language-service": "10.0.14",
    "@angular/platform-server": "10.0.14",
    "@angularclass/hmr": "^2.1.3",
    "@nguniversal/builders": "^10.1.0",
    "@types/express": "^4.17.0",
    "@types/jasmine": "3.4.0",
    "@types/jasminewd2": "2.0.6",
    "@types/node": "12.0.10",
    "codelyzer": "5.1.0",
    "jasmine-core": "3.4.0",
    "jasmine-spec-reporter": "4.2.1",
    "karma": "4.2.0",
    "karma-chrome-launcher": "2.2.0",
    "karma-cli": "2.0.0",
    "karma-coverage-istanbul-reporter": "2.1.0",
    "karma-jasmine": "2.0.1",
    "karma-jasmine-html-reporter": "1.4.2",
    "opencollective": "^1.0.3",
    "protractor": "5.4.2",
    "serverless": "1.40.0",
    "serverless-apigw-binary": "^0.4.4",
    "ts-loader": "4.2.0",
    "ts-node": "8.3.0",
    "tslint": "5.18.0",
    "typescript": "3.9.7",
    "webpack-bundle-analyzer": "3.4.1",
    "webpack-cli": "3.3.7",
    "webpack-node-externals": "1.7.2"
  }
}

我的 server.ts 文件:

import 'zone.js/dist/zone-node';
import 'reflect-metadata';
import {enableProdMode} from '@angular/core';
import {ngExpressEngine} from '@nguniversal/express-engine';
import {provideModuleMap} from '@nguniversal/module-map-ngfactory-loader';

import * as express from 'express';
import * as bodyParser from 'body-parser';
import * as cors from 'cors';
import * as compression from 'compression';

import {join} from 'path';

enableProdMode();

export const app = express();

app.use(compression());
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// const DIST_FOLDER = join(process.cwd(), 'dist');

const {AppServerModuleNgFactory, LAZY_MODULE_MAP} = require('./dist/server/main');
console.log(require('./dist/server/main'));
app.engine('html', ngExpressEngine({
  bootstrap: AppServerModuleNgFactory,
  providers: [
    provideModuleMap(LAZY_MODULE_MAP)
  ]
}));

app.set('view engine', 'html');
app.set('views', './dist/browser');

app.get('/redirect/**', (req, res) => {
  const location = req.url.substring(10);
  res.redirect(301, location);
});

app.get('*.*', express.static('./dist/browser', {
  maxAge: '1y'
}));

app.get('/*', (req, res) => {
  res.render('index', {req, res}, (err, html) => {
    if (html) {
      res.send(html);
    } else {
      console.log('server.ts');
      console.error(err);
      res.send(err);
    }
  });
});

需要提及的是,我在我的应用程序中注释掉了对 window 对象的任何使用,并尝试构建项目,它构建时没有任何错误,但是在运行 npm run server 时会引发先前的错误。

【问题讨论】:

    标签: node.js angular angular-universal


    【解决方案1】:

    这个错误的原因是你使用window引用的是服务器端世界。

    对此的一种解决方案是在您的./server.ts 中使用Domino。 像这样:

    const win = domino.createWindow(templateA);
    win.Object = Object;
    win.Math = Math;
    global['window'] = win;
    global['document'] = win.document;
    

    【讨论】:

    • 谢谢,我使用多米诺骨牌方法解决了这个问题,但没有运气。它仍然给我同样的错误。我在 server.ts 和 import { AppServerModule } from './src/main.server'; 之前安装了 domino 包和与之相关的代码,我还使用了从 main.server 导入的 AppServerModule 和来自 require('./dist/server/main' 的 AppServerModuleNgFactory ) 并将它们都用于 app.engine() 中的引导属性,但仍然得到相同的错误!
    猜你喜欢
    • 2018-08-06
    • 2019-04-27
    • 2020-06-22
    • 2018-12-21
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2019-11-15
    • 2022-07-24
    相关资源
    最近更新 更多