- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我按照 this guide 将我现有的 angular-cli 应用程序转换为 angular-universal .
可以看看我的完整源码here .
我能够同时构建浏览器和客户端项目,但在浏览器中查看应用程序时出现以下错误:
Error: You must pass in a NgModule or NgModuleFactory to be bootstrapped at View.engine (D:\ng-ssr-demo\dist\server.js:359545:23)
问题出在我的 server.ts 文件中,其中 AppServerModuleNgFactory 未定义,并且由于此工厂用于在 express 后端引导应用程序,因此引导失败.
./server.ts:
const MockBrowser = require('mock-browser').mocks.MockBrowser;
const mock = new MockBrowser();
// Faster server renders w/ Prod mode (dev mode never needed)
enableProdMode();
// Express server
const app = express();
const PORT = process.env.PORT || 4000;
const DIST_FOLDER = join(process.cwd(), 'dist');
// Fix for window error:
const domino = require('domino');
const fs = require('fs');
const path = require('path');
const template = fs.readFileSync(path.resolve('./', 'dist', 'browser/', 'index.html')).toString();
const win = domino.createWindow(template);
// workaround for leaflet
global['window'] = win;
global['document'] = win.document;
// workaround for nex-charts
win.screen = { deviceXDPI: 0, logicalXDPI: 0 };
global['MouseEvent'] = win.MouseEvent;
global['navigator'] = mock.getNavigator();
// * NOTE :: leave this as require() since this file is built Dynamically from webpack
const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./dist/server/main.bundle');
// AppServerModuleNgFactory is undefined
console.log('AppServerModuleNgFactory', AppServerModuleNgFactory);
// This is injected
console.log('LAZY_MODULE_MAP', LAZY_MODULE_MAP);
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
app.engine('html', ngExpressEngine({
bootstrap: AppServerModuleNgFactory,
providers: [
provideModuleMap(LAZY_MODULE_MAP)
]
}));
./webpack.server.config.js:
module.exports = {
entry: {
// This is our Express server for Dynamic universal
server: './server.ts',
// This is an example of Static prerendering (generative)
prerender: './prerender.ts'
},
target: 'node',
resolve: { extensions: ['.ts', '.js'] },
// Make sure we include all node_modules etc
externals: [/node_modules/],
output: { path: path.join(__dirname, 'dist'), filename: '[name].js' },
module: { rules: [{ test: /\.ts$/, loader: 'ts-loader'}] },
plugins: [
new webpack.ContextReplacementPlugin(
// fixes WARNING Critical dependency: the request of a dependency is an expression
/(.+)?angular(\\|\/)core(.+)?/,
path.join(__dirname, 'src'), // location of your src
{} // a map of your routes
),
new webpack.ContextReplacementPlugin(
// fixes WARNING Critical dependency: the request of a dependency is an expression
/(.+)?express(\\|\/)(.+)?/,
path.join(__dirname, 'src'), {}
)
]
}
./src/tsconfig.server.json:
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/app",
"module": "commonjs",
"baseUrl": "./",
"types": ["node"],
"typeRoots": ["../node_modules/@types"],
"paths": {
"@angular/*": [
"../node_modules/@angular/*"
],
"@nebular/*": [
"../node_modules/@nebular/*"
]
}
},
"exclude": [
"test.ts",
"**/*.spec.ts"
],
"angularCompilerOptions": {
"entryModule": "app/app.server.module#AppServerModule",
"platform": 1
}
}
./src/main.server.ts:
export { AppServerModule } from './app/app.server.module';
./src/app/app.module.ts:
@NgModule({
declarations: [AppComponent],
imports: [
BrowserModule.withServerTransition({appId: 'my-app'}),
BrowserAnimationsModule,
HttpModule,
AppRoutingModule,
NgbModule.forRoot(),
ThemeModule.forRoot(),
CoreModule.forRoot(),
environment.production ? ServiceWorkerModule.register('./ngsw-worker.js') : [],
],
bootstrap: [AppComponent],
providers: [
{ provide: APP_BASE_HREF, useValue: '/' }, WebWorkerService,
],
})
export class AppModule {
}
./src/app/app.server.module.ts:
@NgModule({
imports: [
AppModule,
ServerModule,
ModuleMapLoaderModule
],
bootstrap: [AppComponent],
})
export class AppServerModule {}
最佳答案
ANGULAR 8 更新(v8.0.1 - 截至 2019 年 6 月)
对我来说,我使用 Angular CLI 运行了通用设置,但它并没有直接运行。经过数小时的阅读后,我发现包裹不匹配。我让 Angular 8 运行该项目,但我的 package.json 中的 nguniversal 包是在 v7 指定的。
我建议将它们更新为您安装的相同版本的 Angular。 CLI 应该默认执行此操作,但我猜(还没有?)。
对于 Angular 8,在撰写本文时(2019 年 6 月)这是版本 @next
或 @8.0.0-rc.1
,因此请运行以下命令更新命令:
npm i --save @nguniversal/express-engine@next @nguniversal/module-map-ngfactory-loader@next
更新后我仍然收到错误,并设法确定了另一个问题。我还必须为服务器端应用程序关闭 Ivy 编译器。为此,我将以下行添加到 tsconfig.server.json
:
{
"extends": "./tsconfig.app.json",
...
"angularCompilerOptions": {
...
"enableIvy": false
}
...
}
Ivy 在 Angular 8 中默认关闭,但是因为我的 tsconfig.server.json
扩展了 tsconfig.app.json
,并且应用配置打开了 Ivy,我必须为服务器配置明确关闭它。
在这一切之后,服务器对内容的请求实际上开始为我工作。
如果这对您没有帮助,我建议您下载 Angular 文档中提到的通用示例项目:
下载:https://angular.io/generated/zips/universal/universal.zip文档:https://angular.io/guide/universal
下载后,比较所有相关文件以确保您拥有相同的文件。如果您在自己的项目中仍然遇到错误,但该示例正在运行,那么,请尝试将您的设置文件、模块和组件等一个一个地移动到示例项目中,看看是什么破坏了它。这就是我如何能够确定是我的 tsconfig.server.json
文件破坏了它。
关于javascript - Angular 通用获取错误 : You must pass in a NgModule or NgModuleFactory to be bootstrapped,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49850267/
它工作得很好,突然它在运行 ng serve 时开始给我下面的异常。我也没有做任何最近的升级或依赖项添加。 有人能帮我解决一下吗? ERROR in Error: NgModule is not an
关注此discussion ,我遇到了同样的问题:我无法在多个模块中导入 angular2-materialize 的指令,而不会出现错误消息“Type X is part of the statem
我想知道是创建一个包含我所有 Angular 2 代码的单个模块更好,还是将所有内容拆分到多个模块更好。例如,我正在使用 Angular 2 创建我的博客。所以我有一个“文章列表”组件和一个“文章”组
我正在关注这个 tutorial拥有我的应用程序的架构。 要提供更多信息,请考虑 A作为 appModule,和 B是另一个主要模块。现在我想在 B 的 NgModule 中加载其他模块( 有许多其
我正在尝试此链接中的所有解决方案: https://stack247.wordpress.com/2018/09/07/angular-all-possible-solutions-for-no-ng
当我使用 CLI 创建新组件时,我在这篇文章的主题中遇到错误:ng g c my-component --project=my-project(没有创建组件) 我看过其他帖子有相同的错误消息,但没有一
ERROR in node_modules/@angular/material/dialog/dialog.d.ts:142:22 -error NG6002: Appears in the NgMo
我刚刚从 Angular 8.2 更新到 9。 如果我禁用 ivy 一切正常,但是当它启用时,我收到了很多似乎有点模糊的错误,至少我在谷歌搜索时找不到任何结果。 我很确定我已经完成了更新所需的一切,即
第一次使用firestore,我收到了这个错误。根据我的研究,这似乎是 Ivy 的问题。我没有很多修改 tsconfig.app.json 的经验,这是我被指出的方向,遵循其他答案。 我能够从原始项目
您好,我刚刚使用简单的 CLI 从 CLI 创建了一个新项目 ng new frontend 一旦我进入我的项目,命令: cd frontend/src/app 并尝试像这样生成一个新组件 ng ge
我在应用程序上有三个模块,其中一个是主模块,用于其他两个模块。 当我启动应用程序并直接转到导入主模块的这些模块之一时,浏览器控制台中会显示此错误: core.js:4117 ERROR Error:
我有使用 ngx-translate 中的 TranslateModule 的模块(问题不是关于这个库,而是关于 Angular)。它看起来像这样: @NgModule({ ... impor
我想创建一个与图表相关的模块并将其写在其他地方。 模块声明源码如下。 图表.module.ts import { NgModule, ModuleWithProviders } from '@angu
我正在通过刚买的一本书学习 angular 2(成为 angular 2 的忍者)。 我也在同时浏览官方文档,但是在从官方网站进行快速入门时,我看到他们在谈论 @NgModule 而书中没有提到它。
我有这个 NgModule: @NgModule({ imports: [ CommonModule ], exports: [ SP21Loa
所以我现在正在学习 angular2 并阅读有关模块的 ngbook2。模块包含组件,但也可以导入具有公共(public)组件的不同模块。 问题是:模块组件的范围是什么(在这个范围内是应用程序的一部分
所以我创建了一个组件 示例组件 并在 的模块中声明它不是在 app.module 中列出。 接下来我要声明组件 示例组件 在一个模块中 是 在 app.module 中列出。我该怎么做呢?如果我简单地
我使用 angular 9,我想做延迟加载,我做 app-routing { path: '', loadChildren: () => import("./components/login/
我不明白为什么当我有了新的提供商时,我一次又一次地遇到这个错误。当我有任何其他提供商(如地理定位等)时,我遇到此错误: Error: Uncaught Error: Invalid provider
我有一个 Angular 应用程序,但我不明白编译器告诉我为什么应用程序无法构建的原因。这些是我从编译器收到的错误: ERROR in src/app/list-items/list-items.co
我是一名优秀的程序员,十分优秀!