Container & Docker

Một phần của tài liệu Xây dựng hệ thống nghe và chia sẻ nhạc online (Trang 29 - 57)

c0"Oƒ{"ej栄 v壱v"n#"x "Xktvwcn"Ocejkpg

O»"j·pj"oƒ{"ej栄 pi {"z逢c"vj逢運pi"n <

Oƒ{"ej栄 v壱v"n#"*rj{ukecn"ugtxgt+"-"j羽8k隠w"j pj*qrgtcvkpi"u{uvgơ"-"泳ng d映ng

(application). [4][5]

H·nh 3.2 O»"j·pj"oƒ{"ej栄 v壱v"n#"pi {"z逢c H·nh 1.1 Docker

29 E„"3"u嘘 v医p"8隠 v噂k"o»"j·pj"p {."8„"n "3"oƒ{"ej栄 ch雨e k"8逢嬰c 1 h羽8隠w"j pj" *QƯ0"Fq"8„"mj»pi"vj吋 mjck"vjƒe"j院v"8逢嬰c l嬰i th院 c栄c"oƒ{"ej栄fq"f́"e„"tco"mj栄ng hay ssd kh栄pi"pj逢"vj院p q"8k"p英ạ V医p"8隠p {"u胤i¤{"tc"x»"épi"n«pi"rj "v k"piw{‒p" mjk"o "rh亥n c泳pi"oƒ{"v pj"rjƒv"vtk吋n v噂i t嘘e"8瓜ej„pi"o員t.

Ucw"p {"vj·"e„"3"mjƒk"pk羽m m噂k"8逢嬰e"tc"8運k0"A„"n "Xktvwcnk¦cvkqp<

E»pi"pij羽 xktvwcnk¦cvkqp"p {"ejq"rjfir"ej¿pi"vc"e„"vj吋e k"8員v"8逢嬰c nhi隠u OS vt‒p"épi"3"oƒ{"ej栄. A逢嬰e"z¤{"f詠ng d詠c"vt‒p"#"v逢荏pi"rj¤p"ejkc"鰻 c泳ng, ram. T瑛 8„"vt‒p"o瓜v"oƒ{"ej栄 e„"vj吋 t衣q"tc"8逢嬰c nhi隠w"oƒ{"違q"mjƒẹ"pj英pi"oƒ{"違q"p {"ej衣y 8瓜c l壱p v噂i nhaụ

Vw{"pjk‒p"e»pi"pij羽 p {"x磯p"e”p"e„"3"x k"x医p"8隠:

‚ Khi t衣q"tc"3"oƒ{"違q."vj·"oƒ{"ej栄nw»p"nw»p"rj違i chia v k"piw{‒p"ejq"p„" (ram, 鰻 c泳ng) th壱m ch雨 c育n b壱v"oƒ{"違q"n‒p"vj»k"ej泳ej逢c"ej衣{"vƒe"x映i·" h院v0"N o"n«pi"rj "v k"piw{‒p"8«"ejkc"ejq"oƒ{"違o

‚ Oƒ{"ej栄 s胤 ph違i ch鵜u t違k"ejq"eƒe"oƒ{"違o trong h羽 th嘘pị"mj»pi"vj吋 ho衣v"8瓜ng h院v"e»pi"uw医v."mj„"sw違p"n#0

‚ X·"pj英pi"mj„"mj<p."x医p"8隠 pj逢"x壱{"ejq"p‒p"mjƒk"pk羽o"eqpvckpgt"8逢嬰c tc"8運i

b. Container

30 Eƒe"ej逢挨pi"vt·pj."泳ng d映ng s胤8逢嬰e"8„pi"i„k"vj pj"eƒk"eqpvckpgt0"Eƒe" eqpvckpgt"p {"u胤 t衣q"tc"3"o»k"vt逢運ng bao g欝m nh英ng th泳o "rj亥n m隠m c亥p"8吋 ch衣ỵ V "ej衣{"jq p"vq p"8瓜c l壱p v噂i h羽 th嘘ng, h羽 th嘘pi"mj»pi"e亥n ph違k"e k"8員v"swƒ" nhi隠u th泳o "rj亥n m隠m c亥p"8吋 ch衣{0"X "eƒe"eqpvckpgt"p {"8隠u s穎 d映ng chung kernel c栄a host OS.

姶w"8k吋m: Nhanh, nh姻x "8„pi"i„k

Pj逢嬰e"8k吋o<"Fq"f́pi"ejwpi"mgtpgn"e栄c"oƒ{"ej栄 p‒p"p院u ketpcn"e„"n厩 h鰻ng b違o m壱v"vj·"eƒe"eqpvckpgt"vtqpi"p„"e pi"u胤 b鵜違pj"j逢荏ng theọ

c. Docker

Fqemgt"n "p隠n t違pi"o«"piw欝n m荏8逢嬰c s穎 d映pi"8吋 ch衣{"eƒe"泳ng d映pi"x " n o"ejq"swƒ"vt·pj"rj¤p"rj嘘k."8„pi"i„k."rjƒv"vtk吋p"8逢嬰c d宇f pi"j挨p0"Eƒe"泳ng d映ng 8逢嬰e"v ej"j嬰p trong fqemgt"8逢嬰e"8„pi"i„k"x噂i t医t c違eƒe"j厩 tr嬰 ph映 thu瓜c c栄c"p„"*X " d映pj逢<"O{USN."PIKPZ."Wdwpvw."Pqfg."000"+"x q"vtqpi"eqpvckpgt0"Pj英ng container p {"ej衣{"vtqpi"pj¤p"e違u h羽8隠w"j pj"]6̲0"Jc{"p„k"eƒej"mjƒe"Fqemgt"n "o瓜t n隠n t違ng 8吋 cung c医r"eƒej"8吋dwknfkpị"fgrnq{"x "twp"eƒe"泳ng d映ng m瓜v"eƒej"f宇f pi"vt‒p" n隠n t違ng 違q"j„c"- "Build once, run anywhere".

永ng d映pi"8逢嬰e"Fqemgt"j„c"ej衣{"vtqpi"eqpvckpgt"e„"vj吋8逢嬰c s穎 d映ng trong b医t c泳 n隠n t違ng, h羽 th嘘pi"p q"*X "f映pj逢<"Ncrvqr"e栄a developer, h羽 th嘘pi"vt‒p"e挨" s荏 hay trong h羽 th嘘pi"8ƒo"o¤{"*enqwf"eqorwvkpi++0"P„"e”p"n "3"e»pi"e映 t衣q"tc"3"o»k" vt逢運pi"8逢嬰e"8„pi"i„k"*E”p"i丑k"n "eqpvckpgt+"vt‒p"oƒ{"v pj"o "mj»pi"n o"違pj"j逢荏ng jc{"vƒe"8瓜pi"8院p"o»k"vt逢運ng hi羽n t衣i c栄c"oƒ{"ej栄."o»k"vt逢運ng trong Docker s胤 ch衣y 8瓜c l壱p.

Fqemgt"e„"vj吋 n o"xk羽c tre6n h亥u h院v"eƒe"p隠n t違ng h羽8隠w"j pj"rj鰻 bi院n nh医t hi羽p"pc{"pj逢"Nkpwz."Ykpfqyu"jc{"OceQU0

31 Eƒe"8員e"8k吋o"x "vk羽p"v ej"mjk"u穎 d映ng Docker:

‚ D宇 s穎 d映ng: T医t c違 m丑k"pi逢運k"8隠w"e„"vj吋 s穎 d映ng docker t瑛 developer, admin system, ... S穎 d映ni"eqpvckpgt"8吋 build, test, deploy ph亥n m隠m d宇f pi0

‚ Pjcpj"ej„pi<"Fqemgt"t医t nh姻x "pjcpj."e„"vj吋 t衣q"x "dwknf"fqemgt" pjcpj"ej„pi0

‚ A欝ng b瓜: Linh ho衣t chuy吋p"8鰻i t瑛pi逢運k"p {"ucpi"pi逢運k"mjƒẹ"oƒ{"p {" swc"oƒ{"mjƒe"o "mj»pi"e亥p"swcp"v¤o"v噂k"o»k"vt逢運ng c栄c"oƒ{ ch栄荏 8„."mj»pi"n o"vjc{"8鰻k"eƒe"eqphki"d‒p"vtqpi"eqpvckpgt0

3.1.2. Ki院p"vt¿e

èr"f映pi"eƒe"mk院p"vt¿e"x "eƒe"rcvvgtp"x q"vtqpi"mj„c"nw壱n.

a) O»"j·pj"5"n噂p [7]

O»"j·pj"5"n噂p (3-layers) g欝o"e„"5"rj亥p"ej pj<

‚ Presentation Layer (GUI): L噂r"p {"8逢嬰e"eqk"pj逢"n "v亥ng UI c栄a 泳ng d映pị"8違m nhi羽m tr丑pi"vtƒej"ikcq"vk院p v噂k"pi逢運i d́pi0"Dcq"i欝m eƒe"UI component c医w"vj pj"p‒p"vtcpi"ygd"jc{"泳ng d映ng. A欝ng th運k"e”p"ej泳c"eƒe"eqorqpgpv"f́pi"8吋 hi吋n th鵜tc"fcvc"*X "f映: List, Menu, Card, Avatar,È+"x "eƒe"component f́pi"8吋 nh壱p"fcvc"x q" *X "f映: Input, Button, Select, È+"x "f́pi"8吋8育{"fcvc"p {"zw嘘pi"eƒe" l噂r"d‒p"f逢噂ị L噂r"p {"vtqpi"uqwteg"eqfg"n "n噂p resolver.

‚ Business Logic Layer (BLL): L噂r"p {"e„"4"pjk羽m v映ej pj< J·pj"507"O»"j·pj"5"n噂p [8]

32 1. Nh壱p"8逢嬰c data 8逢嬰c g穎k"8k"v瑛 l噂p Presentation, x穎n#"eƒe"fcvc"p {"

3"eƒej"nqikẹ"ucw"8„"i穎i t噂i l噂r"Fcvc"Ceeguu"Nc{gt"8吋 l噂r"p {"z穎n#" x "vjcq"vƒe"x噂i databasẹ

2. L医y data t瑛 l噂r"Fcvc"Ceeguu"Nc{gt"vj»pi"swc"eƒe"hwpevkqp"8逢嬰c build trong l噂r"8„"x "z穎n#"nqike"t欝i cu嘘k"épi tr違 k院t qu違 v隠 cho l噂p Presentation.

ö L噂r"p {"vtqpi"uqwteg"eqfg"n "n噂p servicẹ

‚ Data Access Layer (DAL): L噂r"p {"n "n噂r"vjcq"vƒe"ej pj"x噂i database, bao g欝o"eƒe"vjcq"vƒe"EWTF"e挨"d違n. L噂r"p {"vtqpi" uqwteg"eqfg"n "n噂p repositorỵ

?@"Vw{"pjk‒p"fq"mj»pi"e„"8栄 th運i ikcp"p‒p"jk羽n t衣k"vtqpi"uqwteg"eqfg"mj»pi" e„"n噂r"tgrqukvqt{0"Eƒe"vjcq"vƒe"x噂k"EUFN"8逢嬰c hi羽n th詠c ngay trong l噂p BLL (service).

姶w"8k吋m c栄c"o»"j·pj"5"n噂p:

‚ Ejkc"eqfg"tc"vj pj"eƒe"n噂r"mjƒe"pjcw"x噂k"eƒe"pjk羽m v映mjƒe"pjcw"ejq" t瑛ng l噂r"ik¿r"ejq"eqfg"8逢嬰c engcp"j挨p."f宇 s穎a, d宇ockpvckp"e pi"pj逢" debug.

‚ A嘘i v噂i nh英ng d詠ƒp"n噂p"vj·"xk羽c chia nh臼 d詠ƒp"tc"vj pj"eƒe"n噂r"pj逢" v壱{"ik¿r"ejq"xk羽e"n o"xk羽e"pj„o"*vgcoyqtm+"ik英c"eƒe"vj pj"xk‒p"vt荏 p‒p"f宇 f pi"j挨p0

‚ Vƒk"u穎 d映ng l衣k"eƒe"n噂p. M厩k"mjk"e„"u詠 vjc{"8鰻k"8員e"8k吋m c栄a d詠ƒp"vj·" e pi"t医v"pjcpj"8吋 vjc{"8鰻i ch泳 kh丑ng c亥n ph違k"8壱r"8k"z壱y l衣ị X "f映: 1. X "f映 1: D詠ƒp"8cpi"u穎 d映ng giao th泳c gi英c"enkgpv"x "ugtxgt"n "Itcrjsn"vj·"

l噂p GUI s胤n "tguqnxgt."vw{"pjk‒p"p院u mu嘘p"8鰻i l衣i d詠ƒp"ucpi"giao th泳c TguvCRK"vj·"ej雨 vi羽c s穎a l衣i l噂r"IWK"p {"vj pj"eqpvtqnngt"o "mj»pi"違nh j逢荏ng t噂k"eƒe"n噂r"d‒p"f逢噂i

2. X "f映 2: D詠ƒp"u穎 d映pi"EUFN"n "oqpiqFD"o "ow嘘p"8鰻i sang s穎 d映ng O{USN"vj·"ej雨 vi羽e"vjc{"8鰻i l衣i c医w"vt¿e"荏 t亥pi"FCN"*tgrqukvqt{+"8吋ejq"rj́" h嬰p v噂i databasẹ

33

b) PubSub pattern

J·pj"違pj"d‒p"vt‒p"o»"v違 v隠 lu欝pi"8k"e pi"pj逢"z穎n#"e栄a pubsub pattern. J·pj"508"O»"j·pj"PubSub [9]

34 J·pj"違pj"d‒p"vt‒p"o»"v違 s詠mjƒe"pjcw"ik英c"4"rcvvgtp"n "qdugtxcdng"rcvvgtp"x " pubsub pattern.

Publisher/Subscriber pattern, ho員e"e„"v‒p"i丑i ng逸p"j挨p"$RwdUwd$"n "o瓜t rcvvgtp"ik¿r"ej¿pi"vc"v衣o nh英pi"oqfwng"o "e„"vj吋 giao ti院p v噂i nh英pi"oqfwng"mjƒe" piq k"pj逢pi"mj»pi"e亥p"ej¿pi"rj違i ph映 thu瓜c l磯p"pjcw0"P„"n "o瓜t pattern tuy羽t v運i 8吋 ejkc"vƒej"eƒe"vj pj"rj亥n c栄a 泳ng d映ni"*fgeqwrnkpi"crrnkecvkqp+"x "p„"mjƒ"rj鰻 bi院n trong JavaScript.

E挨"ej院 c栄a pubsub :

‚ Pub Î publish: producer s胤8育{"fcvc"x q"3"ejcpgn.

‚ Sub Îuwduetkdg<"eqpuwogt"8<pi"m "pj壱n 1 d英 li羽u t瑛 chanel.

Eƒk"p {"ik嘘pi"pj逢 xem Youtubẹ Ej¿pi"vc subscribe m瓜t channel. Khi m瓜t rtqfwegt"n o"o瓜v"xkfgq"8育{"n‒p"[qwvwdg0"Ej¿pi"vc s胤 nh壱n d英 li羽u, t泳c xem video 8„"v衣k"ejcppgn"o "d衣p"8«"uwduetkdg0"Mjk"d衣p"dfl"e栄a ej¿pi"vce pi"uwduetkdg" ejcppgn"8„."vj·"mjk"rtqfwegt"8育{"xkfgq"n‒p."ej¿pi"vc x "d衣p"dfl"e栄a b衣p"épi"pj壱n 8逢嬰e"xkfgq"8吋 zgo0"X "v医v"pjk‒p."ej¿pi"vce„"vj吋8<pi"m#"pjk隠u channel.

Ph亥p"p {"vtqpi"mj„c"nw壱p"vj·"8逢嬰c th詠c hi羽n v噂k"4"v pj"p<pi"ej pj ‚ A育{"vj»pi"dƒq"v噂k"pi逢運k"f́pi0 (Push notification).

‚ Vt”"ejw{羽n (Chat).

Ph亥p"8育{"vj»pi"dƒq"v噂k"pi逢運k"f́pi"*rwuj"pqvkhkecvkqp+"vw{"pjk‒p"rwuj"p {" mj»pi"rj違k"n "rwuj"oqdkng"jc{"dtqyugt0"P院u th詠c hi羽p"v pj"p<pi"rwuj"oqdkng"jc{" dtqyugt"vj·"u胤 e„"vj吋 s穎 d映pi"eƒe"d‒p"vj泳5"mjƒe"8吋 h厩 tr嬰pj逢"Hktgdcug"jc{" OneSignal. E”p"荏8¤{"ej雨n "rwuj"vt詠c ti院p trong 泳ng d映pi"*8育y data t瑛 server t噂i enkgpv+"mjk"e„"vtkiigt0

Ph亥p"v pj"p<pi"vt”"ejw{羽p"*ejcv+"8«"8逢嬰c d詠v pj"n o"d茨ng socket.io t瑛8亥ụ Vw{"pjk‒p"fq"rj亥n l噂n d詠ƒp"8cpi"u英 d映pi"itcrjsn"x "crqnnq"enkgpv"p‒p"8«"ejw{吋n sang s穎 d映pi"itcrjsn"uwduetkrvkqp"nw»p"ejq"vk羽n.

Apollo client subscription <"Piq k"4"qrgtcvkqp"rj鰻 bi院n nh医t c栄c"itcrjsn"n " swgt{"x "owvcvkqp"vj·"crqnnq"enkgpv"e”p"ewpi"e医r"ejq"ej¿pi"vc"o瓜t operation h厩 tr嬰 cho vi羽c x穎n#"fcvc"tgcn-vkog"d‒p"rj c"enkgpv0 P„"ik嘘ng query 荏 ch厩n "e„"vj吋 fetch data t瑛rj c"ugtxgt."mjƒe"荏 ch厩n "p„"e”p"e„"vj吋vjc{"8鰻i data real-time theo s詠 thay 8鰻k"d‒p"rj c"ugtxgt0"X·"x壱{"p„"n "3"qrgtcvkqp"j英u d映ng trong vi羽e"vj»pi"dƒq"pj英ng vjc{"8鰻k"d‒p"rj c"ugtxgt"8院p"ejq"enkgpv"8吋 ejq"enkgpv"e„"vj吋 n逸o"8逢嬰e"x "z穎n#"nqike" nh英pi"vjc{"8鰻k"8„"ejq"rj́ h嬰p.

Fq"8„"vtqpi"nw壱p"x<p"p {."rj亥n l噂p"eƒe"rtqfwegt"u胤n "eƒe"hwpevkqp"d‒p"rj c" ugtxgt0"Eƒe"hwpevkqp"p {"u胤 rwdnkuj"eƒe"ejcpgn"8吋d‒p"rj c"enkgpv."n¿e"p {"n "eƒe" eqpuwogt"uwduetkdg"x "pj壱p"8逢嬰e"fcvc"v逢挨pi"泳pi0"Piq k"tc"vj·"e”p"u胤 e„"rwduwd"

35 gi英c"eƒe"ugtxkce trong server v噂k"pjcw0"Vw{"pjk‒p"vtqpi"ik噂i h衣p"mj„c"nw壱p"p {"vj·" hgcvwtg"p {"u胤 ej逢c"8逢嬰e"ƒr"f映ng.

c) Ki院p"vt¿e"CRK client-server

Ki院p"vt¿e"CRK"n "3"mk院p"vt¿e"mjƒ"rj鰻 bi院n trong th運i gian g亥p"8¤{0"Mjk"o "o»" j·pj"OXE"v臼 tc"e„"pjk隠w"pj逢嬰e"8k吋o0"Vj·"mk院n vt¿e"CRK"vt荏p‒p"vj鵜pj"j pj"vtqpi"j亥u h院v"eƒe"泳ng d映pi"ygd1crr0"Vw{"pjk‒p"vj·"o»"j·pj"OXE"x磯p"mj»pi"rj違k"n "mj»pi"e”p" 8逢嬰c s穎 d映ng n英c0"O "v́{"x q"8員e"8k吋ọ"8瓜 l噂p"e pi"pj逢"vtqpi"3"x k"jq p"e違nh p q"8„"o "pi逢運i ta quy院v"8鵜nh s胤 s穎 d映pi"o»"j·pj"OXE"jc{"mk院n vt¿e"CRK0

Ki院p"vt¿e"CRK"ejkc"vƒej"泳ng d映pi"tc"vj pj"4"rj亥p"n "dcem-gpf"x "htqpv-gpf"x " gi英a 2 ph亥p"p {"ikcq"vjk院p v噂k"pjcw"vj»pi"swc"CRK0"E„"pjk隠u ki吋u giao th泳e"8吋 k院t n嘘i 2 ph亥p"p {."rj嘘 bi院n nh医t v磯p"n "TGUVhwn"CRK"x "Itcrjsn"CRK0"Vtqpi"mjw»p"mj鰻 mj„c"lu壱p"p {"vj·"go"u胤 s穎 d映pi"Itcrjsn"CRK"8吋 hi羽n th詠c ph亥n k院t n嘘k"p {0"X "x医n 8隠 v隠 graphql s胤8逢嬰e"vt·pj"d {"t "j挨p"荏 ph亥p"d‒p"f逢噂ị

姶w"8k吋m c栄a ki院p"vt¿e"u穎 d映ng API so v噂k"o»"j·pj"OXE"vjw亥p"n "3"rj亥n dcemgpf"e„"vj吋 8逢嬰c s穎 d映ng 荏 nhi隠w"p挨k"mjƒe"pjcw0"T瑛 ygd"8院n app mobile cho 8院r"fgumvqr"crr0"Vtqpi"mjk"8„"荏 o»"j·pj"OXE"vj·"rj違i rang bu瓜c l噂p View (V) v噂i 2 l噂r"e”p"n衣k"p‒p"OXE"ej雨 e„"vj吋f́pi"vtqpi"3"rtqlgev0

d) Ki院p"vt¿e"Hnwz

Flux [11] n "o瓜t ki院p"vt¿e"o "Hcegdqqm"u穎 d映pi"vtqpi"mjk"n o"xk羽c v噂i React. Flux kj»pi"rj違k"n "o瓜t framework hay m瓜v"vj逢"xk羽p"*nkdtct{+0"P„"8挨p"ik違n ch雨n "o瓜t ki吋u ki院p"vt¿e"o噂i h厩 tr嬰vj‒o"ejq"Tgcev."8欝ng th運k"z¤{"f詠pi"#"v逢荏ng v隠 lu欝ng d英 li羽u m瓜t chi隠u (Unidirectional Data Flow).

M瓜t ki院p"vt¿e"Hnwz"8k吋p"j·pj"n "u詠 k院t h嬰p gi英c"vj逢"xk羽p"Fkurcvejgt"*8逢嬰c vi院t b荏k"Hcegdqqm+"épi"x噂k"Oqfwng"PqfgLU"GxgpvGokvvgt"8吋 t衣q"p‒p"o瓜t h羽 th嘘ng s詠 ki羽n (Event System) qu違p"n#"eƒe"vt衣pi"vjƒk"e栄a 泳ng d映ng.

5040"E»pi"pij羽 hi羽n th詠c

O»"v違 eƒe"e»pi"pij羽."htcoyqtm"8逢嬰c s穎 d映pi"vtqpi"mj„c"nw壱p"p {"x "eƒe" mevjqf"8吋 k院t n嘘k"ej¿pi"n衣i v噂i nhaụ

V隠e挨"d違p"vj·"rj亥n front-end s穎 d映pi"TgcevLU"x "PgzvLU"8吋 build 1 泳ng d映ng server-side-rendering.

3.2.1. Front-end

永ng d映ng s穎 d映ng

36 JVON1EUU1LU"n "d瓜 5"o "ej逸c ch逸p"ygd"fgxgnqrgt"p q"e pi"rj違i bi院t, t瑛 front-end t噂i back-end.

[12]HTML:

‚ JVON"n "xk院t t逸t c栄c"J{rgtVgzv"Octmwr"Ncpiwcig"*pi»p"pi英8ƒpj"f医u uk‒w"x<p"d違p+"f́pi"o»"v違 c医w"vt¿e"e栄c"eƒe"vtcpi"Ygd"x "v衣q"tc"eƒe"nq衣i v k"nk羽w"e„"vj吋 zgo"8逢嬰e"vtqpi"vt·pj"fw{羽t.

‚ JVON"n "o瓜v"vk‒w"ejw育n qu嘘c t院e„"eƒe"vj»pi"u嘘 k悦 thu壱v"8逢嬰e"fw{"vt·" b荏i World Wide Web Consortium.

CSS:

‚ CSS (vi院t t逸t c栄c"Ecuecfkpi"Uv{ng"Ujggvư"n "o瓜v"pi»p"pi英8鵜nh d衣ng 8逢嬰c s穎 d映pi"8吋o»"v違vt·pj"d {"eƒe"vtcpi"Ygd."dcq"i欝o"o w"u逸c, eƒej"d嘘 vt "x "rj»pi"eh英0"P„"ejq"rjfir"jk吋n th鵜 n瓜k"fwpi"v逢挨pi"vj ej" vt‒p"eƒe"nq衣i thi院t b鵜e„"m ej"vj逢噂e"o p"j·pj"mjƒe"pjcw."ej鰯ng h衣p"pj逢" o p"j·pj"n噂p."o p"j·pj"pj臼, ho員e"oƒ{"kp0

‚ EUU"n "8瓜c l壱p v噂k"JVON"x "e„"vj吋8逢嬰c s穎 d映ng v噂i b医t k pi»p"pi英 8ƒpj"f医w"p q"z¤{"f詠ng d詠c"vt‒pZON0"EUU"vw¤p"vjgq"ejw育n chung do Y5E"sw{"8鵜nh.

Javascript:

‚ JS (vi院t t逸t c栄c"Lcxcuetkrv+"n "o瓜t n隠n t違ng (cross-rncvhqtợ"pi»p"pi英 k鵜ch b違p"j逢噂pi"8嘘k"v逢嬰ng (object-qtkgpvgf+0"P„"n "o瓜v"pi»p"pi英 nh臼 x "pj姻. Ch衣{"vtqpi"o»k"vt逢運pi"oƒ{"ej栄n逢w"vt英*x "d映<"vt·pj"fw{羽t ygd+."LcxcUetkrv"e„"vj吋 8逢嬰c k院t n嘘i v噂k"eƒe"8嘘k"v逢嬰ng c栄c"o»k"vt逢運ng 8吋 cung c医p ki吋o"uqƒv"ej逢挨pi"vt·pj"8嘘i v噂k"ej¿pi0

‚ LcxcUetkrv"ejq"rjfir"d衣n th詠c hi羽n nh英pi"8k隠u ph泳c t衣r"vt‒p"eƒe"vtcpi" ygd"pj逢"d違p"8欝 v逢挨pi"vƒe000

‚ "Hi羽n nay" Javascript c„"8吋 s穎 d映pi"8吋 l壱r"vt·pj"e違rj c"enkgpv"n亥n server.

b) ReactJS

TgcevLU"n "o瓜v"vj逢"xk羽n Javascript m違 ngu欝n m荏8逢嬰e"rjƒv"vtk吋n b荏i

Facebook. Tr荏p‒p"e詠e"m·"rj鰻 bi院n trong gi噂i Front-gpf0"P„"f́pi"8吋 dwknf"eƒe"泳ng d映pi"Ukping"Rcig"Crrnkecvkqp"pjcpj"ej„pi"x "f宇f pi0"Vtqpi"mjk"n¿e"vt逢噂e"eƒej"n o" e挨"d違p"vj逢運pi"n "pj¿pi"eqfg"Lcxcuetkrv"x q"d‒p"vtqpi"v k"nk羽w"JVON"vj·"TgcevLU"n衣i h厩 tr嬰pj¿pi"eqfg"JVON"x q"vj»pi"swc"pi»p"pi英 LUZ0"Vtqpi"TgcevLU"vj·"dcp"8亥u

37 TgcevLU"e„"ewpi"e医p 1 s嘘hwpevkqp"f́pi"8吋 t衣o ra c医w"vt¿e"e栄a 泳ng d映pi0"Vw{"pjk‒p" vj·"xk羽c render component theo ki吋w"p {"n "t医t ph泳c t衣r"x "mj„"jk吋w0"Fq"8„"vj·"LUZ" tc"8運k"8吋 c違i thi羽n v医p"8隠p {0"LUZ"n "eƒe"8q衣p"eqfg"JVON"8逢嬰c c違i ti院p"8吋rj́" h嬰r"j挨p"ejq"xk羽c hi吋n th鵜tc"eƒe"eqorqpgpv0"E¿"rjƒr"f宇 hi吋w"j挨p"x "LUZ"e ng t嘘i 逢w"eqfg"mjk"dk‒p"uq衣n. V瑛a d宇f pi"ejq"eƒe"fgxgnqrgt."x瑛a ti羽p"j挨p"mjk"dk‒p"f鵜ch.

ReactJs h厩 tr嬰ej¿pi"vc"dwknf"pj英ng component UI cho 泳ng d映ng. Nh英ng eqorqpgpv"p {"e„"vj吋 vƒk"u穎 d映ng l衣k"8逢嬰e0"Piq k"tc"TgcevLU"e”p"e„"rtqru"x "uvcvg" f́pi"8吋 qu違p"n#"x "ejkc"u胤 d英 li羽u gi英c"eƒe"eqorqpgpv0

TgcevLU"ejq"rjfir"ej¿pi"vc"v衣q"tc"eƒe"泳ng d映ng, trang web, ph亥n m隠o"o " mj»pi"tghtguj"n衣i trang m厩k"mjk"e„"u詠vjc{"8鰻i v隠 d英 li羽w"d‒p"vtqpi"p„0"E挨"ej院p {" e”p"8逢嬰c g丑k"n "Ukping"Rcig"Crrnkecvkqp"pj逢"8«"p„k"荏 vt‒p0"Piq ktc"p„"e”p"e„"vj吋 8逢嬰c s穎 d映pi"n o"Xkgy"*X+"vtqpi"o»"j·pj"Oqfgn-View-Eqpvtqnngt"*OXE+"jc{"n o" t亥pi"Crrnkecvkqp"vtqpi"o»"j·pj"5"n噂r"*5"nc{gtư"jc{"n o"enkgpv"vtqpi"mk院p"vt¿e"Enkgpv- Server.

ReactJS s穎 d映pi"mjƒk"pk羽n Virtual DOM (DOM 違q+"8吋 quy院v"8鵜pj"x "tgpfer ra eƒe"pqfg"vtqpi"e¤{"FQO"vj壱t, d詠c"x q"u詠vjc{"8鰻k"eƒe"uvcvg"vtqpi"eqorqpgpv0"Fq"8„" s胤 h衣n ch院eƒe"vjc{"8鰻i nh医v"e„"vj吋mjk"o "e¤{"FQO"8逢嬰c updatẹ

Eƒe"n嬰k" ej"mjk"u穎 d映ng ReactJS:

‚ TgcevLU"ejq"rjfir"rjƒ"x叡 nh英ng c医u t衣o UI ph泳c t衣r"vj pj"eƒe"

eqorqpgpv"8挨p"ik違p"x "8瓜c l壱r0"Ej¿pi"vc"ik運8¤{"mj»pi"e亥n ph違i lo v隠 t鰻ng th吋泳ng d映pi"ygd"o "ej雨 c亥p"swcp"v¤o"v噂i t瑛ng component nh臼 d‒p"vtqpi"p„"x "eƒej"eƒe"eqorqpgpv"p {"8逢嬰c k院t n嘘i v噂i nhaụ ‚ TgcevLU"e„"vj吋 v ej"j嬰p chung v噂i r医t nhi隠w"vj逢"xk羽n, package, tool h厩

tr嬰0"X "f映pj逢"tgcev-router-fqo"8吋 qu違p"n#"tqwvgt."tgfwz"x "eƒe"vj逢" vi羽p"nk‒p"swcp"e栄c"p„"8吋 qu違p"n#"uvcvg."fcvc."eƒe"vj逢"xk羽n h厩 tr嬰WK.È ‚ ReactJS d宇 h丑e"x "f宇f́p."vj¤p"vjk羽n v噂i nh英pi"pi逢運i m噂i b逸v"8亥u,

th壱o"ej "ej逢c"dk院v"i·"x隠 l壱r"vt·pj0

‚ TgcevLU"mjƒ"vj¤n thi羽n v噂i SEỌ H亥u h院v"eƒe"LU"Htcogyqtm"mjƒe" mj»pi"vj¤p"vjk羽n v噂k"eƒe"e»pi"e映v·o"mk院m m員e"f́"8«"8逢嬰c c違i thi羽n r医t nhi隠w0"Vw{"pjk‒p"f逢噂i s詠 h厩 tr嬰 c栄a vi羽e"tgpfgt"fcvc"f逢噂i d衣ng web rcig"ik¿r"ejq"xk羽e"UGQ"vt‒p"泳ng d映ng React t臼 ra hi羽u qu違j挨p0

c) NextJS

NextJS [13] n "o瓜v"htcogyqtm"ejq"rjfir"ej¿pi"vc"vj詠c hi羽n vi羽c server-side- rendering hay hybrid-static v噂i ReactJS. NextJS c詠e"m·"rj鰻 bi院p"pi {"pc{0"P„"e„"j厩 tr嬰V{rguetkrv."tqwvgt"x "v詠 8瓜ng config s印n. M瓜t s嘘v pj"p<pi"p鰻i b壱t c栄c"PgzvLU"n <

38 T詠 8瓜pi"urnkv"eqfg"tc"8吋nqcf"rcig"pjcpj"j挨p."vjc{"x·"p院u s穎 d映ng ReactJS thu亥p"vj·"ej¿pi"vc"e亥n dung 8院p"eƒe"e»pi"e映 h厩 tr嬰pj逢"nc¦{"korqtv."uwurgpug"8逢嬰c v pj"j嬰p s印p"vtqpi"Tgcev"8吋 x穎n#"x医p"8隠p {0

V ej"j嬰p routing s印p"d‒p"rj c"enkgpv."mj»pi"e亥n ph違k"e k"8員v"vj‒o"eƒe"vj逢" vi羽n h厩 tr嬰 vi羽e"tqwvkpi"pj逢"tgcev-router-dom hay wouter.

E„"vj吋 d宇f pi"ewutom v噂i webpack hay babel.

E„"v pj"j嬰p s印p"3"hqnfgt"f́pi"f吋 eqfg"crk"d‒p"vtqpi"p„0

D宇 h丑c, d宇n o"swgp."th¤p"vjk羽n, ch雨 c亥p"e„"3ej¿v"mk院n th泳e"e挨"d違n v噂i TgcevLU"n "e„"vj吋 b逸v"8亥ụ

d) Ant Design

Cpv"fgukip"n "o瓜v"vj逢"xk羽n cung c医p nh英pi"eqorqpgpv"vj»pi"f映pi"f́pi"8吋 dwknf"tc"ygd"crr"pjcpj"ej„pi"x "f宇 f pi. Ant design hi羽n t衣k"n "vj逢"xk羽n UI ph鰻 bi院n nh医t hi羽p"pc{"f pj"ejq"htqpv-gpf"fgxgnqrgt"d‒p"e衣nh MaterialUI hay Bootstrap. Ant h厩 tr嬰fgxgnqrgt"rjƒv"vtk吋p"vt‒p"e違 3 n隠n t違ng framework front-end ph鰻 bi院t nh医t pi {"pc{"n "TgcevLỤ"XwgLU"x "Cpiwnct0"Cpvf"ocpi"8院n nh英pi"ikƒ"vt鵜 c嘘v"n k"ucw" 8¤{<

[14] Ikƒ"vt鵜 thi院t k院<"ikƒ"vt鵜 thi院t k院 c栄a antd cung c医r"ejq"eƒe"fgukipgt"eƒe"vk‒w" chu育n n瓜i b瓜8吋8ƒpj"ikƒ."mjck"uƒpi"x "vtw{隠n c違m h泳pi"ejq"eƒe"piw{‒p"v逸c thi院v"x " eƒe"o磯u thi院t k院*fgukip"rcvvgtp+."ucw"8„"8逢c"tc"ik違i rjƒr"ejwpi"ejq"eƒe"x医p"8隠 c映 th吋.

S詠 t詠pjk‒p<"Vj院 gi噂i k悦 thu壱t s嘘pi {"e pi"rjƒv"vtk吋p"mfiq"vjgq"u詠 ph泳c t衣p c栄c"eƒe"u違n ph育o0"Vw{"pjk‒p"#"vj泳e"x "u詠ej¿"#"e栄c"eqp"pi逢運k"e”p"j衣n ch院0"A嘘i m員t v噂i d詠o¤w"vjw磯p"p {."Cpv design vjgq"8w鰻i s詠v逢挨pi"vƒe"v詠pjk‒px "eqk"8„"n " j逢噂pi"8k"pj医v"swƒp0

39 S詠 ch逸c ch逸n: Giao di羽p"n "e亥u n嘘k"vtwpi"ikcp."n "rj逢挨pi"vk羽p"ik¿r"ejq"eqp" pi逢運k"e„"vj吋 v逢挨pi"vƒe"x噂i h羽 th嘘ng 泳ng d映pi0"Ej¿pi"n "rj逢挨pi"vk羽p"j挨p"n "o映c 8 ej0"F詠c"vt‒p"u詠 vjgq"8w鰻k"v逢挨pi"vƒe"Ðv詠pjk‒pÑ0"Eƒe"u違n ph亥m do Ant fgukip"uƒpi" t衣o ra ph違k"e„"8瓜 ch逸c ch逸p"ecq"x "u詠 h厩n lo衣n th医p.

E„"#"pij c<"Eƒe"u違n ph亥o"8逢嬰c t衣o ra b噂k"pj "vjk院t k院mj»pi"rj違i ph映 thu瓜c x q"pjw"e亥u c違w"pj "vjk院t k院o "n "8吋 ph映c v映ejq"pi逢運k"f́pi0"Vjk院t k院 s違n ph育m l医{"pi逢運k"f́pi"n o"vtwpi"v¤o"8吋 vj¿e"8亥y vi羽e"jq p"vj pj"u泳 m羽nh c栄c"pi逢運k"f́pi0" A欝ng th運i, d詠c"vt‒p"eƒe"ikƒ"vt鵜 thi院t k院 "t詠pjk‒p$"x "$ej逸c ch逸p$."ej¿pi"v»k"p‒p"zgo" zfiv"pjw"e亥w"eqp"pi逢運i c栄c"pi逢運k"f́pi"x "v衣o ra s詠v逢挨pi"vƒe"ik英c"pi逢運k"x "oƒ{" v pj"e„"#"pij c"ejq"swƒ"vt·pj"n o"xk羽c.

Nw»p"rjƒv"vtk吋n: S詠rjƒv"vtk吋n c栄a kh違p<pi"u違n ph育m c栄a doanh nghi羽r"8k" mflo"x噂i s詠 rjƒv"vtk吋n c栄c"xck"vt”"j羽 th嘘pi"pi逢運k"f́pi0"Eƒe"pj "vjk院t k院 ph違i ch鵜u vtƒej"pjk羽m v隠 s違n ph育o"o "j丑 t衣q"tc"x "e違i thi羽n kh違p<pi"mjƒo"rjƒ"e栄c"eƒe"ej泳c p<pi"x "ikƒ"vt鵜0"Eƒe"pj "vhi院t k院p‒p"vjk院t k院 v噂i t亥o"pj·p"rjƒv"vtk吋p"x "zgo"zfiv"u詠 rjƒv"vtk吋n chung c栄a c違eqp"pi逢運k"x "oƒ{"v pj0

Eƒe"n嬰k" ej"mjk"u英 d映ng Ant design:

‚ H厩 tr嬰 t衣q"pjcpj"eƒe"eqorqpgpv"vj»pi"f映pi"pj逢"dwvvqp."kprwv."keqp."È" pjcpj"ej„pị"f宇 f pi0

‚ Eƒe"eqorqpgpv"8姻p m逸t, WK"vw¤p"vjgq"Rncv"fgukip"*vjk院t k院 ph鰯ng). ‚ Fqewogpv"t "t pị"8亥{"8栄, h厩 tr嬰 chi ti院t.

‚ C瓜pi"8欝pi"8»pi"8違q."rjƒv"vtk吋n m衣nh m胤. ‚ Eƒe"d医t l嬰i khi s穎 d映ng Ant design:

‚ Khi c亥p"n o"3"vtcpi"ygd"jc{"泳ng d映pi"e„"u印n b違n design ph泳c t衣r"vj·" mj»pi"p‒p"u穎 d映ng Antd x·"t医v"mj„"8吋 custom l衣k"eƒe"eqorqpgpv"pj逢" trong design. Ch雨f́pi"mjk"o "d違n thi院t k院e pi"e„"pj英ng component vw¤p"vjgq"cpvf design ho員e"n o"3"u違n ph育o"mj»pi"swƒ"ej¿"vt丑pi"x q" ph亥n front-gpf"o "v壱r"vtwpi"x q"x¤{"f詠ng h羽 th嘘pi"dcemgpf"j挨p0

e) SCSS/SASS

SASS/SCSS n "3"d瓜 ti隠n x穎n#"EUU"*EUU"Rtg-processor)0"P„"ik¿r"ej¿pi"vc"e„" th吋Ðn壱r"vt·pjÑ"x噂i CSS. M員e"f́"EUU"ej雨 n "3"pi»p"pi英f́pi"8吋vtcpi"vt "ejq"nc{qwv" vtcpi"ygd0"Vw{"pjk‒p"x噂k"UCUU1UEUỤ"ej¿pi"vc"e„"vj吋 8員v"v‒p"dk院p."mjck"dƒq"j ọ" x”pi"n員p, if/else, extends, È gi嘘ng y h羽v"pj逢"8cpi"u穎 d映pi"3"pi»p"pi英 l壱r"vt·pj0

Eƒe"逢w"8k吋m khi s穎 d映ng SASS/SCSS:

‚ Jq p"vq p"v逢挨pi"vj ej"x噂i CSS. T泳e"n "ej¿pi"vc"e„"vj吋 code CSS vtqpi"hkng"UEUU"3"eƒej"vjq違k"oƒk"o "mj»pi"i員p v医p"8隠i·0"Vw{"pjk‒p"

40 UCUU"vj·"mj»pi"8逢嬰e"pj逢"x壱y, .sass file ph違k"vw¤p"vjgq"sw{"v逸c th映t f”pị"mj»pi"e„"f亥u ng員c nh丑n, È

‚ A嘘i v噂i nh英ng d詠ƒp"n噂n, nhi隠w"vj pj"xk‒p"vtqpi"vgco"vj·"xk羽c s穎 d映ng SASS/SCSS t臼 ra hi羽u qu違mjk"ej¿pi"vc"e„"vj吋vƒk"u穎 d映ng nh英pi"o«" o w."uk¦g."È vj»pi"swc"xk羽e"mjck"dƒq"dk院p0"Vƒk"u穎 d映ng nh英pi"8q衣n eqfg"EUU"vj»pi"swc"okzkp."È ik¿r"ejq"xk羽e"n o"xk羽e"pj„o"jk羽u qu違 j挨p0"Eqfg"e pi"f宇 f pi"ockpvckp."wrfcvg0

‚ H厩 tr嬰 nested selector. T泳e"n "e„"vj吋 vi院c l欝pi"ugngevqt"eqp"x q"trong ugngevqt"ejc0"Ik¿r"ejq"ej¿pi"vc"e„"vj吋 d宇f pi"mk吋o"uqƒv"eqfg0"Mj»pi" c亥n ph違i vi院v"eƒe"ugngevqt"f k"piq茨n.

‚ Tuy nhi吋p"8嘘i v噂i d詠ƒp"pj臼vj·"xk羽c s穎 d映pi"UCUU1UEUU"e„"vj吋 t臼 ra th瑛c"vj«k"mjk"p„"mjk院p"ejq"ej¿pi"vc"rj違k"mjck"dƒq"th‒m variable, mixin, function, Èvjc{"x·"e„"vj吋 code tr詠c ti院r"x q"vtqpi"pj逢"EUU0

f) Redux

Tgfwz"n "3"uvcvg"ocpcigogpv0"P„"j厩 tr嬰ejq"mj»pi"ej雨tk‒pi"Tgcev"o "e”p" nhi隠w"lcxcuetkrv"htcogyqtm"mjƒe"pj逢"Xwg"jc{"Cpiwnct0"Tgfwz"ik¿r"ejq"eƒe"

eqorqpgpv"e„"vj吋 d宇f pi"vtcq"8鰻i data v噂k"pjcw0"Tgfwz"8逢嬰e"z¤{"d詠ng d詠c"vt‒p" n隠n ki院p"vt¿e"Hnwz"fq"hcegdqqm"ik噂i thi羽ụ

Redux ho衣v"8瓜ng d詠c"vt‒p"piw{‒p"n#"n "v医t c違 state c栄a 泳ng d映pi"8逢嬰n逢w"vt英 荏3"p挨k"fw{"pj医t g丑k"n "uvqtg0"Eƒe"eqorqpgpv"e„"vj吋 l医y data tr詠c ti院p t瑛uvqtg"p {" e pi"pj逢"vjc{"8鰻i data trong store b茨ng eƒej"8育{"8k"pj英pi"cevkqp"*fkurcvej+"8院n tgfwegt"8吋 j o"tgfwegt"p {"rj¤p"v ej"cevkqp"8„"x "z穎n#"nqike"rj́"j嬰r"x "vjc{"8鰻i fcvc"d‒p"vtqpi"uvqtg0

41 VI羽c s穎 d映ng redux t臼tc"x»"épi"e„"jk羽u qu違mjk"o "泳ng d映ng React c栄a ej¿pi"vc"vt荏 p‒p"rj·pj"vq"tc0"E¤{"eqorqpgpv"e„"pjk隠w"pjƒpj."pjk隠u nƒ0"Mjk"8„"vj·" vi羽c giao ti院p gi英c"eƒe"eqorqpgpv"x噂k"pjcw"n "e詠e"m·"rj泳c t衣p. Data ph違k"8逢嬰c truy隠p"8k"swc"pjk隠u component. 永ng d映ng ph違i render l衣k"vq p"d瓜eƒe"eqorqpgpv" vtwpi"ikcp"8逢嬰c truy隠p"fcvc"swc"p„0"E”p"mjk"u穎 d映ng redux tj·"ej¿pi"vc"ej雨 vi羽c thao vƒe"fcvc"x噂k"eƒe"vj pj"rj亥n c嘘v"n k"e栄c"tgfwz"n "uvqtg."tgfwegt"x "cevkqp0"X "ej¿pi"vc" ch雨vjcq"vƒe"x噂i nh英pi"eqorqpgpv"p q"ow嘘p"vtcq"8鰻i data ch泳mj»pi"e亥n ph違i truy隠n data qua r医t nhi隠w"eqorqpgpv"pj逢"eƒej"vtw{隠n th嘘ng n英ạ

Tuy njk‒p"x噂i d詠ƒp"pj臼vj·"xk羽c s穎 d映ng redux t臼tc"mj»pi"e亥n thi院v"mjk"o " ej¿pi"vc"u胤 e„"vj吋 g員p nhi隠w"mj„"mj<p"mjk"eqphki"tgfwz0

Piq k"pj英pi"v pj"p<pi"pj逢"sw違p"n#"uvcvg"pj逢"vt‒p"vj·"3"u嘘 miđleware c栄a tgfwz"e”p"j厩 tr嬰fkurcvej"x "sw違p"n#"eƒe"cu{pe"cevkqp."eh栄 y院w"n "eƒe"ukfg"ghhgev0" Ukfg"ghhgev"n "pj英pi"ghhgev"d‒p"piq k."ej鰯ng h衣p"pj逢"8丑c ghi x穎n#"hkng"jc{"ecnn"crk0" M瓜t s嘘eƒe"okffngyctg"ph鰻 bi院n khi s穎 d映pi"mflo"x噂k"tgfwz"n "tgfwz-thunk, redux- saga, redux-qdugtxcdng."È

Piq k"tc"vj·"jk羽p"pc{"e”p"e„"t医t nhi隠u vj逢"xk羽n qu違p"n#"uvcvg"o "ej¿pi"vc"e„" th吋 s穎 d映pi"8吋 thay th院tgfwz"pj逢"tgeqkn"jc{"jqqmuvcvg0 Recoil hi羽p"pc{"8cpi"e„" 8逢嬰c r医t nhi隠u s詠ej¿"#"v瑛 gi噂i l壱r"vt·pj"xk‒p"fq"f宇f́pị"f宇 config.

g) Apollo Client

Apollo Client [16] n "3"vj逢"xk羽p"8逢嬰c s穎 d映pi"d‒p"rj c"htqpv-end(cligpv+0"F́pi" 8吋 giao ti院p v噂k"itcrjsn"ugtxgt"vj»pi"swc"itcrjsn"CRK0"P瓜i dung chi ti院t v隠e»pi"pij羽 graphql s胤8逢嬰e"vt·pj"d {"d‒p"f逢噂ị

Vjgq"pj逢"vtcpi"ej栄 ej pj"vj泳c c栄c"crqnnq"enkgpv"vj·"p„"n "o瓜v"vj逢"xk羽n qu違p"n#" state cho javascript. T泳e"n "p„"8逢嬰e"f́pi"mj»pi"ej雨荏Tgcev"o "荏 b医t c泳 javascript htcogyqtm"p q"jc{"lcxcuetkrv"vjw亥n. P„"ik¿r"ej¿pi"vc"sw違p"n#"fcvc"nqecn"x "tgoqvg. S穎 d映pi"crqnnq"enkgpv"8吋hgvej."ecejg"x "8k隠u ch雨nh data trong khi t詠8瓜ng c壱p nh壱t l衣i UI c栄a 泳ng d映ng.

42 Eƒe"8員e"8k吋m n鰻i b壱t c違u apollo client:

‚ Vi院t truy v医p"x "pj壱n d英 li羽w"o "mj»pi"vjgq"f k"vt衣pi"vjƒk"v違k"vjgq"eƒej" th栄e»pi0

‚ Tr違i nghi羽m tuy羽t v運k"f pj"ejq"fgxgnqrgt<"V壱p"j逢荏pi"e»pi"e映 h英w" ej"

Một phần của tài liệu Xây dựng hệ thống nghe và chia sẻ nhạc online (Trang 29 - 57)

Tải bản đầy đủ (PDF)

(95 trang)