2017-06-14 32 views
1

Angular Universalを使用してサーバー側のレンダリングを有効にする方法を学習するために、新しいAngular CLIプロジェクトをセットアップしました。Angular 4ユニバーサル遅延読み込みエラー

私はセットアップが完了し、すべてがうまくいっていますが、私はlazyというモジュールを遅延ロードすることに決めました。

私は、ng serveを使用すると動作しますが、ユニバーサルが(AOTを使用して)実行しているときに、私が遅延ルートに行き、ページをリフレッシュすると、ブラウザに遅延コンポーネントが表示されますが、

ERROR { Error: Uncaught (in promise): ReferenceError: System is not defined 
ReferenceError: System is not defined 
    at SystemJsNgModuleLoader.loadFactory (C:\Users\shachar\Desktop\universal\packages\core\src\linker\system_js_ng_module_factory_loader.ts:67:1) 
    at SystemJsNgModuleLoader.load (C:\Users\shachar\Desktop\universal\node_modules\@angular\core\bundles\core.umd.js:5724:35) 
    at RouterConfigLoader.loadModuleFactory (C:\Users\shachar\Desktop\universal\packages\router\src\router_config_loader.ts:71:1) 
    at RouterConfigLoader.load (C:\Users\shachar\Desktop\universal\node_modules\@angular\router\bundles\router.umd.js:3402:52) 
    at MergeMapSubscriber.project (C:\Users\shachar\Desktop\universal\node_modules\@angular\router\bundles\router.umd.js:1570:74) 
    at MergeMapSubscriber._tryNext (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\operator\mergeMap.ts:125:21) 
    at MergeMapSubscriber._next (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\operator\mergeMap.ts:115:12) 
    at MergeMapSubscriber.Subscriber.next (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\Subscriber.ts:95:12) 
    at ScalarObservable._subscribe (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\observable\ScalarObservable.ts:51:18) 
    at ScalarObservable.Observable._trySubscribe (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\Observable.ts:113:19) 
    at resolvePromise (C:\Users\shachar\Desktop\universal\node_modules\zone.js\dist\zone-node.js:770:31) 
    at resolvePromise (C:\Users\shachar\Desktop\universal\node_modules\zone.js\dist\zone-node.js:741:17) 
    at C:\Users\shachar\Desktop\universal\node_modules\zone.js\dist\zone-node.js:818:17 
    at ZoneDelegate.invokeTask (C:\Users\shachar\Desktop\universal\node_modules\zone.js\dist\zone-node.js:424:31) 
    at Object.onInvokeTask (C:\Users\shachar\Desktop\universal\packages\core\src\zone\ng_zone.ts:257:1) 
    at ZoneDelegate.invokeTask (C:\Users\shachar\Desktop\universal\node_modules\zone.js\dist\zone-node.js:423:36) 
    at Zone.runTask (C:\Users\shachar\Desktop\universal\node_modules\zone.js\dist\zone-node.js:191:47) 
    at drainMicroTaskQueue (C:\Users\shachar\Desktop\universal\node_modules\zone.js\dist\zone-node.js:584:35) 
    at Server.ZoneTask.invoke (C:\Users\shachar\Desktop\universal\node_modules\zone.js\dist\zone-node.js:490:25) 
    at emitTwo (events.js:106:13) 
    rejection: 
    { ReferenceError: System is not defined 
     at SystemJsNgModuleLoader.loadFactory (C:\Users\shachar\Desktop\universal\packages\core\src\linker\system_js_ng_module_factory_loader.ts:67:1) 
     at SystemJsNgModuleLoader.load (C:\Users\shachar\Desktop\universal\node_modules\@angular\core\bundles\core.umd.js:5724:35) 
     at RouterConfigLoader.loadModuleFactory (C:\Users\shachar\Desktop\universal\packages\router\src\router_config_loader.ts:71:1) 
     at RouterConfigLoader.load (C:\Users\shachar\Desktop\universal\node_modules\@angular\router\bundles\router.umd.js:3402:52) 
     at MergeMapSubscriber.project (C:\Users\shachar\Desktop\universal\node_modules\@angular\router\bundles\router.umd.js:1570:74) 
     at MergeMapSubscriber._tryNext (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\operator\mergeMap.ts:125:21) 
     at MergeMapSubscriber._next (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\operator\mergeMap.ts:115:12) 
     at MergeMapSubscriber.Subscriber.next (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\Subscriber.ts:95:12) 
     at ScalarObservable._subscribe (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\observable\ScalarObservable.ts:51:18) 
     at ScalarObservable.Observable._trySubscribe (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\Observable.ts:113:19) 
    __zone_symbol__currentTask: 
     ZoneTask { 
     _zone: [Object], 
     runCount: 0, 
     _zoneDelegates: null, 
     _state: 'notScheduled', 
     type: 'microTask', 
     source: 'Promise.then', 
     data: undefined, 
     scheduleFn: undefined, 
     cancelFn: null, 
     callback: [Function], 
     invoke: [Function] } }, 
    promise: 
    ZoneAwarePromise { 
    __zone_symbol__state: 0, 
    __zone_symbol__value: 
     { ReferenceError: System is not defined 
      at SystemJsNgModuleLoader.loadFactory (C:\Users\shachar\Desktop\universal\packages\core\src\linker\system_js_ng_module_factory_loader.ts:67:1) 
      at SystemJsNgModuleLoader.load (C:\Users\shachar\Desktop\universal\node_modules\@angular\core\bundles\core.umd.js:5724:35) 
      at RouterConfigLoader.loadModuleFactory (C:\Users\shachar\Desktop\universal\packages\router\src\router_config_loader.ts:71:1) 
      at RouterConfigLoader.load (C:\Users\shachar\Desktop\universal\node_modules\@angular\router\bundles\router.umd.js:3402:52) 
      at MergeMapSubscriber.project (C:\Users\shachar\Desktop\universal\node_modules\@angular\router\bundles\router.umd.js:1570:74) 
      at MergeMapSubscriber._tryNext (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\operator\mergeMap.ts:125:21) 
      at MergeMapSubscriber._next (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\operator\mergeMap.ts:115:12) 
      at MergeMapSubscriber.Subscriber.next (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\Subscriber.ts:95:12) 
      at ScalarObservable._subscribe (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\observable\ScalarObservable.ts:51:18) 
      at ScalarObservable.Observable._trySubscribe (C:\Users\shachar\Desktop\universal\node_modules\rxjs\src\Observable.ts:113:19) __zone_symbol__currentTask: [Object] } }, 
    zone: 
    Zone { 
    _properties: { isAngularZone: true }, 
    _parent: 
     Zone { 
     _properties: {}, 
     _parent: null, 
     _name: '<root>', 
     _zoneDelegate: [Object] }, 
    _name: 'angular', 
    _zoneDelegate: 
     ZoneDelegate { 
     _taskCounts: [Object], 
     zone: [Circular], 
     _parentDelegate: [Object], 
     _forkZS: null, 
     _forkDlgt: null, 
     _forkCurrZone: [Object], 
     _interceptZS: null, 
     _interceptDlgt: null, 
     _interceptCurrZone: [Object], 
     _invokeZS: [Object], 
     _invokeDlgt: [Object], 
     _invokeCurrZone: [Circular], 
     _handleErrorZS: [Object], 
     _handleErrorDlgt: [Object], 
     _handleErrorCurrZone: [Circular], 
     _scheduleTaskZS: [Object], 
     _scheduleTaskDlgt: [Object], 
     _scheduleTaskCurrZone: [Circular], 
     _invokeTaskZS: [Object], 
     _invokeTaskDlgt: [Object], 
     _invokeTaskCurrZone: [Circular], 
     _cancelTaskZS: [Object], 
     _cancelTaskDlgt: [Object], 
     _cancelTaskCurrZone: [Circular], 
     _hasTaskZS: [Object], 
     _hasTaskDlgt: [Object], 
     _hasTaskDlgtOwner: [Circular], 
     _hasTaskCurrZone: [Circular] } }, 
    task: 
    ZoneTask { 
    _zone: 
     Zone { 
     _properties: [Object], 
     _parent: [Object], 
     _name: 'angular', 
     _zoneDelegate: [Object] }, 
    runCount: 0, 
    _zoneDelegates: null, 
    _state: 'notScheduled', 
    type: 'microTask', 
    source: 'Promise.then', 
    data: undefined, 
    scheduleFn: undefined, 
    cancelFn: null, 
    callback: [Function], 
    invoke: [Function] } } 

いいえ、私はSystemJSをまったく使用していません。

app.module.ts:

import { BrowserModule } from '@angular/platform-browser'; 
import { NgModule } from '@angular/core'; 
import { APP_BASE_HREF } from '@angular/common'; 
import { RouterModule } from '@angular/router'; 

import { AppComponent } from './app.component'; 
import { LazyModule } from './lazy/lazy.module'; 
import { HomeComponent } from './home/home.component'; 

@NgModule({ 
    declarations: [ 
    AppComponent, 
    HomeComponent 
    ], 
    imports: [ 
    BrowserModule.withServerTransition({ appId: 'universal' }), 
    RouterModule.forRoot([ 
     { 
     path: '', 
     component: HomeComponent 
     }, 
     { 
     path: 'lazy', 
     loadChildren: './lazy/lazy.module#LazyModule' 
     } 
    ]) 
    ], 
    providers: [{ provide: APP_BASE_HREF, useValue: '/' }], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

lazy.module.ts:

import { NgModule } from '@angular/core'; 
import { CommonModule } from '@angular/common'; 
import { RouterModule } from '@angular/router'; 

import { LazyComponent } from './lazy.component'; 

@NgModule({ 
    imports: [ 
    CommonModule, 
    RouterModule.forChild([ 
     { path: '', component: LazyComponent } 
    ]) 
    ], 
    declarations: [LazyComponent] 
}) 
export class LazyModule { } 

import { NgModule } from '@angular/core'; 
import { ServerModule } from '@angular/platform-server'; 
import { AppModule } from './app.module'; 
import { AppComponent } from './app.component'; 

@NgModule({ 
    imports: [ 
    ServerModule, 
    AppModule 
    ], 
    bootstrap: [AppComponent] 
}) 
export class AppServerModule { } 

server.ts:ユニバーサルがある私は嬉しい

import 'reflect-metadata'; 
import 'zone.js/dist/zone-node'; 

import * as Express from 'express'; 
import { join } from 'path'; 
import { readFileSync } from 'fs'; 
import { renderModuleFactory } from '@angular/platform-server'; 
import { enableProdMode } from '@angular/core'; 

const { AppServerModuleNgFactory } = require('../dist/ngfactory/src/app/app.server.module.ngfactory'); 

const app = Express(); 

enableProdMode(); 

const PORT = 4000; 

const template = readFileSync(join(__dirname, '..', 'dist', 'index.html')).toString(); 

app.engine('html', (_, options, callback) => { 
    const opts = { document: template, url: options.req.url }; 

    renderModuleFactory(AppServerModuleNgFactory, opts) 
    .then(html => callback(null, html)); 
}); 

app.set('views', join(__dirname, '..', 'dist')); 
app.set('view engine', 'html'); 

app.get('*.*', Express.static(join(__dirname, '..', 'dist'))); 

app.get('*', (req, res) => { 
    res.render('index', { req }); 
}); 

app.listen(PORT,() => { 
    console.log(`Listening on port ${PORT}`); 
}); 

を(表現)作業中ですが、リフレッシュするたびにこのエラーメッセージが表示されるのは悪いことです。

+0

何人か考えてみませんか? – shabenda

答えて

0

サーバー側レンダリングでAngular AOT CLI遅延ロードに問題があります。サーバは角度のデフォルトローダである "System"を認識していません。したがって、その場合は、webpack構成を介してサーバー側にテンプレートローディング用にangular2-template-loaderと 'angular2-router-loader'を追加する必要があります。

+0

@ ngtools/webpackでも同様に動作しますか?たとえば、「@ ngtools/webpack」、「angular2-template-loader」、「angular-router-loader」を使用します。 –

0

CLIのバンドラを使用した遅延読み込みは、現在サポートされていません。hereを参照してください。これは、今後のリリースを予定しており、積極的に開発中です。