Membuat Sebuah Aplikasi Web Kolaboratif dengan PubNub, React.js dan ES6
() translation by (you can also view the original English article)
Dalam tutorial saya sebelumnya, saya tunjukkan bagaimana prototipe Internet of Things devices, dan juga visualisasi data dibuat dari sensor hardware, menggunakan PubNub's Data Stream jaringan. Dalam tutorial ini, aku akan menunjukkan kepada Anda bagaimana menggunakan PubNub untuk membangun aplikasi real-time web kolaboratif menggunakan React.js, yang memungkinkan Anda memanipulasi DOM sangat efisien, dan generasi berikutnya dari JavaScript, ES6.



Live Demo: Kolaboratif perekat
Saya telah menciptakan dua versi dari aplikasi Stickie catatan yang sama: yang saya host di CodePen ini menggunakan versi host CDN react, dan lainnya adalah di GitHub, menggunakan Manajer paket. Dalam tutorial ini, saya menggunakan "lite" versi yang kedua. Saya akan berjalan melalui cara membangun app, menggunakan semua barang: npm, webpack, Babel untuk indeks harga saham, dan ES6!
Prasyarat
Untuk Mengikutinya, Anda perlu:
- pemahaman dasar tentang React
- pengetahuan manajer paket npm untuk men-download, menginstal, dan mengelola dependensi
- bekerja pengetahuan tentang builder modul webpack, untuk bundel JavaScript dan aset lainnya untuk browser (kerjanya mirip mendengus atau menelan)
- Node.js dan npm yang terpasang pada mesin Anda
Tutorial ini tidak mencakup bagaimana untuk memulai dengan bereaksi. Namun, Anda dapat mempelajari lebih dari baik Envato Tuts + tutorial lain.
Apa yang Anda akan lakukan
Anda akan membangun aplikasi web sederhana menggunakan PubNub sekarang. PubNub adalah Data Stream jaringan (DSN) yang menyediakan infrastruktur global yang memungkinkan Anda untuk membangun dan skala real-time aplikasi dan perangkat IoT dengan mudah. Di sini, Anda akan menciptakan shareable "stickie notes". Ini adalah app alur pengguna:
- Pengguna log in.
- Segera setelah pengguna memasukkan nama, app mengambil catatan terakhir 50, jika ada.
- Pengguna mengetik sesuatu di stickie pad, dan menekan tombol kembali untuk mengirimkan.
- Catatan stickie baru muncul bersama dengan catatan lain pada browser Anda, serta setiap browser lain dari semua pengguna yang sedang online.
Sekarang, mari kita mulai!
Instalasi paket
Dalam direktori aplikasi Anda, jalankan npm init
untuk mengatur file package.json Anda, dan kemudian menginstal modul-modul ini.
Instal webpack modul builder, yang mengkompilasi, concatenates, minifies, dan kompres statis aset untuk front-end:
$ npm install webpack --save-dev
Menginstal webpack web server untuk menjalankan server lokal:$ npm install webpack-dev-server --save-dev
Instal React, React DOM dan CSS animation add-ons: $ npm install react react-dom react-addons-css-transition-group --save
Menginstal Babel menggunakan BEJ dan ES6. Kami akan menulis dengan ES6 (ES 2015), yang merupakan generasi JavaScript, dengan bantuan dari Babel, kompiler: $ sudo npm install babel-loader babel-core babel-preset-es2015 babel-preset-react --save
Instal PubNub untuk real-time komunikasi: $ npm install pubnub --save
Mengkonfigurasi App struktur dan Web Server
Buat struktur app Anda mirip dengan ini:
1 |
├── /app |
2 |
│ ├── app.jsx |
3 |
│ ├── stickie.jsx |
4 |
│ ├── stickieList.jsx |
5 |
├── /dist |
6 |
├── /css |
7 |
├── /images |
8 |
├── /node_modules |
9 |
├── index.html |
10 |
├── package.json |
11 |
└── webpack.config.js |
Dan mengkonfigurasi webpack.config.js:
1 |
var webpack = require('webpack'); |
2 |
module.exports = { |
3 |
entry: './app/app.jsx', |
4 |
output: {path: './dist', filename: 'bundle.js'}, |
5 |
watch: true, |
6 |
module: {...} |
7 |
}
|
Lihat file konfigurasi seluruh di repo GitHub ini.
Pada dasarnya, Anda menetapkan catatan file (top-level file) dan tujuan output yang mana semua Anda js (dan .jsx) file akan dibangun ke satu file, setelah Anda menjalankan perintah webpack. Juga, dengan menetapkan watch:true
, Anda memastikan bahwa webpack akan melihat perubahan file Anda dan membangun kembali output file secara otomatis.
Membuat File index.html
Termasuk script bundle.js di file index.html Anda:
1 |
<!DOCTYPE html>
|
2 |
<html>
|
3 |
<head>
|
4 |
<meta charset="utf-8"> |
5 |
<title>Collaborative Stickies</title> |
6 |
<link rel="stylesheet" href="css/style.css" /> |
7 |
</head>
|
8 |
<body>
|
9 |
<section id="container"></section> |
10 |
<script src="dist/bundle.js"></script> |
11 |
</body>
|
12 |
</html>
|
Juga, melihat elemen dengan id="container"
dalam tubuh. Ini adalah dimana Anda React app akan dimasukkan.
Menjalankan Server Dev Webpack
Anda dapat menjalankan dev server dengan perintah, $ ./node_modules/.bin/webpack-dev-server
Atau Anda dapat mengatur it up di package.json Anda dengan menambahkan baris ini:
1 |
"scripts": { |
2 |
"start": "webpack-dev-server" |
3 |
},
|
4 |
Sehingga Anda dapat menjalankan server dengan perintah npm start
sebagai gantinya.
Di browser Anda, pergi ke http://localhost:8080/webpack-dev-server, dan Anda akan melihat aplikasi Anda (halaman HTML kosong sejauh) berjalan ada.
Membuat komponen bereaksi dengan ES6
Membuka file app.jsx baru di bawah direktori app, karena Anda dikonfigurasi untuk masuk di webpack.config.js Anda. Seperti yang Anda lihat dari ekstensi file, kita akan menggunakan ekstensi sintaks JavaScript BEJ.
Pertama, mengimpor modul dan file yang diperlukan untuk app.jsx:
1 |
import React from 'react'; |
2 |
import ReactDOM from 'react-dom'; |
3 |
import StickieList from './stickieList'; |
4 |
import 'pubnub'; |
Pernyataan impor, baru diperkenalkan di ES6, digunakan untuk impor fungsi, objek atau primitif yang telah diekspor dari modul eksternal atau script.
Kemudian menentukan kelas, CollabStickies
, yang meluas kelas React.Component
, menggunakan Deklarasi ini kelas ES6. Ini setara dengan metode React.createClass
dengan ES5:
1 |
class CollabStickies extends React.Component { |
2 |
constructor(props) { |
3 |
super(props); |
4 |
this.state = { |
5 |
stickieList: [] |
6 |
}
|
7 |
}
|
8 |
|
9 |
componentWillMount() { |
10 |
… // will explain later |
11 |
}
|
12 |
...
|
13 |
render() { |
14 |
return ( |
15 |
<div> |
16 |
<StickieWritable username={this.props.username} color={this.props.color} /> |
17 |
<StickieList stickieList={this.state.stickieList} /> |
18 |
</div> |
19 |
);
|
20 |
}
|
21 |
}
|
Dalam fungsi Konstruktor, Anda menetapkan keadaan awal dari data ini bisa berubah, stickieList
array. Kami akan memperbarui array setiap kali kita mendapatkan catatan stickie baru, menggunakan this.setState()
.
Dalam fungsi render, menggunakan BEJ untuk mendefinisikan elemen DOM HTML virtual DOM elements. Dalam kasus ini, komponen kustom StickieWritable
dan StickieList
disertakan. Anda dapat melewati dengan props bisa berubah dan Serikat ke komponen untuk menggunakan. Kita akan menentukan nasib mereka nanti.
Ketika Anda membangun aplikasi, Babel akan transpile semua sintaks ini ES6 dan BEJ ke ES5 yang browser dapat membuat saja.
Render DOM Node dengan Data yang mengikat
Dengan ReactDOM.render()
, yang datang dengan paket react-dom
, membuat komponen CollabStickies
di DOM node dalam HTML.
1 |
ReactDOM.render( |
2 |
<CollabStickies username={username} color={color} />, |
3 |
document.getElementById('container') |
4 |
);
|
sini, Anda melihat username dan color props
. Data ini digunakan untuk CollabStickies
komponen dan dilewatkan ke komponennya anak.
Nilai-nilai harus diperoleh dari login pengguna; Namun, untuk memudahkan app untuk latihan ini, mari kita hanya menggunakan window.prompt()
sederhana untuk mendapatkan nama pengguna, dan kemudian memberikan warna acak catatan stickie ketika aplikasi di-load.
1 |
var username = window.prompt('Your name'); |
2 |
|
3 |
const colors = ['yellow', 'pink', 'green', 'blue', 'purple']; |
4 |
var color = colors[~~(Math.random() * colors.length)]; |



Walaupun saya menggunakan dialog prompt browser-asli di sini, pada kenyataannya, saya sarankan Anda membuat komponen UI yang lain dengan fungsi login, atau menggunakan komponen kotak dialog pihak ketiga. Ada banyak komponen dapat digunakan kembali yang Anda dapat menemukan, seperti Modal elemen UI, dan Dialog bahan UI.
Menggunakan PubNub untuk Collaboration
Sekarang, Anda akan menggunakan PubNub untuk membuat aplikasi kolaboratif.
PubNub adalah jaringan aliran data yang didistribusikan secara global yang memungkinkan Anda untuk membangun aplikasi real-time mudah. Fitur inti, pub/sub, mengirim dan menerima data antara beberapa pengguna secara bersamaan.
App ini, siapa pun yang "masuk" dapat memposting pesan pada stickie catatan dan berbagi mereka dengan pengguna lain.



Untuk menggunakan PubNub dalam aplikasi Anda, pastikan bahwa pubnub modul telah terinstal dan diimpor di atas dari file Anda.
Initializing PubNub
Pertama, Anda perlu untuk menginisialisasi untuk menciptakan instance objek Pubnub. Anda perlu API Anda kunci selama Instansiasi, jadi harap mendaftar untuk PubNub untuk mendapatkan kunci Anda sendiri.
1 |
const publish_key = 'pub-c-1d17120...'; // your pub key |
2 |
const subscribe_key = 'sub-c-85bdc...'; // your sub key |
3 |
|
4 |
const pubnub = require('pubnub').init({ |
5 |
publish_key : publish_key, |
6 |
subscribe_key : subscribe_key, |
7 |
ssl: true, |
8 |
uuid: username |
9 |
});
|
10 |
|
11 |
const channel = 'stickie-notes'; |
Di sini, Anda menentukan pengguna yang Diperoleh dari proses "login" sebagai uuid
, pengenal unik. (Dalam latihan ini, kita mengambil setiap string yang dimasukkan oleh pengguna sebagai uuid, tetapi dalam kenyataannya, Anda memerlukan sistem login nyata sehingga uuid setiap benar-benar unik, dengan tidak ada duplikasi!)
Perhatikan juga, saya menggunakan Deklarasi const
ES6, bukan var
untuk nilai-nilai konstan ini global. Dalam ES6 const
bertindak sebagai variabel hanya-baca dan mewakili konstan referensi ke nilai. Dalam contoh kemudian, Anda juga akan melihat yang baru diperkenalkan let
, yang merupakan blok lingkup variabel lokal.
Berlangganan ke pesan
Untuk membuat catatan sharable app, Anda akan menggunakan PubNub's publish()
metode untuk mengirim catatan Anda ke semua orang, sementara subscribe()
memungkinkan pengguna lain menerima semua catatan. Metode subscribe()
disebut secara otomatis setiap kali seseorang menerbitkan catatan baru.
Di app bereaksi, mari kita sebut subscribe()
dalam componentWillMount()
, yang dipanggil segera sebelum render awal terjadi pada siklus hidup app.
1 |
componentWillMount() { |
2 |
pubnub.subscribe({ |
3 |
channel: channel, |
4 |
restore: true, |
5 |
connect: () => this.connect(), |
6 |
message: (m) => this.success(m) |
7 |
});
|
8 |
}
|
Berlangganan metode asynchronous, dan ketika setiap operasi berhasil selesai, callback message
dipanggil. Di callback, mari kita memperbarui daftar catatan stickie dengan menetapkan keadaan array stickieList
, yang didefinisikan dalam konstruktor pada awal.
Di bereaksi, memodifikasi data Anda dengan setState
otomatis update tampilan.
1 |
success(m) { |
2 |
let newList = [m].concat(this.state.stickieList); |
3 |
this.setState({stickieList: newList}); |
4 |
}
|
Kami menciptakan tampilan (komponen UI) kemudian.
Di callback berlangganan, Anda mungkin telah memperhatikan sintaks yang tampak lucu dengan Panah, =>
. Ini disebut fungsi Panah, yang memiliki sintaks yang lebih pendek daripada ekspresi fungsi ES5. Selain itu, ungkapan ini secara leksikal mengikat nilai this
. Sekali lagi, dengan Babel, kita dapat memanfaatkan semua keangkeran ES6!
Juga, kami menggunakan opsional connect
panggilan balik berlangganan metode untuk mengambil "sejarah". Ini akan mengambil masa lalu data ketika koneksi ke PubNub didirikan untuk pertama kalinya.
1 |
connect() { |
2 |
pubnub.history({ |
3 |
channel: channel, |
4 |
count: 50, |
5 |
callback: (m) => { |
6 |
m[0].reverse(); |
7 |
for (var v of m[0]) { |
8 |
let newList = this.state.stickieList.concat(v); |
9 |
this.setState({stickieList: newList}); |
10 |
}
|
11 |
}
|
12 |
});
|
13 |
}
|
History()
adalah bagian dari PubNub's fitur Penyimpanan dan Pemutaran, dan dalam kasus ini, itu mengambil pesan terakhir 50 dari PubNub. Di callback success
, update tampilan dengan menetapkan keadaan stickieList
array di sini juga.
Penerbitan pesan
Mari kita membuat kelas, StickieWritable
. Ini adalah catatan stickie komponen yang mengambil input pengguna.
Menjadikan seperti ini:
1 |
render() { |
2 |
return ( |
3 |
<div className={'stickie-note writable ' + this.props.color}> |
4 |
<textarea type='text' placeholder='Your new note...' onKeyUp={this.handleTextChange.bind(this)} /> |
5 |
</div> |
6 |
);
|
7 |
}
|
Dalam textarea
, perhatikan acara onKeyUp
, dan setiap kali peristiwa dipicu, memanggil fungsi handleTextChange
untuk memeriksa jika kuncinya adalah kembali/masukkan kunci. Perhatikan bahwa saya sedang mengikat ini saat memanggil fungsi. Tidak seperti React.createClass()
, yang merupakan bereaksi 's ES5 metode untuk menciptakan kelas, kelas ES6 tidak tidak autobind metode untuk contoh objek, sehingga Anda perlu untuk mengikat itu sendiri. (Ada beberapa cara yang berbeda untuk mencapai hal yang sama.)
Dalam fungsi handleTextChange
, mempublikasikan data teks dan pengguna untuk PubNub:
1 |
var data = { |
2 |
username: this.props.username, |
3 |
color: this.props.color, |
4 |
text: e.target.value, |
5 |
timestamp: Date.now() |
6 |
};
|
7 |
|
8 |
pubnub.publish({ |
9 |
channel: channel, |
10 |
message: data, |
11 |
callback: e.target.value = '' // resetting the text field |
12 |
});
|
Sekarang, ketika pengguna jenis beberapa teks di notepad dan menekan kembali, pesan akan dikirim ke PubNub, dan semua pengguna menerima pesan secara bersamaan (dalam ¼ sec!).
Membuat komponen UI
App UI terdiri dari beberapa komponen UI, yang terlihat seperti ini:



1. CollabStickies
2. StickieWritable
3. Stickie
4. StickieList
Komponen 1 dan 2 memiliki telah telah diambil dari perawatan, jadi mari kita membuat komponen 3, komponen catatan stickie individu.
Buat file stickie.jsx baru untuk membuat UI menggunakan BEJ. Tidak seperti komponen StickieWritable
, ini adalah komponen UI hanya-baca dengan fungsi UX tidak. Hanya memiliki fungsi render()
menggambar stickie catatan dengan teks menggunakan prop data.
Pada dasarnya, setiap kali pengguna menerima pesan baru dari pengguna lain, pesan dituliskan dalam komponen stickie baru.
1 |
import React from 'react'; |
2 |
import ReactDOM from 'react-dom'; |
3 |
|
4 |
export default class Stickie extends React.Component { |
5 |
render() { |
6 |
return ( |
7 |
<div className={'stickie-note ' + this.props.color} > |
8 |
<p className='note'>{this.props.text}</p> |
9 |
<p className='username'>{this.props.username}</p> |
10 |
</div> |
11 |
);
|
12 |
}
|
13 |
}
|
Selanjutnya, kita akan membuat komponen UI yang lain, stickieList.jsx, yang merupakan wadah untuk komponen ini dan berisi banyak catatan stickie bersama-sama.
Menghidupkan komponen
Mengimpor Stickie.jsx dan semua dependensi lain StickieList.jsx. Di sini, saya menggunakan sebuah addon ReactCSSTransitionGroup
dan font web kustom.
1 |
import React from 'react'; |
2 |
import ReactDOM from 'react-dom'; |
3 |
import ReactCSSTransitionGroup from 'react/lib/ReactCSSTransitionGroup'; |
4 |
import Stickie from './stickie'; |
5 |
import webfontloader from 'webfontloader' |
Anda dapat menginstal Web font loader dengan npm:$ npm install webfontloader
Kemudian Anda dapat memuat setiap font kustom pilihan Anda. Anda bisa melihat kode sumber untuk melihat bagaimana font Google kustom yang diimpor.
Di render()
, menggunakan ES6 fungsi panah dan map()
untuk array, dan menggunakan stickieList
untuk membuat setiap komponen Stickie yang baru saja dibuat:
1 |
export default class StickieList extends React.Component { |
2 |
render() { |
3 |
let items = (this.props.stickieList || []).map((item) => |
4 |
<li key={item.username + '-' + item.timestamp} > |
5 |
<div className="stickieWrapper"> |
6 |
<Stickie text={item.text} color={item.color} username={item.username}/> |
7 |
</div> |
8 |
</li>); |
9 |
|
10 |
return ( |
11 |
<ReactCSSTransitionGroup transitionName='animation' transitionEnterTimeout={500} transitionLeaveTimeout={500} component='ul' id="stickiesList"> |
12 |
{items} |
13 |
</ReactCSSTransitionGroup> |
14 |
)
|
15 |
}
|
16 |
}
|
Komponen didefinisikan dapat animasi menggunakan <ReactCSSTransitionGroup>
. Menetapkan transitionName
, yang Anda butuhkan untuk menggunakan CSS Anda untuk menentukan gaya animasi. Juga, perhatikan atribut utama di <li>
. Anda perlu menggunakan kunci yang unik untuk setiap daftar untuk menghidupkan setiap komponen bila Anda menggunakan <ReactCSSTransitionGroup>
.
Bereaksi menambahkan nama kelas tambahan. Sebagai contoh, ketika Anda transitionName
'animation
', Anda juga akan memiliki 'animation-enter
', 'animation-enter-aktif
', 'animation-leave
', dan 'animation-leave-aktif
'.
Berikut adalah kode di /css/style.css:
1 |
.animation-enter { |
2 |
opacity: 0.1; |
3 |
transform: scale(1.3); |
4 |
transition: all 1s ease-out; |
5 |
}
|
6 |
.animation-enter.animation-enter-active { |
7 |
opacity: 1; |
8 |
transform: scale(1); |
9 |
}
|
10 |
...
|
Sekarang, Anda telah membangun sebuah aplikasi kolaborasi real-time dengan bereaksi dan PubNub! Saya harap Anda menikmati tutorial!



Anda dapat melihat seluruh kode, termasuk CSS, di repo GitHub ini. Meskipun, dalam tutorial ini, saya menggunakan versi "lite", app-lite.jsx, Anda dapat mengambil lihat app.jsx untuk lebih banyak fitur.
Jika Anda tertarik dalam membangun aplikasi real-time yang lain, seperti aplikasi chatting, multiplayer game, perdagangan apps, dll, pergi ke PubNub dan menemukan lebih banyak sumber daya!
Ingin React lebih?
Kami punya kursus diarahkan secara khusus mengambil keterampilan bereaksi sejauh mungkin. Dalam kursus ini, Anda akan mendapatkan Anda mulai membangun aplikasi modern web bereaksi dengan Redux. Mulai dari apa-apa, Anda akan menggunakan dua pustaka untuk membangun aplikasi web lengkap.
Anda akan mulai dengan arsitektur mungkin yang paling sederhana dan perlahan-lahan membangun aplikasi, fitur oleh fitur. Anda akan belajar tentang konsep dasar seperti tooling, reducer, dan routing. Anda juga akan belajar tentang beberapa teknik yang lebih maju seperti komponen yang pintar dan bodoh, komponen murni dan tindakan asinkron. Pada akhir, Anda akan telah menciptakan sebuah aplikasi lengkap flashcards untuk belajar oleh pengulangan spasi.
Tertarik? Periksa!
Referensi
- PubNub: global real-time Data Stream jaringan untuk IoT, ponsel, dan aplikasi web
- PubNub JavaScript SDK Tutorial
- React: perpustakaan JavaScript untuk menciptakan user interface
- ES6: ECMAScript spesifikasi bahasa 2015
- webpack: modul Builder