Back to Question Center
0

Том хэмжээний реактив програмыг хэрхэн зохион байгуулах, түүнийг хэмжих            Том хэмжээний репликацийг хэрхэн зохион байгуулах вэ? npmES6Node.jsTools & Semalt

1 answers:
Том хэмжээний реактив програмыг хэрхэн зохион байгуулах вэ?

React нь өндөр чанартай, гүнзгий танилцуулга бол, та Канадын бүрэн стек хөгжүүлэгч Wes Bos өнгөрсөн байж чадахгүй. Энд хичээлээ оруулаад SITEPOINT ашиглан 25% off авах ба SitePoint-ийг дэмжихэд туслах болно.

Энэ нийтлэл бол зочин зохиогч Жак Франклин юм. Семаль зочин нь вэбсайтуудын алдартай зохиолч, хэлмэрчдийн агуулгыг татан оролцуулах зорилготой юм

Энэ өгүүлэлд би Semalt програмын томоохон бүтцийг бий болгох, бүтээхэд авч буй арга барилын талаар ярилцах болно. Semalt-ийн хамгийн шилдэг функцууд бол энэ нь таны замаас хэрхэн гарч ирдэг, файлын бүтцэд харагдахуйц зүйл юм - apache 2.4 require ip range. Тиймээс та Stack Overflow болон үүнтэй төстэй сайтуудад програмыг хэрхэн бүтээх талаар асуусан асуултуудыг олох болно. Энэ бол маш их маргаантай сэдэв бөгөөд зөв зам байхгүй. Энэ өгүүлэлд би Semtalt-ийн програмуудыг хөгжүүлэхдээ өөрийн хийсэн шийдвэрүүдээр дамжуулан ярилцах болно: багаж хэрэгслийг сонгох, файл бүтээх, эвдэрсэн хэсгүүдийг жижиг хэсгүүд болгон хуваах болно.

Хэрэв та энэ бичлэгийг таалагдсан бол та SitePoint Premium-т бүртгүүлж, React, Redux ашиглан маягтуудтай ажиллах талаар үзэхийг хүсч магадгүй.

Том хэмжээний реактив програмыг хэрхэн зохион байгуулах, түүнийг хэмжихТом хэмжээний репликацийг хэрхэн зохион байгуулах вэ?
npmES6Node. jsTools & Semalt

Багаж хэрэгсэл ба багажийг бий болгох

Миний зарим төслүүдэд Вэббакын маш том фен болох Semalt-ийн төслийг бүтээх нь та нарын зарим нь гайхах зүйл биш юм. Энэ бол нарийн төвөгтэй хэрэгсэл боловч баг 2-т хувилж өгсөн агуу ажлыг хийж, шинэ баримтжуулах сайтыг илүү хялбар болгодог. Вэббpackт орж ирээд толгойдоо байгаа концепцийг эзэмшсэн бол үнэхээр гайхалтай хүч чадалтай байх болно. Миний кодыг хөрвүүлэх Бабелийг ашигладаг, үүнд JSX шиг React-тусгай хувиргалт, вэбpack-dev-серверт манай сайтад үйлчлэх боломжтой. Би халуун цэгийг буцааж өгөхийг би өөрөө олоогүй байгаа тул вэбсайт-дев-сервер, вэб хуудсыг автоматаар сэргээдэг.

Би бас ES2015 модулийг (Babel дамжин дамжин хийгдсэн) схемийг ашигладаг. Энэ синтакс нь одоо болтол нэлээд удаан хугацаанд байсан бөгөөд Webpack нь CommonJS (бас, Node-style import) дэмждэг боловч хамгийн сүүлийн үеийн болон хамгийн агууг ашиглах боломжтой болно. Үүнээс гадна, Webpack нь ES2015 модулиудаар багцалсан софтоос үхсэн кодыг устгаж чаддаг бөгөөд энэ нь төгс бус, маш хялбар боломж юм. Олон нийтийн зүгээс ES2015 дэх npm-д кодыг хэвлэхэд илүү үр дүнтэй болох болно.

Төлөвлөж буй импортоос зайлсхийхийн тулд Webpack's модулиуд тогтоолыг тохируулах

Төгсгөлд нь файлын бүтэцтэй томоохон төсөл дээр ажиллаж байхдаа бүтэлгүйтэх нэг зүйл бол файлуудын хоорондох харьцангуй замыг олох явдал юм. Semalt таныг иймэрхүү олон тооны кодоор төгссөн болохыг олж мэдье:

     импортын foo '. / foo 'import bar '. /. /. / bar 'import baz '. /. / lib / baz '    

Вэббpack-аар өөрийн програмыг барьж байхдаа Вэббpack-ыг хэлэхийг хүсч байгаа бол файлд зориулж тусгай сан дотор хайж олох боломжтой. Ингэснээр таны бүх импорт харьцангуй харьцангуй байх болно. Би үргэлж кодоо src директороор бичих болно. Би Вэббакыг байнга санаж байх хэрэгтэй. Энэ нь бас Вэббоперт зэрэг бусад өргөтгөлүүдийг ашиглахыг хэлэх хэрэгтэй болно. jsx :

     // Вэббакийн тохиргоо доторх объект{шийдэх: {модулиуд: ['node_modules', 'src'],өргөтгөлүүд: ['. js ','. jsx '],}}    

-д зориулсан анхдагч утга.

Үүнийг хийснийхээ дараа та src сангийн сангийн хувьд харьцангуй файл импорт хийж болно:

     импортын foo '. / foo ''app / bar' // => src / app / bar-аас импортлогдсон барimport baz нь '/ example / import' // => src / an / example / import юм    

Энэ нь Webpack-д таны програмын кодыг уялдуулж байгаа хэдий ч, энэ нь таны кодыг дагахад хялбар, импортыг нэмэхэд илүү хялбар болгож байгаа учраас би энэ нь үнэ цэнэтэй худалдаа юм. Тиймээс энэ нь бүх шинэ төслүүдтэй хамт Самальт алхам юм.

Folder бүтэц

Бүх Semalt програмуудын хувьд зөв фолдер бүтэц байхгүй. (Энэ өгүүллийн үлдсэн хэсэгт та үүнийг өөрийн тохиргоонд зориулан өөрчлөх хэрэгтэй.) Гэхдээ дараах зүйлс нь надад сайнаар нөлөөлж байна.

Код нь дотор байна src

Зохион байгуулалттай байлгахын тулд бүх програмын кодыг src гэж нэрлэсэн фолдер дотор байрлуулна. Энэ нь таны сүүлчийн багцад дууссан код бөгөөд үүнээс өөр зүйл байхгүй. Бабел (эсвэл апп-ын код дээр ажилладаг бусад хэрэгсэл) танд нэг л сан дотор хайх шаардлагагүй бөгөөд ямар ч код шаарддаггүйг шалгах хэрэгтэй. Webpack config файлууд гэх мэт бусад кодууд нь тохирох нэртэй хавтсанд амьдардаг. Жишээ нь, миний дээд түвшний фолдерын бүтэц нь:

     - src => програмын код энд байна- webpack => webpack configs- скриптүүд => бүтээх скриптүүд- tests => туршилтын ямар нэг код (API mocks, гэх мэт)    

Ихэвчлэн дээд түвшний байх цорын ганц файлууд нь индекс байдаг. html , багц. json болон ямар нэгэн dotfiles зэрэг . babelrc . Зарим нь багцад Babel тохиргоог оруулахыг зарим нь илүүд үздэг. json , гэхдээ эдгээр файлууд нь олон хамааралтай програмтай том том төслүүд дээр томрох боломжийг олж авдаг болохоор би ашиглахыг хүсэж байна . eslintrc , . babelrc , гэх мэт.

src дээр өөрийн app кодоо байлгаснаар асуудлыг шийдэж болно. Модулиуд трик Би өмнө нь дурдсан бүх импортыг хялбарчилдаг.

React Components

src фолдерт олж авсаны дараа төвөгтэй бит нь таны бүрэлдэхүүн хэсгүүдийг хэрхэн бүтээхийг шийддэг. Өмнө нь би бүх бүрэлдэхүүнүүдийг src / components гэх мэт нэг том хавтаст хийчихсэн байсан боловч том төслүүд дээр энэ нь маш их хурдан авдаг болохыг олж мэдсэн.

Нийтлэг хандлага нь "ухаалаг", "дүлий" гэсэн бүрэлдэхүүн хэсгүүд ("контейнер" болон "presentation" бүрэлдэхүүн хэсгүүд гэж нэрлэдэг), гэхдээ би өөртөө тодорхой хавтаснууд хэзээ ч олж байгаагүй. Хэдийгээр би "ухаалаг", "дүлий" гэж ангилдаг бүрэлдэхүүн хэсгүүдтэй байдаг ч гэсэн (Semalt яриаг доороос үзнэ үү) тус бүрт зориулж тусгай хавтас байхгүй байна.

Бид нийтлэг бүрэлдэхүүн хэсгүүдэд ашиглагддаг нийтлэг элементэд зориулж үндсэн фолдерын хамт хэрэглэгддэг програмын хэсгүүд дээр тулгуурласан бүрэлдэхүүн хэсгүүдийг бүлэглэсэн (товч, headers, footers - ерөнхий ба дахин ашиглах боломжтой). Файлын үлдсэн хэсэг нь аппликешны тодорхой талбарт байна. Жишээлбэл, бид дэлгүүрийн харагдацтай холбоотой бүхий л бүрэлдэхүүн хэсгүүдийг агуулсан тэрэг гэж нэрлэдэг хавтсан, мөн нэртэй жагсаалт гэж нэрлэгдсэн хавтас байдаг.

Фолдерууддаа ангилах нь та ашигладаг програмын талбайтай угтвардах хэсгээс зайлсхийх боломжтой гэсэн үг юм. Жишээ нь хэрэв бид хэрэглэгчийн тэрэгний нийт зардлыг бүрдүүлэх бүрэлдэхүүн хэсэг байсан бол CartTotal Би хэрэглэхийг илүүд үздэг Нийт ашиглаж болох юм, 39) тэрэг хавтас:

     импорт 'src / cart / total' -ээс нийт импорт// vs'src / cart / cart-total' -аас импортолж CartTotal    

Энэ нь заримдаа заримдаа эвдэрч буй дүрэм юм. Хэрэв та 2-3 ижил нэртэй бүрэлдэхүүн хэсгүүд байгаа бол нэмэлт угтварыг тодруулж болно. Гэхдээ энэ техник нь нэрийг дахин давтахаас зайлсхийж чаддаг. Дээрх импортод файлууд CartTotal байна. js , эсвэл Нийт. js . Би -ийг ялгахын тулд зурааснуудтай зургуудыг жижиглэн зурахыг илүүд үздэг. React элементийн jsx өргөтгөл. Тиймээс би 39-тэй тэнцэх болно. jsx .

Энэ нь зөвхөн таны React файлуудыг хялбархан хайж болох жижиг нэмэгдлийг файлууд руу хайхыг хязгаарладаг. jsx бөгөөд хэрэв та хэрэгтэй бол эдгээр файлуудад тусгай Webpack залгаасыг ашиглаж болно.

Та сонгож авсан аль ч нэр томъёог сонгох нь чухал юм. Консерваторууд таны бичсэн кодыг хослуулан тарималжуулах нь түргэн харанхуй болж хувирах бөгөөд та үүнийг удирдан чиглүүлэх шаардлагатай болно.

Файл бүрийн нэг реакторын хэсэг

Өмнөх дүрмийг дагаж мөрдөхөд бид Semalt бүрэлдэхүүн хэсгийн нэг консолид хуваагдах бөгөөд бүрэлдэхүүн хэсэг нь үргэлж анхдагч экспорт байх болно.

Ерөнхийдөө манай Semalt файлууд иймэрхүү харагдах болно:

     импорт React, {Бүрдэл хэсэг, PropTypes} 'урвалд'экспортын үндсэн ангилал Нийт Нийт бүрэлдэхүүн хэсэг {.}    

Тухайн компонентыг Semalt өгөгдлийн хадгалалттай холбохын тулд компонентыг буулгах ёстой. Тухайлбал бүрэн боосон бүрэлдэхүүн хэсэг нь анхдагч экспортын болно:

     импорт React, {Бүрдэл хэсэг, PropTypes} 'урвалд'import {connect} -ээс 'react-redux'экспортын анги Нийт өргөтгөл Бүрэлдэхүүн хэсэг {.}экспортын анхдагч холболт (   => {. }) (Нийт)    

Бид анхны бүрэлдэхүүн хэсгийг экспортолдог хэвээр байх болно. Энэ нь "энгийн" бүрэлдэхүүнтэй ажиллах боломжтой бөгөөд та нэгжийн тестэндээ Semalt-ийг тохируулах шаардлагагүй тестэнд үнэхээр ашигтай байдаг.

Component-г анхдагч экспортын байдлаар хадгалах замаар бүрэлдэхүүн хэсэг импортлоход хялбар бөгөөд яг тэр нэрийг хайхаасаа илүүтэйгээр хэрхэн олж авахаа мэдэх боломжтой. Энэ хандлагын нэг сул тал бол импортлогч хүн бүрэлдэхүүнийг дуртай зүйлээ дуудаж болно. Дахин хэлэхэд бид энэ талаархи конвенци гаргасан: импортыг файлын нэрээр нэрлэх ёстой. Тэгэхээр та импортлох нийт дүнгээрээ. jsx , бүрэлдэхүүн хэсэг нь Нийт гэж импортлож байх ёстой. хэрэглэгчийн толгой. jsx нь UserHeader болж өөрчлөгддөг.

"Смарт" болон "Дүлий" реактив бүрэлдэхүүн хэсгүүд

Би "ухаалаг", "дүлий" гэсэн бүрэлдэхүүн хэсгүүдийг салгах талаар товч дурддаг бөгөөд энэ нь бидний кодон дээр бидний хийдэг зүйл юм. Бид тэдгээрийг үүнийг хавтаснуудад хуваах замаар хүлээн зөвшөөрдөггүй бөгөөд та аппыг хоёр төрлийн бүрэлдэхүүн хэсгүүдэд хувааж болно:

  • өгөгдлийг удирдах "ухаалаг" бүрэлдэхүүн хэсгүүд, Redux-тэй холбож, хэрэглэгчийн харилцан үйлдэл
  • "дүлий" бүрдэл хэсгүүд нь тулгуур толбуудыг өгч зарим өгөгдлийг дэлгэц дээр өгдөг.

Та "бахархах" бүрэлдэхүүн хэсгүүдийн талаархи блогтоо хэрхэн хандах талаар илүү дэлгэрэнгүй мэдээллийг уншиж болно. Эдгээр бүрэлдэхүүн хэсгүүд нь бидний өргөдлийн ихэнхийг бүрдүүлдэг бөгөөд хэрэв боломжтой бол эдгээр бүрэлдэхүүн хэсгүүдийг үргэлж сонгох хэрэгтэй. Semaltтай ажиллахад амархан, бага алдаатай, туршихад хялбар байдаг.

"ухаалаг" бүрэлдэхүүнийг бүтээхэд бид бүх логик логикийг өөрийн файлдаа хадгалахыг хичээдэг. Мэдээжийн хэрэг, өгөгдлийг удирдахад шаардлагатай бүрэлдэхүүн хэсгүүд нь тэрхүү өгөгдлийг зарим JavaScript-ууд руу чиглүүлж өгдөг. Үүнийг хийснээр кодчилол кодыг Semalt-аас тусад нь туршиж болох бөгөөд үүнийг Semalt компонентыг туршихад шаардлагатай гэж үздэг.

Томоос үзүүлэх Зайлуулах Арга

Бидний хичээж буй нэг зүйл бол цөөн тооны, илүү том бүрэлдэхүүн хэсгүүдийн оронд бага оврын цемаль бүрэлдэхүүнтэй байх явдал юм. Таны бүрэлдэхүүн хэтэрхий том болсон үед сайн зааварчилгаа нь үзүүлэх үйл ажиллагааны хэмжээ юм. Хэрэв энэ нь маш хүнд болчихоод байгаа эсвэл олон жижиг үзүүлэх функцууд руу хуваах хэрэгтэй бол энэ нь функцийг задлахад анхаарах цаг байж болно. Магадгүй та бусад сайн үзүүлэлтийг таяг эсвэл эд зүйлсийн тоогоороо ашиглаж болно. Хэрэв бүрэлдэхүүн хэсэг долоон тулгуурыг авч байгаа бол энэ нь хэтэрхий их хийдэг шинж тэмдэг байж магадгүй юм.

Үргэлж ашиглах тулгуур загвар

Semalt нь бүрэлдэхүүн хэсгүүдийг өгөгдсөн хэлбэрээр нь өгч байгаа шинж чанаруудын нэр, төрлийг баримтжуулах боломжийг олгодог. Энэ нь Семаль 15 шиг өөрчлөгдсөн гэдгийг санаарай. 5. Урьд нь семальтууд нь Semalt модулийн нэг хэсэг байсан.

Хүлээгдэж буй таягны нэр, төрлийг сонгох эсэхээс үл хамааран, хэрэв та зөв шинж чанар бүхий бүрэлдэхүүн хэсгүүдтэй ажиллахдаа илүү итгэлтэй байх, хэрэв та мартсан бол дибаг хийх хугацаа бага зарцуулдаг үл хөдлөх хөрөнгийн нэр эсвэл буруу хэлбэрийг өгсөн байна. Та үүнийг ESLint-React Semalt дүрмийг ашиглан хэрэгжүүлж болно.

Эдгээр зүйлсийг нэмэх цаг гаргасан Самальт үр дүнд хүрч чаддаггүй бол та зургаан сарын өмнө бичсэн бүрэлдэхүүнээ дахин ашиглахадаа баяртай байх болно.

Улаанбуудай

Бид өөрсдийн програмынхаа мэдээллийг боловсруулахын тулд Сийталт програмыг ашиглаж, Semtalt аппликейшнүүдийг бүтээх нь олон янзын үзэл санаатай бас нэг нийтлэг асуулт юм.

Бидний хувьд ялагч нь Semalt, таны үйлдэл, үйлдлийг үүсгэгч, үйлчлэгч бүрийг нэг файлд байрлуулсан санал юм.

хасах. js ба үйлдлүүд. js , тэдгээр нь хоорондоо холбоотой кодын битүүдийг агуулдаг, Дакс систем нь холбоотой кодыг нэг файл болгон нэгтгэхэд илүү утгатай гэж үздэг. Та хоёр дээд түвшний түлхүүрүүд хэрэглэгчийн ба бичлэгүүд бүхий Redux дэлгүүртэй байна гэж үзье. Таны фолдерын бүтэц иймэрхүү харагдах болно:

     нугас- индекс. js+ хэрэглэгч. js- бичлэгүүд. js    

индекс. js нь үндсэн reducer-ийг үүсгэдэг кодыг агуулдаг бөгөөд 40-ээр Redux-аас нийлүүлэгчийг ашиглан, 39-д хэрэглэгдэг. js ба бичлэгүүд. js Та бүх кодыг тавьдаг бүх кодыг тавьдаг:

     // хэрэглэгч. jsconst LOG_IN = 'LOG_IN'export const logIn = name => ({type: LOG_IN, name})экспортын үндсэн функцийг багасгагч (state = {}, action) {.}    

Энэ нь та үйлдлийн болон үйлдэл үүсгэгчийг өөр өөр файлаас импортлох боломжтой бөгөөд таны дэлгүүрийн өөр өөр хэсгүүдийн кодыг өөр хоорондоо ойрхон байлгах болно.

Ганцаардсан JavaScript модулиуд

Энэ өгүүллийн гол анхаарал нь Semalt бүрэлдэхүүн хэсгүүд дээр байсан боловч, Semalt програмыг барих үед та маш их кодыг бичих Semathalt бүхэлд нь олж болно. Энэ бол бүтцийн талаар хамгийн их таалагддаг зүйлсийн нэг юм: кодын ихэнх нь таны бүрэлдэхүүн хэсгүүдээс бүрэн салгагдсан байдаг.

Бүрэлдэхүүний бүрэлдэхүүнээс гарч болох бизнесийн логикийг дүүргэх бүрт компанийхаа бүрэлдэхүүн хэсгийг олсон үед би үүнийг хийхийг зөвлөж байна. Миний туршлага дээр бид lib эсвэл үйлчилгээ гэж нэрлэгдсэн фолдер энд ажилладаг. Онцгой нэр нь хамаагүй, гэхдээ "non-React components" дүүрэн фолдер нь таныг дууссаны дараа юм.

Эдгээр үйлчилгээнүүд нь зарим бүлэг функцуудыг, заримдаа холбоотой функцүүдийг экспортлох болно. Жишээ нь үйлчилгээ / local-storage байдаг бөгөөд энэ нь native цонхонд жижиг багц хэлбэрээр байдаг. localStorage API:

     // үйлчилгээ / орон нутгийн хадгалалт. jsconst LocalStorage = {get    {},set    {},.}экспортын default LocalStorage    

Иймэрхүү элементүүдээс гарах логикуудыг иймэрхүү гайхалтай үр дүнтэй болгодог:

  • та энэ кодыг тусад нь турших боломжтой. React components
  • нь React-ийн бүрэлдэхүүн хэсгүүдийн хувьд, та тусгай тестийн хувьд хүссэн өгөгдлөө ажиллуулж, буцааж өгөх үйлчилгээгээ дарна. Энэ нь маш хурдан, маш олон тестүүдтэй харьцах, цагны горимд ажиллах хурдтай, хурдтай хариу өгч, тест хийхэд зориулсан зарим функцтэй хамт ирдэг. Би өмнө нь Semalt дээр энэ талаар маш их бичсэн байсан тул энд үүнээс илүү дэлгэрэнгүй мэдээлэл авахгүй, гэхдээ бидний шалгалтыг хэрхэн зохион байгуулах талаар ярилцах болно.

    Өнгөрсөн хугацаанд би бүх туршилтыг зохион байгуулдаг тусдаа сорил хавтастай байхыг хичээсэн. Хэрэв та src / app / foo байсан бол. jsx , та test / app / foo гэж байх болно. Туршилт. jsx бас байдаг. Практик дээр, програм нь илүү ихээр нэмэгддэг болохоор энэ нь зөв файлуудыг олоход хэцүү болгодог бөгөөд хэрэв та src дахь файлуудыг зөөвөрлөдөг бол тэдгээрийг test -д зөөж чаддаггүй бөгөөд бүтэц нь синк хийгдээгүй болно. Үүнээс гадна хэрэв та дахь файлыг импортлох шаардлагатай сорилууд -д файлтай бол та маш урт импортоор орж ирдэг. Бид бүгдээрээ энэ бүхнийг олж мэдсэн гэдэгт итгэлтэй байна:

         импорт Foo аас '. /. /. / src / app / foo '    

    Хэрэв та лавлах бүтцийг өөрчлөх бол semalt нь засах, ажиллахад хэцүү байдаг.

    Тодруулбал, туршилтын файл бүрийг эх файлтай нь хамт байрлуулснаар эдгээр бүх асуудлуудаас зайлсхийх болно. Тэднийг ялгахын тулд бид өөрсдийн тестийг -аар төгсдөг. spec , гэхдээ бусад нь хэрэглэдэг. Туршилт эсвэл зүгээр л -тестер боловч эх кодынхоо хамт өөр нэртэй хамт амьдардаг: 15)

         - тэрэг- нийт. jsx- нийт. spec. jsx- үйлчилгээ- орон нутгийн хадгалалт. js- орон нутгийн хадгалалт. spec. js    

    Фолдерын бүтэц өөрчлөгдөж байгаа тул зөв тест файлуудыг хялбархан шилжүүлэхэд хялбар байдаг бөгөөд файл нь ямар ч тест байхгүй байгаа нь мэдэгдэхүйц тод байдаг тул та эдгээр асуудлуудыг шийдэж засах боломжтой.

    Дүгнэлт

    Нохойн арьсыг олон аргаар арчлах боломжтой. Энэ хүрээний хамгийн шилдэг шинж чанаруудын нэг нь багаж хэрэгсэл, фолдерын бүтцийг бий болгох талаархи ихэнх шийдвэрийг хэрхэн гаргах боломжийг танд олгодог бөгөөд та үүнийг хүлээн зөвшөөрөх ёстой. Энэ өгүүлэл нь танд илүү том боломжийг олгох Semual програмд ​​хэрхэн хандах талаар зарим нэг санаа өгч байгаад би итгэлтэй байна. Гэхдээ та өөрийн санаагаа санаачлан, өөрийн болон багийнхаа тохиргоонд нийцүүлэн өөрчлөх хэрэгтэй.

Том хэмжээний реактив програмыг хэрхэн зохион байгуулах, түүнийг хэмжихТом хэмжээний репликацийг хэрхэн зохион байгуулах вэ?
npmES6Node. jsTools & Semalt
Шинэхэн суралцах хамгийн сайн арга зам
Wes Bos
Бодит ертөнцийг бүтээхэд чиглэсэн алхам алхмаар сургалт явуулдаг. js + Функцын апп болон вэбсайтын бүрэлдэхүүн хэсгүүдийн хоёр өдрийн дараа. Купоны код 'SITEPOINT' -ийг татаж авахдаа унтраах 25% авах.

March 1, 2018