2017-09-06 5 views
6

「サーバ側レンダリング」を有効にしたサーバでAngular 4アプリをホストするのに約3時間を探していました。 注 - ApacheをインストールしたAWSサーバー(Ubuntu)があります。プロードサーバでサーバ側レンダリングを使用するAngular 4アプリをデプロイする方法

まず、Angular 4アプリ(サーバー側のレンダリングなし)をどのようにホストできるかを知っています。しかし、私の主な関心事は、私のアプリをサーバサイドレンダリングが可能にしたいということです。私の地元で

は、私が上で自動的に(サーバー側レンダリングが有効で)アプリを提供していますnpm startコマンドを使用します - http://localhost:4000

package.jsonファイルには、次のようになります。

... 
"scripts": { 
    "serve": "ng serve", 
    "prestart": "ng build --prod && ngc && webpack", 
    "start": "node dist/server.js", 
    "build": "ng build" 
}, 
... 

これらのすべてのコマンドうまく動作しています。しかし、私は、それはまた、インストールするnode_modulesを要求するように、それは私が再び、本番サーバー上で

npm start 

を実行する必要があり混乱しています。それは私にとって正しい方法ではないようですか?

「サーバー側のレンダリング」を有効にして、誰でもアプリをホストすることができますか?

+0

最終的にあなたの質問を読んでも、下の回答者の奇妙な誰も気にしませんでした。私はちょうどNginxを介して角度のSSRとプロキシを展開し、いくつかの静的ファイルに問題が表示されていない – Rexford

+0

@レックスフォードうん、あなたは正しい...誰も私の質問を正しくresdていないと彼らは何を答えている実際に私もあなたと同じ方法でやっていますが、代わりにApacheを使用しています。 –

+0

私は下のプロダクションで自分のSSR角度アプリをどのように動かしているのかを共有しました。私はそれが助けて欲しい。 – Rexford

答えて

0

実際は非常に簡単です。

角度4プロジェクトのディレクトリに移動するには、シェルを使用します。 とは、次の操作を行います。

$ ng build --prod 

これは、アプリケーションをコンパイルし、結果はあなたの角度アプリケーションのルートにdistのフォルダ内にあります。

distフォルダの内容をHTTPサーバーに入れてポップコーンを食べるだけで済みます。

Cdly、 Jerry Yong-busson。

+1

私は実際にあなたが私の質問を慎重に読んでいないと思う。あなたが与えた解決策は、私の質問で言及されているように私に既に知られています。私は、サーバー側のレンダリングを有効にしてアプリをホストするためのソリューションを望んでいます... –

0

ご質問ありがとうございます。

まず、Apacheはアプリケーションを提供する必要はありません。これは、node.jsがあなたにサービスを提供するためです。

サーバー上でApacheサービスが不要な場合は、セキュリティに関する質問や、アプリケーション間のポート衝突を避けるために、Apacheサービスを無効にする必要があります。

角度アプリを変更するには、サーバーレンダリングが必要です。始めましょう。

1)あなたの角度のプロジェクトに移動して、それらのパッケージをインストールします。

npm i -S @angular/platform-server @angular/animations express 

2)を開きのsrc /アプリ/ app.module.ts、アプリ名の下にコメント行を変更します。

@NgModule({ 
    declarations: [ 
    AppComponent 
    ], 
    imports: [ 
    BrowserModule.withServerTransition({ appId: 'your-angular-app-name' }), // You just have to change this line 
    FormsModule, 
    HttpModule, 
    AppRoutingModule 
    ], 
    providers: [], 
    bootstrap: [AppComponent] 
}) 

3)ここで、あなたのアプリケーションにサーバーを設定します。このためには、ファイルapp/src/app.server.moduleを作成します。tsと次のコードに記載されています。

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

@NgModule({ 
imports: [ 
    ServerModule, // Load the servermodule 
    AppModule  // Load the modules of AppModule 
], 
bootstrap: [AppComponent] 
}) 
export class AppServerModule { } 

4)のsrc/server.tsファイルを作成し、次のコードを追加します。これはノードサーバーです。

import 'reflect-metadata'; 
import 'zone.js/dist/zone-node'; 
import { platformServer, renderModuleFactory } from '@angular/platform-server'; 
import { enableProdMode } from '@angular/core'; 
import { AppServerModuleNgFactory } from '../dist/ngfactory/src/app/app.server.module.ngfactory'; 
import * as express from 'express'; 
import { readFileSync } from 'fs'; 
import { join } from 'path'; 
const PORT = 4000; 
enableProdMode(); 
const app = express(); 
let 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('view engine', 'html'); 
app.set('views', 'src'); 
app.get('*.*', express.static(join(__dirname, '..', 'dist'))); 
app.get('*', (req, res) => { 
    res.render('index', { req }); 
}); 
app.listen(PORT,() => { 
    console.log(`Listening on http://localhost:${PORT}...`); 
}); 

5)オープンのsrc/tsconfig.app.jsonと除外JSON変数にserver.tsにファイルを追加します。

{ 
    "extends": "../tsconfig.json", 
    "compilerOptions": { 
    "outDir": "../out-tsc/app", 
    "module": "es2015", 
    "baseUrl": "", 
    "types": [] 
    }, 
    "exclude": [ 
    "server.ts", # Just here ! 
    "test.ts", 
    "**/*.spec.ts" 
    ] 
} 

6)オープンtsconfig.jsonは、プロジェクトのルートに見つけ、このようなangularCompilerOptions追加:

{ 
    "compileOnSave": false, 
    "compilerOptions": { 
    "outDir": "./dist/out-tsc", 
    "baseUrl": "src", 
    "sourceMap": true, 
    "declaration": false, 
    "moduleResolution": "node", 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "target": "es5", 
    "typeRoots": [ 
     "node_modules/@types" 
    ], 
    "lib": [ 
     "es2016", 
     "dom" 
    ] 
    }, 
    "angularCompilerOptions": { 
    "genDir": "./dist/ngfactory", 
    "entryModule": "./src/app/app.module#AppModule" 
    } 
} 

7)さて、あなたにpackage.jsonを変更あなたの人生を楽にしてください。私は、これはあなたを助けることを願っています

npm start 

{ 
    "scripts": { 
    "prestart": "ng build --prod && ngc", 
    "start": "ts-node src/server.ts", 
    "ng": "ng", 
    "start": "ng serve", 
    "build": "ng build", 
    "test": "ng test", 
    "lint": "ng lint", 
    "e2e": "ng e2e" 
    }, 
} 

8)は、今、あなたがあなたのアプリケーションをテストすることができます。

注: プロジェクトがすでに存在する場合のNode.jsがわからないので、あなたはおそらく、ウィンドウオブジェクトを角度素材のようないくつかのモジュールのいくつかの問題があるでしょう、ドキュメントオブジェクト。

  • は、そのほかのモジュールのロードファイル継承しますapp.common.module.tsを作成します。

    だから、あなたがする必要があります。共通モジュール(クライアント+サーバー)を収集します。

  • 最後に、のapp.module.tsに私たちを悩ましているモジュールを入れてください。

Cdly。

+0

申し訳ありませんが、これは私の質問に答えるとは思わない。私はプロジェクトを構造化するよう求めていません。上記の方法は、私が実装しているのと同じですが、私の質問は、サーバー上でその特定のアプリケーションを提供する方法です。私はその実装をしたい! –

-2

いいえ7 package.jsnoスクリプトに重複した開始スクリプトがあります。

また、共有ホスティングアカウントに含まれていないサーバーサポートが必要です。

0

誰もが有効になって、「サーバー側のレンダリング」で私のアプリをホスティングで私を助けてくださいすることができますが

ng build --prod --aot 
+0

私の目的は、サーバー側のレンダリングで角度のホストバージョンを達成することです。 –

1

を使用することができます。

はい。残念ながら、私はNginxを使用します。しかし、このアプローチはApacheやその他のものでは違うべきではありません。

これは、サーバーサイドレンダリング角度アプリケーションをプロダクションでホスティングする方法です(私は実行中です)。あなたは、リモートサーバー上にdist/フォルダ内のすべてのものを送信するために管理した後、あなたが実行し、

enter image description here

:私はそれについてon my blog記事を書きました:あなたのSSRを構築した後

を、あなたはこのような何かを持っている必要がありますそれは

ラン(私は私のノードのアプリを実行するために使用するものである)pm2を使用してpm2 start path/to/dist/server.js --name name_of_process

それはbでなければなりませんe実行中localhost:4000

以下のNginx仮想サーバーブロックは、Nginxを介してすべての要求をサーバー側レンダリング角度アプリケーションにプロキシする必要があります。

以下のnginx confは、実際には角SSRの両方の統計情報を提供し、要求が静的ファイルでない場合はプロキシに戻ります。

upstream ssr_khophi_nodejs { 
    server 127.0.0.1:4000; 
} 

server { 
    listen 443 ssl http2; 

    server_name staging.khophi.com; # <--- Change this part 

    include /etc/nginx/ssl/ssl-params.conf;# <--- Ignore this part if not using SSL 
    include /etc/nginx/ssl/khophi.com.ssl;# <--- Ignore this part if not using SSL 

    root /home/khophi/khophi.com/ssr/dist/browser; # <-- Notice where we're point to 

    location/{ 
     try_files $uri $uri @backend; # <--- This looks for requests (statics i.e js/css/fonts) 
             # in /ssr/dist/browser folder. If nothing found, calls @backend 
    } 

    location @backend { 
     # NOTE THERE IS NO TRAILING SLASH AT THE END. NO TRAILING SLASH. NO SLASH. NO! 
     proxy_pass http://ssr_khophi_nodejs; # <--- THIS DOES NOT HAVE A TRAILING '/' 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_http_version 1.1; 
     proxy_set_header X-NginX-Proxy true; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_cache_bypass $http_upgrade; 
     proxy_redirect off; 
     proxy_set_header X-Forwarded-Proto $scheme; 
    } 
} 

server { 
    listen 80; 
    server_name staging.khophi.com; 
    return 301 https://$server_name$request_uri?; 
} 

私はこれがあなたを助けてくれることを願っています。

+0

答えに感謝しますが、私はこれをApacheで実装しました。私はサーバー側のレンダリングの準備方法を理解しました。私も中程度の記事を書いた - https://blog.squareboat.com/how-to-implement-server-side-rendering-using-angular-4-5da10f4dcb61 –

関連する問題