Sau*_*kar 21 javascript angular-cli angular-universal angular angular5
我按照本指南将现有的angular-cli应用程序转换为角度通用.
你可以在这里查看我的完整源代码.
我能够构建浏览器和客户端项目,但是当我在浏览器中查看应用程序时出现以下错误:
错误:您必须传入NgModule或NgModuleFactory才能在View.engine中进行自举(D:\ng-ssr-demo\dist\server.js:359545:23)
问题出在我的server.ts文件中,其中AppServerModuleNgFactory未定义,并且由于此工厂用于在快速后端引导应用程序,因此引导失败.
./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)
]
}));
Run Code Online (Sandbox Code Playgroud)
./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'), {}
)
]
}
Run Code Online (Sandbox Code Playgroud)
./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
}
}
Run Code Online (Sandbox Code Playgroud)
./src/main.server.ts:
export { AppServerModule } from './app/app.server.module';
Run Code Online (Sandbox Code Playgroud)
./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 {
}
Run Code Online (Sandbox Code Playgroud)
./src/app/app.server.module.ts:
@NgModule({
imports: [
AppModule,
ServerModule,
ModuleMapLoaderModule
],
bootstrap: [AppComponent],
})
export class AppServerModule {}
Run Code Online (Sandbox Code Playgroud)
我检查了你的回购,并能够在浏览器中查看dist没有错误.也许你忘了-prod在运行build时添加标志?请试试这个
ng build --prod
Run Code Online (Sandbox Code Playgroud)
您还npm cache clean可以npm install在尝试再次构建之前完全删除dist和/或删除node_modules,do ,run .
如果您使用的是npm脚本,我注意到您的/ server构建缺少该--prod标志.请试试这个
"build:server": "ng build --prod --app 1 --output-hashing=false",
Run Code Online (Sandbox Code Playgroud)
ANGULAR 8 UPDATE(v8.0.1-截至2019年6月)
对我来说,我使用Angular CLI运行了通用设置,但无法立即使用。经过数小时的阅读,我发现这些包装不匹配。我有Angular 8运行该项目,但我的package.json中的nguniversal包在v7中指定。
我建议将它们更新为已安装的相同版本的angular。默认情况下,CLI应该确实会执行此操作,但我猜不是(还?)。
对于Angular 8,在撰写本文时(2019年6月),这是version @next或@8.0.0-rc.1,因此请运行以下命令进行更新:
npm i --save @nguniversal/express-engine@next @nguniversal/module-map-ngfactory-loader@next
Run Code Online (Sandbox Code Playgroud)
更新此内容后,我仍然遇到错误,并设法确定了另一个问题。我还必须关闭服务器端应用程序的Ivy编译器。为此,我将以下行添加到tsconfig.server.json:
{
"extends": "./tsconfig.app.json",
...
"angularCompilerOptions": {
...
"enableIvy": false
}
...
}
Run Code Online (Sandbox Code Playgroud)
在Angular 8中,默认情况下Ivy是关闭的,但是由于我的tsconfig.server.jsonExtend tsconfig.app.json和应用程序配置已启用Ivy,因此我必须为服务器配置显式将其关闭。
毕竟,服务器对内容的请求实际上已开始为我工作。
如果这对您没有帮助,我建议下载angular文档中提到的通用示例项目:
下载:https : //angular.io/generation/zips/universal/universal.zip 文件:https : //angular.io/guide/universal
下载后,比较所有相关文件以确保您具有相同的文件。如果您在自己的项目中仍然遇到错误,但示例仍在工作,则尝试将设置文件,模块和组件等一一移动到示例项目中,然后看看有什么问题。这样便可以确定是我的tsconfig.server.json文件损坏了它。
| 归档时间: |
|
| 查看次数: |
1964 次 |
| 最近记录: |