Angular 角度9-通用+;快车
我在Angular 8上使用了universal,一切都很好,但新版本有一些问题 如果不使用angular应用程序编译server.ts,就不可能再使用ngExpressEngine了。你以前完全可以这么做 我有一个巨大的代码库,是用js为我的express服务器编写的,我无法用angular应用程序编译它,就像用原理图设置一样。从基本设置开始,您只需将所有内容编译在一起,然后Angular 角度9-通用+;快车,angular,angular-universal,Angular,Angular Universal,我在Angular 8上使用了universal,一切都很好,但新版本有一些问题 如果不使用angular应用程序编译server.ts,就不可能再使用ngExpressEngine了。你以前完全可以这么做 我有一个巨大的代码库,是用js为我的express服务器编写的,我无法用angular应用程序编译它,就像用原理图设置一样。从基本设置开始,您只需将所有内容编译在一起,然后节点../dist/myapp/server/main.js启动“通用”服务器 所以我希望我能做的是在没有server.
节点../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可以解决我的问题,但是它不在服务器构建的导出中,而且问题不会出现在任何地方。我设法使它与一个服务器专用于通用,但老实说,它是如此丑陋。