Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度9-通用+;快车_Angular_Angular Universal - Fatal编程技术网

Angular 角度9-通用+;快车

Angular 角度9-通用+;快车,angular,angular-universal,Angular,Angular Universal,我在Angular 8上使用了universal,一切都很好,但新版本有一些问题 如果不使用angular应用程序编译server.ts,就不可能再使用ngExpressEngine了。你以前完全可以这么做 我有一个巨大的代码库,是用js为我的express服务器编写的,我无法用angular应用程序编译它,就像用原理图设置一样。从基本设置开始,您只需将所有内容编译在一起,然后节点../dist/myapp/server/main.js启动“通用”服务器 所以我希望我能做的是在没有server.

我在Angular 8上使用了universal,一切都很好,但新版本有一些问题

如果不使用angular应用程序编译server.ts,就不可能再使用ngExpressEngine了。你以前完全可以这么做

我有一个巨大的代码库,是用js为我的express服务器编写的,我无法用angular应用程序编译它,就像用原理图设置一样。从基本设置开始,您只需将所有内容编译在一起,然后
节点../dist/myapp/server/main.js
启动“通用”服务器

所以我希望我能做的是在没有server.ts的情况下构建我的服务器端angular应用程序,然后在我需要的时候从我的主应用程序将其与ngExpressEngine一起使用

=========================================================================

编辑大卫的答案

require("zone.js/dist/zone-node");
const { ngExpressEngine } = require("@nguniversal/express-engine");
const express = require("express");
const app = express();
const { join } = require("path");
const { AppServerModule } = require("./dist/ttmodel/server/main");
const { existsSync } = require("fs");
const { APP_BASE_HREF } = require("@angular/common");

app.use(express.static(join(__dirname, "dist")));

const distFolder = join(process.cwd(), "dist/ttmodel/browser");
const indexHtml = existsSync(join(distFolder, "index.original.html"))
  ? "index.original.html"
  : "index";

app.engine(
  "html",
  ngExpressEngine({
    bootstrap: AppServerModule,
  })
);

app.set("view engine", "html");
app.set("views", distFolder);

app.get(
  "*.*",
  express.static(distFolder, {
    maxAge: "1y",
  })
);

app.get("*", (req, res) => {
  res.render(indexHtml, {
    req,
    providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }],
  });
});

app.listen(3000);
你的意思是这样的?我试过了,但没有成功,我最终

Error: ENOENT: no such file or directory, open 'app.component.html'
在原始server.ts上,可以直接从“./src/main.server”导入AppServerModule

我试图使用
@angular/platform server
中的
renderModule
renderModuleFactory
,但我也无法让它工作。

我可能错了(我还没有测试过),但我认为您可以从编译的angular服务器包中导入自己服务器中需要的任何内容

如果查看默认的
server.ts
的底部,可以看到以下几行

// Webpack will replace 'require' with '__webpack_require__'
// '__non_webpack_require__' is a proxy to Node 'require'
// The below code is to ensure that the server is run only when not requiring the bundle.
declare const __non_webpack_require__: NodeRequire;
const mainModule = __non_webpack_require__.main;
const moduleFilename = mainModule && mainModule.filename || '';
if (moduleFilename === __filename || moduleFilename.includes('iisnode')) {
  run();
}

export * from './src/main.server';
因此,如果您只是使用angular 9新的编译方法编译
server.ts
,那么最后将得到一个
main.js
文件。您只需在自己的代码中使用
require
这个
main.js
包,就可以从中获得
AppServerModule
,并在自己的代码中使用它

const {AppServerModule} = require('./dist/server/main');

你到底想实现什么?谢谢你的回答,我试着改进我的问题谢谢,我试过了,但没有成功。不幸的是,我更新了我的问题,向你展示了我所测试的内容,你的编辑就是我想要的。我明天就去试试汉克斯,如果你能找到办法那就太棒了,我试了三天。文档对于universal是有限的,但即使在官方的@angular/platform服务器端也几乎没有什么。我只是很快尝试了一下,得到了一个与您不同的错误。现在没有时间调查。这对你的场景有帮助吗?好的,谢谢您的尝试,是的,如果我有AppServerModuleNgFactory可以解决我的问题,但是它不在服务器构建的导出中,而且问题不会出现在任何地方。我设法使它与一个服务器专用于通用,但老实说,它是如此丑陋。