File tree Expand file tree Collapse file tree 11 files changed +167
-0
lines changed Expand file tree Collapse file tree 11 files changed +167
-0
lines changed Original file line number Diff line number Diff line change
1
+ {
2
+ "presets" : [" es2015" , " react" ]
3
+ }
Original file line number Diff line number Diff line change
1
+ # Server-Side React
2
+
3
+ Membuat aplikasi React dengan dukungan server-side bukanlah sebuah keharusan. Tetapi ada beberapa keuntungan yang didapat bila kita menggunakan metode ini:
4
+ * _ load_ yang lebih cepat saat aplikasi pertama kali di-_ request_
5
+ * penggunaan browserHistory bila menggunakan react-router
6
+
7
+ Tidak ada yang berbeda dalam pembuatan aplikasi React dengan dukungan server-side app. Kita cuma menambahkan sebuah server yang me-render aplikasi pertama kali.
8
+ Sesudah itu aplikasi di client akan mengambil alih dan berfungsi seperti biasa.
9
+
10
+ Di latihan ini kita akan membuat sebuah web server menggunakan Express dan Babel. Ada baiknya untuk mengenal terlebih dahulu pembuatan web server menggunakan Express dan Node.
Original file line number Diff line number Diff line change
1
+ export default ( { body, title, initialState} ) => {
2
+ return `
3
+ <!DOCTYPE html>
4
+ <html lang="en">
5
+ <head>
6
+ <script>window.__APP_INITIAL_STATE__220877 = ${ initialState } </script>
7
+ <title>${ title } </title>
8
+ </head>
9
+ <body>
10
+ <div id="root">${ body } </div>
11
+ <script src="build/bundle.js"></script>
12
+ </body>
13
+ </html>
14
+ ` ;
15
+ } ;
16
+
17
+ //`body` dibutuhkan untuk render awal oleh server. Selanjutnya aplikasi akan dijalankan dari skrip React di dalam bundle.js hasil transpilasi Webpack.
Original file line number Diff line number Diff line change
1
+ {
2
+ "name" : " server-side-basic" ,
3
+ "version" : " 1.0.0" ,
4
+ "description" : " Basic Server-side React" ,
5
+ "main" : " index.js" ,
6
+ "scripts" : {
7
+ "start" : " webpack && babel-node --presets 'react,es2015' server.js"
8
+ },
9
+ "keywords" : [
10
+ " React" ,
11
+ " Basic Server-side" ,
12
+ " Node"
13
+ ],
14
+ "author" : " Arie M. Prasetyo" ,
15
+ "license" : " ISC" ,
16
+ "dependencies" : {
17
+ "babel-cli" : " ^6.18.0" ,
18
+ "babel-core" : " ^6.20.0" ,
19
+ "babel-loader" : " ^6.2.10" ,
20
+ "babel-preset-es2015" : " ^6.18.0" ,
21
+ "babel-preset-react" : " ^6.16.0" ,
22
+ "express" : " ^4.14.0" ,
23
+ "react" : " ^15.4.1" ,
24
+ "react-dom" : " ^15.4.1"
25
+ },
26
+ "devDependencies" : {}
27
+ }
Original file line number Diff line number Diff line change
1
+ import express from 'express'
2
+ import React from 'react'
3
+ import { renderToString } from 'react-dom/server'
4
+ import App from './src/App'
5
+ import template from './html.template.js'
6
+
7
+ const server = express ( ) ;
8
+
9
+ server . use ( '/build' , express . static ( 'build' ) ) ;
10
+
11
+ server . get ( '/' , ( req , res ) => {
12
+ //mengirimkan value dari server
13
+ const visitorName = 'Joni' ;
14
+
15
+ //membuat state awal untuk app yang di-render oleh server
16
+ const initialState = { visitorName} ;
17
+
18
+ //me-render request awal
19
+ const appString = renderToString ( < App { ...initialState } /> ) ;
20
+
21
+ res . send ( template ( {
22
+ body : appString ,
23
+ title : 'Server Side' ,
24
+ initialState : JSON . stringify ( initialState )
25
+ } ) ) ;
26
+ } ) ;
27
+
28
+ server . listen ( 8077 ) ;
Original file line number Diff line number Diff line change
1
+ import React from 'react'
2
+ import Header from './Header'
3
+ import Paragraphs from './Paragraphs'
4
+ import RandomNumber from './RandomNumber'
5
+
6
+ const App = props => (
7
+ < div >
8
+ < Header name = { props . visitorName } />
9
+ < RandomNumber />
10
+ < Paragraphs />
11
+ </ div >
12
+ )
13
+
14
+ export default App
Original file line number Diff line number Diff line change
1
+ import React from 'react'
2
+
3
+ const Header = ( { name} ) => (
4
+ < h1 > Hae, { name } </ h1 >
5
+ )
6
+
7
+ export default Header
Original file line number Diff line number Diff line change
1
+ import React from 'react'
2
+
3
+ const Paragraphs = ( ) => (
4
+ < div >
5
+ < p >
6
+ Kita menjalankan sebuah server Node langsung menggunakan babel-cli. Sehingga kita dapat menggunakan JSX langsung di server-side JS.
7
+ Untuk produksi lebih baik mentraspilasi server.js dan menjalankannya seperti server Node lainnya.
8
+ </ p >
9
+ < p >
10
+ Kerja server berhenti saat render pertama dikirim. Selanjutnya tugas dilakukan seperti biasa oleh bundle.js yang dibuat oleh Webpack.
11
+ Metode seperti onClick tidak akan bekerja bila kita hanya mengandalkan server-side.
12
+ </ p >
13
+ </ div >
14
+ )
15
+
16
+ export default Paragraphs
Original file line number Diff line number Diff line change
1
+ import React , { Component } from 'react'
2
+
3
+ class RandomNumber extends Component {
4
+ constructor ( ) {
5
+ super ( )
6
+ this . state = { num : 0 }
7
+ }
8
+
9
+ handleClick ( ) {
10
+ this . setState ( { num : Math . random ( ) } )
11
+ }
12
+
13
+ render ( ) {
14
+ return (
15
+ < div >
16
+ < button onClick = { this . handleClick . bind ( this ) } > Random</ button > { this . state . num }
17
+ </ div >
18
+ )
19
+ }
20
+ }
21
+
22
+ export default RandomNumber
Original file line number Diff line number Diff line change
1
+ import React from 'react'
2
+ import { render } from 'react-dom'
3
+ import App from './App'
4
+
5
+ render ( < App { ...window . __APP_INITIAL_STATE__220877 } /> , document . getElementById ( 'root' ) )
6
+ //app versi klien menggunakan initial state yang dikirim oleh server
You can’t perform that action at this time.
0 commit comments