{"id":247,"date":"2018-07-29T09:38:55","date_gmt":"2018-07-29T02:38:55","guid":{"rendered":"http:\/\/thietkewebdalat.net\/blog\/?p=247"},"modified":"2019-03-13T19:37:34","modified_gmt":"2019-03-13T12:37:34","slug":"20-modules-cua-node-js-ban-can-biet","status":"publish","type":"post","link":"https:\/\/thietkewebdalat.net\/blog\/20-modules-cua-node-js-ban-can-biet\/","title":{"rendered":"20  modules c\u1ee7a Node js b\u1ea1n c\u1ea7n bi\u1ebft"},"content":{"rendered":"<p>Xin ch\u00e0o m\u1ecdi ng\u01b0\u1eddi<\/p>\n<p>H\u00f4m nay m\u00ecnh s\u1ebd gi\u1edbi thi\u1ec7u cho m\u1ecdi ng\u01b0\u1eddi 20 modules c\u1ee7a node m\u00e0 b\u1ea1n c\u1ea7n ph\u1ea3i bi\u1ebft \u0111\u1ec3 \u00e1p d\u1ee5ng v\u00e0o c\u00f4ng vi\u1ec7c:<\/p>\n<h3 id=\"01-manipulate-images\">01.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/aheckmann\/gm\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"3\" data-component=\"Inline links\" data-count=\"15\">Manipulate images<\/a><\/h3>\n<p>GraphicsMagick v\u00e0 ImageMagick l\u00e0 hai c\u00f4ng c\u1ee5 ph\u1ed5 bi\u1ebfn \u0111\u1ec3 t\u1ea1o, ch\u1ec9nh s\u1eeda, so\u1ea1n v\u00e0 chuy\u1ec3n \u0111\u1ed5i h\u00ecnh \u1ea3nh. Nh\u1edd c\u00f3 m\u00f4-\u0111un Node.js, b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng c\u1ea3 hai c\u00f4ng c\u1ee5 tr\u1ef1c ti\u1ebfp t\u1eeb b\u00ean trong m\u00e3 JavaScript c\u1ee7a m\u00ecnh. Module h\u1ed7 tr\u1ee3 t\u1ea5t c\u1ea3 c\u00e1c ho\u1ea1t \u0111\u1ed9ng h\u00ecnh \u1ea3nh \u0111i\u1ec3n h\u00ecnh &#8211; thay \u0111\u1ed5i k\u00edch c\u1ee1, c\u1eaft v\u00e0 m\u00e3 h\u00f3a th\u00e0nh t\u00ean ch\u1ec9 m\u1ed9t v\u00e0i.<\/p>\n<pre class=\"line-numbers language-javascript\"><code class=\" language-javascript\"><span class=\"token keyword\">const<\/span> gm <span class=\"token operator\">=<\/span> <span class=\"token function\">require<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'gm'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token function\">gm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'\/path\/to\/image.jpg'<\/span><span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token punctuation\">.<\/span><span class=\"token function\">resize<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">500<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">250<\/span><span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token punctuation\">.<\/span><span class=\"token function\">autoOrient<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token punctuation\">.<\/span><span class=\"token function\">write<\/span><span class=\"token punctuation\">(<\/span>response<span class=\"token punctuation\">,<\/span> error <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<h3 id=\"02-process-images\">02.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/lovell\/sharp\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"4\" data-component=\"Inline links\" data-count=\"15\">Process images<\/a><\/h3>\n<p>Sharp d\u1ef1a tr\u00ean th\u01b0 vi\u1ec7n x\u1eed l\u00fd h\u00ecnh \u1ea3nh libvips c\u1ef1c nhanh v\u00e0 tuy\u00ean b\u1ed1 nhanh h\u01a1n 4 \u0111\u1ebfn 5 l\u1ea7n so v\u1edbi ImageMagick ho\u1eb7c GraphicsMagick khi n\u00f3i \u0111\u1ebfn vi\u1ec7c n\u00e9n v\u00e0 thay \u0111\u1ed5i k\u00edch th\u01b0\u1edbc h\u00ecnh \u1ea3nh. N\u00f3 h\u1ed7 tr\u1ee3 c\u00e1c h\u00ecnh \u1ea3nh JPEG, PNG, WebP, TIFF, GIF v\u00e0 SVG, v\u00e0 xu\u1ea5t d\u1eef li\u1ec7u v\u00e0o c\u00e1c lu\u1ed3ng pixel th\u00f4, JPEG, PNG ho\u1eb7c WebP kh\u00f4ng n\u00e9n.<\/p>\n<h3 id=\"03-generate-sprite-sheets\">03.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/Ensighten\/spritesmith\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"5\" data-component=\"Inline links\" data-count=\"15\">Generate sprite sheets<\/a><\/h3>\n<p>C\u00e1c trang Sprite l\u00e0 c\u00e1c t\u1ec7p bitmap ch\u1ee9a nhi\u1ec1u h\u00ecnh \u1ea3nh nh\u1ecf kh\u00e1c nhau (v\u00ed d\u1ee5 nh\u01b0 c\u00e1c bi\u1ec3u t\u01b0\u1ee3ng) v\u00e0 ch\u00fang th\u01b0\u1eddng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 gi\u1ea3m chi ph\u00ed t\u1ea3i xu\u1ed1ng h\u00ecnh \u1ea3nh v\u00e0 t\u0103ng t\u1ed1c \u0111\u1ed9 t\u1ea3i trang t\u1ed5ng th\u1ec3. T\u1ea1o th\u1ee7 c\u00f4ng c\u00e1c trang sprite r\u1ea5t c\u1ed3ng k\u1ec1nh, nh\u01b0ng v\u1edbi spritesmith b\u1ea1n c\u00f3 th\u1ec3 t\u1ef1 \u0111\u1ed9ng h\u00f3a qu\u00e1 tr\u00ecnh. M\u00f4-\u0111un n\u00e0y l\u1ea5y m\u1ed9t th\u01b0 m\u1ee5c l\u00e0m \u0111\u1ea7u v\u00e0o v\u00e0 k\u1ebft h\u1ee3p t\u1ea5t c\u1ea3 c\u00e1c h\u00ecnh \u1ea3nh trong \u0111\u00f3 th\u00e0nh m\u1ed9t trang t\u00ednh. N\u00f3 c\u0169ng t\u1ea1o ra m\u1ed9t t\u1ec7p JSON ch\u1ee9a t\u1ea5t c\u1ea3 c\u00e1c t\u1ecda \u0111\u1ed9 cho t\u1eebng h\u00ecnh \u1ea3nh trong h\u00ecnh \u1ea3nh k\u1ebft qu\u1ea3 m\u00e0 b\u1ea1n c\u00f3 th\u1ec3 sao ch\u00e9p tr\u1ef1c ti\u1ebfp trong m\u00e3 CSS c\u1ee7a m\u00ecnh.<\/p>\n<h3 id=\"04-format-dates\">04.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/moment\/moment\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"6\" data-component=\"Inline links\" data-count=\"15\">Format dates<\/a><\/h3>\n<p>API JavaScript chu\u1ea9n \u0111\u00e3 \u0111i k\u00e8m v\u1edbi \u0111\u1ed1i t\u01b0\u1ee3ng Date \u0111\u1ec3 l\u00e0m vi\u1ec7c v\u1edbi ng\u00e0y th\u00e1ng v\u00e0 th\u1eddi gian. Tuy nhi\u00ean, \u0111\u1ed1i t\u01b0\u1ee3ng n\u00e0y kh\u00f4ng th\u00e2n thi\u1ec7n v\u1edbi ng\u01b0\u1eddi d\u00f9ng khi n\u00f3i \u0111\u1ebfn ng\u00e0y in v\u00e0 \u0111\u1ecbnh d\u1ea1ng. M\u1eb7t kh\u00e1c, Moment.js cung c\u1ea5p API s\u1ea1ch, r\u1ea5t d\u1ec5 \u0111\u1ecdc v\u00e0 d\u1ec5 hi\u1ec3u<\/p>\n<pre class=\"line-numbers language-javascript\"><code class=\" language-javascript\"><span class=\"token function\">moment<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">7<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">'days'<\/span><span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token punctuation\">.<\/span><span class=\"token function\">subtract<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">'months'<\/span><span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token punctuation\">.<\/span><span class=\"token function\">year<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2009<\/span><span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token punctuation\">.<\/span><span class=\"token function\">hours<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span>\r\n  <span class=\"token punctuation\">.<\/span><span class=\"token function\">minutes<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">.<\/span><span class=\"token function\">seconds<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/code><\/pre>\n<h3 id=\"05-validate-strings\">05.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/chriso\/validator.js\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"7\" data-component=\"Inline links\" data-count=\"15\">Validate strings<\/a><\/h3>\n<p>Khi cung c\u1ea5p bi\u1ec3u m\u1eabu tr\u00ean trang web, b\u1ea1n lu\u00f4n ph\u1ea3i x\u00e1c th\u1ef1c gi\u00e1 tr\u1ecb m\u00e0 ng\u01b0\u1eddi d\u00f9ng nh\u1eadp v\u00e0o &#8211; kh\u00f4ng ch\u1ec9 \u1edf ph\u00eda m\u00e1y kh\u00e1ch m\u00e0 c\u00f2n \u1edf ph\u00eda m\u00e1y ch\u1ee7 \u0111\u1ec3 ng\u0103n ch\u1eb7n d\u1eef li\u1ec7u \u0111\u1ed9c h\u1ea1i. M\u1ed9t m\u00f4-\u0111un c\u00f3 th\u1ec3 gi\u00fap b\u1ea1n \u1edf \u0111\u00e2y l\u00e0 validator.js. N\u00f3 cung c\u1ea5p m\u1ed9t s\u1ed1 ph\u01b0\u01a1ng th\u1ee9c \u0111\u1ec3 x\u00e1c nh\u1eadn c\u00e1c chu\u1ed7i, t\u1eeb isEmail () v\u00e0 isURL () t\u1edbi isMobilePhone () ho\u1eb7c isCreditCard (), c\u1ed9ng v\u1edbi b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng n\u00f3 tr\u00ean m\u00e1y ch\u1ee7 v\u00e0 ph\u00eda m\u00e1y kh\u00e1ch.<\/p>\n<h3 id=\"06-work-with-colour-values\">06.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/www.github.com\/bgrins\/TinyColor\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"8\" data-component=\"Inline links\" data-count=\"15\">Work with colour values<\/a><\/h3>\n<p>Vi\u1ec7c chuy\u1ec3n \u0111\u1ed5i c\u00e1c gi\u00e1 tr\u1ecb m\u00e0u t\u1eeb m\u1ed9t \u0111\u1ecbnh d\u1ea1ng n\u00e0y th\u00e0nh m\u1ed9t \u0111\u1ecbnh d\u1ea1ng kh\u00e1c l\u00e0 m\u1ed9t trong c\u00e1c t\u00e1c v\u1ee5 m\u00e0 m\u1ecdi nh\u00e0 ph\u00e1t tri\u1ec3n giao di\u1ec7n ng\u01b0\u1eddi d\u00f9ng c\u1ea7n th\u1ef1c hi\u1ec7n m\u1ed9t l\u1ea7n trong m\u1ed9t th\u1eddi gian. TinyColor2 x\u1eed l\u00fd v\u1ea5n \u0111\u1ec1 n\u00e0y, v\u00e0 n\u00f3 c\u00f3 s\u1eb5n cho Node.js c\u0169ng nh\u01b0 cho c\u00e1c tr\u00ecnh duy\u1ec7t. N\u00f3 cung c\u1ea5p m\u1ed9t t\u1eadp h\u1ee3p c\u00e1c ph\u01b0\u01a1ng ph\u00e1p chuy\u1ec3n \u0111\u1ed5i (v\u00ed d\u1ee5: toHexString (), toRGBString ()), c\u0169ng nh\u01b0 c\u00e1c ph\u01b0\u01a1ng th\u1ee9c cho t\u1ea5t c\u1ea3 c\u00e1c lo\u1ea1i ho\u1ea1t \u0111\u1ed9ng m\u00e0u (v\u00ed d\u1ee5: lighten (), saturate (), complement ()).<\/p>\n<h3 id=\"07-generate-pdf-files\">07.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/devongovett\/pdfkit\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"9\" data-component=\"Inline links\" data-count=\"15\">Generate PDF files<\/a><\/h3>\n<p>B\u1ea1n mu\u1ed1n t\u1ef1 \u0111\u1ed9ng t\u1ea1o t\u1ec7p PDF? , PDFKit gi\u00fap b\u1ea1n l\u00e0m \u0111\u01b0\u1ee3c \u0111i\u1ec1u n\u00e0y. N\u00f3 h\u1ed7 tr\u1ee3 nh\u00fang c\u00e1c ki\u1ec3u ph\u00f4ng ch\u1eef, nh\u00fang h\u00ecnh \u1ea3nh v\u00e0 \u0111\u1ecbnh ngh\u0129a \u0111\u1ed3 h\u1ecda vector, ho\u1eb7c theo l\u1eadp tr\u00ecnh (s\u1eed d\u1ee5ng API gi\u1ed1ng Canvas) ho\u1eb7c b\u1eb1ng c\u00e1ch ch\u1ec9 \u0111\u1ecbnh \u0111\u01b0\u1eddng d\u1eabn SVG. H\u01a1n n\u1eefa, b\u1ea1n c\u00f3 th\u1ec3 x\u00e1c \u0111\u1ecbnh li\u00ean k\u1ebft, bao g\u1ed3m ghi ch\u00fa, \u0111\u00e1nh d\u1ea5u v\u0103n b\u1ea3n v\u00e0 h\u01a1n th\u1ebf n\u1eefa.<\/p>\n<h3 id=\"08-process-html-files\">08.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/cheeriojs\/cheerio\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"11\" data-component=\"Inline links\" data-count=\"15\">Process HTML files<\/a><\/h3>\n<p>B\u1ea1n c\u00f3 mu\u1ed1n x\u1eed l\u00fd m\u00e3 HTML \u1edf ph\u00eda m\u00e1y ch\u1ee7 v\u00e0 b\u1ecf qua c\u00e1c ph\u01b0\u01a1ng th\u1ee9c ti\u1ec7n \u00edch jQuery kh\u00f4ng? ThenCheerio gi\u00fap b\u1ea1n l\u00e0m \u0111i\u1ec1u n\u00e0y. M\u1eb7c d\u00f9 n\u00f3 ch\u1ec9 th\u1ef1c hi\u1ec7n m\u1ed9t t\u1eadp h\u1ee3p con c\u1ee7a th\u01b0 vi\u1ec7n jQuery c\u1ed1t l\u00f5i, n\u00f3 l\u00e0m cho vi\u1ec7c x\u1eed l\u00fd HTML \u1edf ph\u00eda m\u00e1y ch\u1ee7 d\u1ec5 d\u00e0ng h\u01a1n nhi\u1ec1u. N\u00f3 \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng tr\u00ean \u0111\u1ea7u trang c\u1ee7a m\u00f4-\u0111un htmlparser2, ph\u00e2n t\u00edch c\u00fa ph\u00e1p HTML, XML v\u00e0 RSS. Th\u00eam v\u00e0o \u0111\u00f3, theo ti\u00eau chu\u1ea9n, n\u00f3 nhanh g\u1ea5p t\u00e1m l\u1ea7n jsdom, m\u1ed9t m\u00f4 \u0111un kh\u00e1c \u0111\u1ec3 l\u00e0m vi\u1ec7c v\u1edbi DOM \u1edf ph\u00eda m\u00e1y ch\u1ee7.<\/p>\n<h3 id=\"09-process-csv-files\">09.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/wdavidw\/node-csv\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"14\" data-component=\"Inline links\" data-count=\"15\">Process CSV files<\/a><\/h3>\n<p>\u0110\u1ecbnh d\u1ea1ng CSV (gi\u00e1 tr\u1ecb \u0111\u01b0\u1ee3c ph\u00e2n c\u00e1ch b\u1eb1ng d\u1ea5u ph\u1ea9y) th\u01b0\u1eddng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng khi trao \u0111\u1ed5i d\u1eef li\u1ec7u d\u1ef1a tr\u00ean b\u1ea3ng. V\u00ed d\u1ee5, Microsoft Excel cho ph\u00e9p b\u1ea1n xu\u1ea5t ho\u1eb7c nh\u1eadp d\u1eef li\u1ec7u c\u1ee7a b\u1ea1n \u1edf \u0111\u1ecbnh d\u1ea1ng \u0111\u00f3. node-cvg gi\u00fap \u0111\u01a1n gi\u1ea3n h\u00f3a qu\u00e1 tr\u00ecnh l\u00e0m vi\u1ec7c v\u1edbi d\u1eef li\u1ec7u CSV trong JavaScript v\u00e0 cung c\u1ea5p c\u00e1c ch\u1ee9c n\u0103ng \u0111\u1ec3 t\u1ea1o, ph\u00e2n t\u00edch c\u00fa ph\u00e1p, chuy\u1ec3n \u0111\u1ed5i v\u00e0 x\u00e2u chu\u1ed7i CSV. N\u00f3 \u0111i k\u00e8m v\u1edbi m\u1ed9t API g\u1ecdi l\u1ea1i, API lu\u1ed3ng v\u00e0 API \u0111\u1ed3ng b\u1ed9, do \u0111\u00f3 b\u1ea1n c\u00f3 th\u1ec3 ch\u1ecdn ki\u1ec3u b\u1ea1n th\u00edch.<\/p>\n<h3 id=\"10-process-markdown-files\">10.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/chjj\/marked\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"15\" data-component=\"Inline links\" data-count=\"15\">Process markdown files<\/a><\/h3>\n<p>\u0110\u00e1nh d\u1ea5u l\u00e0 m\u1ed9t \u0111\u1ecbnh d\u1ea1ng ph\u1ed5 bi\u1ebfn khi t\u1ea1o n\u1ed9i dung cho web. N\u1ebfu b\u1ea1n mu\u1ed1n x\u1eed l\u00fd n\u1ed9i dung markdown theo ch\u01b0\u01a1ng tr\u00ecnh (t\u1ee9c l\u00e0 vi\u1ebft tr\u00ecnh so\u1ea1n th\u1ea3o markdown c\u1ee7a ri\u00eang b\u1ea1n), \u0111\u00e1nh d\u1ea5u l\u00e0 \u0111\u00e1ng xem. Ph\u1ea3i m\u1ea5t m\u1ed9t chu\u1ed7i m\u00e3 markdown l\u00e0m \u0111\u1ea7u v\u00e0o v\u00e0 xu\u1ea5t ra m\u00e3 HTML th\u00edch h\u1ee3p. Th\u1eadm ch\u00ed c\u00f3 th\u1ec3 t\u00f9y ch\u1ec9nh th\u00eam \u0111\u1ea7u ra HTML \u0111\u00f3 b\u1eb1ng c\u00e1ch cung c\u1ea5p c\u00e1c tr\u00ecnh k\u1ebft xu\u1ea5t t\u00f9y ch\u1ec9nh.<\/p>\n<h3 id=\"11-minify-images\">11.\u00a0<a href=\"https:\/\/github.com\/imagemin\/imagemin\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"1\" data-component=\"Inline links\" data-count=\"15\">Minify images<\/a><\/h3>\n<p>M\u1ed9t m\u00f4-\u0111un r\u1ea5t t\u1ed1t \u0111\u1ec3 thu nh\u1ecf v\u00e0 t\u1ed1i \u01b0u h\u00f3a h\u00ecnh \u1ea3nh l\u00e0 imagemin, c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng theo ch\u01b0\u01a1ng tr\u00ecnh (th\u00f4ng qua d\u00f2ng l\u1ec7nh), nh\u01b0 m\u1ed9t plugin gulp ho\u1eb7c Grunt, ho\u1eb7c th\u00f4ng qua imagemin-app (m\u1ed9t \u1ee9ng d\u1ee5ng \u0111\u1ed3 h\u1ecda c\u00f3 s\u1eb5n cho t\u1ea5t c\u1ea3 ba h\u1ec7 \u0111i\u1ec1u h\u00e0nh l\u1edbn). Ki\u1ebfn tr\u00fac d\u1ef1a tr\u00ean plugin c\u1ee7a n\u00f3 c\u00f3 ngh\u0129a l\u00e0 n\u00f3 c\u0169ng r\u1ea5t linh ho\u1ea1t v\u00e0 c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c m\u1edf r\u1ed9ng \u0111\u1ec3 h\u1ed7 tr\u1ee3 c\u00e1c \u0111\u1ecbnh d\u1ea1ng h\u00ecnh \u1ea3nh m\u1edbi.<\/p>\n<h3 id=\"12-minify-html\">12.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/kangax\/html-minifier\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"2\" data-component=\"Inline links\" data-count=\"15\">Minify HTML<\/a><\/h3>\n<p>Sau khi r\u00fat g\u1ecdn h\u00ecnh \u1ea3nh, b\u1ea1n n\u00ean xem x\u00e9t gi\u1ea3m thi\u1ec3u HTML c\u1ee7a \u1ee9ng d\u1ee5ng web c\u1ee7a m\u00ecnh. Module HTMLMinifier c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng th\u00f4ng qua d\u00f2ng l\u1ec7nh, nh\u01b0ng c\u0169ng c\u00f3 s\u1eb5n cho gulp v\u00e0 Grunt. Tr\u00ean h\u1ebft, c\u00f3 c\u00e1c gi\u1ea3i ph\u00e1p ph\u1ea7n m\u1ec1m trung gian \u0111\u1ec3 t\u00edch h\u1ee3p n\u00f3 v\u00e0o c\u00e1c khung c\u00f4ng t\u00e1c web nh\u01b0 Koa v\u00e0 Express, v\u00ec v\u1eady b\u1ea1n c\u00f3 th\u1ec3 r\u00fat ng\u1eafn HTML tr\u1ef1c ti\u1ebfp trong th\u1eddi gian ch\u1ea1y tr\u01b0\u1edbc khi ph\u00e2n ph\u1ed1i n\u00f3 cho kh\u00e1ch h\u00e0ng th\u00f4ng qua HTTP. Theo ti\u00eau chu\u1ea9n tr\u00ean trang ch\u1ee7 c\u1ee7a m\u00f4-\u0111un, \u0111\u00f3 l\u00e0 tr\u00ecnh ch\u1ec9nh s\u1eeda HTML t\u1ed1t nh\u1ea5t hi\u1ec7n<\/p>\n<h3 id=\"13-minify-css\">13.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/jakubpawlowicz\/clean-css\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"3\" data-component=\"Inline links\" data-count=\"15\">Minify CSS<\/a><\/h3>\n<p>C\u0169ng nh\u01b0 h\u00ecnh \u1ea3nh v\u00e0 HTML, b\u1ea1n n\u00ean c\u00e2n nh\u1eafc vi\u1ec7c r\u00fat g\u1ecdn CSS b\u1ea1n g\u1eedi cho ng\u01b0\u1eddi d\u00f9ng. M\u1ed9t m\u00f4-\u0111un r\u1ea5t nhanh trong l\u0129nh v\u1ef1c n\u00e0y l\u00e0 clean-css, c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng c\u1ea3 t\u1eeb d\u00f2ng l\u1ec7nh v\u00e0 l\u1eadp tr\u00ecnh. N\u00f3 \u0111i k\u00e8m v\u1edbi s\u1ef1 h\u1ed7 tr\u1ee3 cho c\u00e1c b\u1ea3n \u0111\u1ed3 ngu\u1ed3n v\u00e0 c\u0169ng cung c\u1ea5p c\u00e1c ch\u1ebf \u0111\u1ed9 t\u01b0\u01a1ng th\u00edch kh\u00e1c nhau \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o CSS \u0111\u01b0\u1ee3c r\u00fat g\u1ecdn t\u01b0\u01a1ng th\u00edch v\u1edbi c\u00e1c phi\u00ean b\u1ea3n c\u0169 h\u01a1n c\u1ee7a IE.<\/p>\n<h3 id=\"14-minify-javascript\">14.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/mishoo\/UglifyJS2\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"4\" data-component=\"Inline links\" data-count=\"15\">Minify JavaScript<\/a><\/h3>\n<p>M\u00f4-\u0111un ph\u1ed5 bi\u1ebfn UglifyJS2 th\u01b0\u1eddng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 gi\u1ea3m thi\u1ec3u m\u00e3 JavaScript, nh\u01b0ng v\u00ec c\u00e1c t\u00ednh n\u0103ng ph\u00e2n t\u00edch c\u00fa ph\u00e1p c\u1ee7a n\u00f3, v\u1ec1 nguy\u00ean t\u1eafc b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng n\u00f3 \u0111\u1ec3 l\u00e0m b\u1ea5t c\u1ee9 \u0111i\u1ec1u g\u00ec li\u00ean quan \u0111\u1ebfn vi\u1ec7c x\u1eed l\u00fd m\u00e3 JavaScript. UglifyJS2 ph\u00e2n t\u00edch m\u00e3 JavaScript th\u00e0nh m\u1ed9t c\u00e2y c\u00fa ph\u00e1p tr\u1eebu t\u01b0\u1ee3ng (m\u1ed9t m\u00f4 h\u00ecnh \u0111\u1ed1i t\u01b0\u1ee3ng \u0111\u1ea1i di\u1ec7n cho m\u00e3) v\u00e0 cung c\u1ea5p m\u1ed9t th\u00e0nh ph\u1ea7n khung \u0111i b\u1ed9 c\u00e2y c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 \u0111i qua c\u00e2y \u0111\u00f3. B\u1ea1n \u0111\u00e3 t\u1eebng mu\u1ed1n vi\u1ebft tr\u00ecnh t\u1ed1i \u01b0u h\u00f3a JavaScript c\u1ee7a ri\u00eang m\u00ecnh ch\u01b0a? Sau \u0111\u00f3, UglifyJS2 l\u00e0 d\u00e0nh cho b\u1ea1n.<\/p>\n<h3 id=\"15-minify-svg\">15.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/svg\/svgo\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"5\" data-component=\"Inline links\" data-count=\"15\">Minify SVG<\/a><\/h3>\n<p>Cu\u1ed1i c\u00f9ng nh\u01b0ng kh\u00f4ng k\u00e9m ph\u1ea7n quan tr\u1ecdng khi n\u00f3i \u0111\u1ebfn vi\u1ec7c r\u00fat g\u1ecdn, \u0111\u1eebng qu\u00ean gi\u1ea3m thi\u1ec3u n\u1ed9i dung SVG. \u0110\u1ecbnh d\u1ea1ng n\u00e0y \u0111\u00e3 t\u1ea1o ra s\u1ef1 tr\u1edf l\u1ea1i tuy\u1ec7t v\u1eddi trong v\u00e0i n\u0103m qua nh\u1edd c\u00f3 h\u1ed7 tr\u1ee3 c\u00f4ng c\u1ee5 v\u00e0 tr\u00ecnh duy\u1ec7t tuy\u1ec7t v\u1eddi c\u1ee7a n\u00f3. Th\u1eadt kh\u00f4ng may, n\u1ed9i dung SVG \u0111\u01b0\u1ee3c t\u1ea1o ra b\u1edfi c\u00e1c bi\u00ean t\u1eadp vi\u00ean th\u01b0\u1eddng ch\u1ee9a th\u00f4ng tin d\u01b0 th\u1eeba v\u00e0 v\u00f4 d\u1ee5ng nh\u01b0 b\u00ecnh lu\u1eadn v\u00e0 si\u00eau d\u1eef li\u1ec7u.<\/p>\n<p>V\u1edbi SVGO, b\u1ea1n c\u00f3 th\u1ec3 d\u1ec5 d\u00e0ng x\u00f3a th\u00f4ng tin \u0111\u00f3 v\u00e0 t\u1ea1o m\u1ed9t phi\u00ean b\u1ea3n r\u00fat g\u1ecdn c\u1ee7a n\u1ed9i dung SVG c\u1ee7a b\u1ea1n. M\u00f4-\u0111un c\u00f3 ki\u1ebfn tr\u00fac d\u1ef1a tr\u00ean plugin, v\u1edbi (g\u1ea7n nh\u01b0) m\u1ecdi t\u1ed1i \u01b0u h\u00f3a \u0111\u01b0\u1ee3c tri\u1ec3n khai d\u01b0\u1edbi d\u1ea1ng m\u1ed9t plugin ri\u00eang bi\u1ec7t. Nh\u01b0 v\u1edbi t\u1ea5t c\u1ea3 c\u00e1c m\u00f4-\u0111un kh\u00e1c v\u1ec1 vi\u1ec7c r\u00fat g\u1ecdn, SVGO c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng th\u00f4ng qua d\u00f2ng l\u1ec7nh ho\u1eb7c l\u1eadp tr\u00ecnh.<\/p>\n<h3 id=\"16-log-application-output\">16.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/winstonjs\/winston\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"6\" data-component=\"Inline links\" data-count=\"15\">Log application output<\/a><\/h3>\n<p>Khi b\u1ea1n \u0111ang x\u1eed l\u00fd c\u00e1c \u1ee9ng d\u1ee5ng web ph\u1ee9c t\u1ea1p, m\u1ed9t th\u01b0 vi\u1ec7n \u0111\u0103ng nh\u1eadp th\u00edch h\u1ee3p c\u00f3 th\u1ec3 r\u1ea5t h\u1eefu \u00edch \u0111\u1ec3 gi\u00fap b\u1ea1n t\u00ecm ra c\u00e1c v\u1ea5n \u0111\u1ec1 th\u1eddi gian ch\u1ea1y, c\u1ea3 trong qu\u00e1 tr\u00ecnh ph\u00e1t tri\u1ec3n v\u00e0 trong s\u1ea3n xu\u1ea5t. M\u1ed9t m\u00f4-\u0111un r\u1ea5t ph\u1ed5 bi\u1ebfn trong l\u0129nh v\u1ef1c n\u00e0y l\u00e0 th\u01b0 vi\u1ec7n winston. N\u00f3 h\u1ed7 tr\u1ee3 nhi\u1ec1u ph\u01b0\u01a1ng ti\u1ec7n, c\u00f3 ngh\u0129a l\u00e0 b\u1ea1n c\u00f3 th\u1ec3 n\u00f3i winston ch\u1ec9 c\u1ea7n \u0111\u0103ng nh\u1eadp v\u00e0o giao di\u1ec7n \u0111i\u1ec1u khi\u1ec3n, nh\u01b0ng c\u0169ng l\u01b0u tr\u1eef nh\u1eadt k\u00fd trong c\u00e1c t\u1ec7p ho\u1eb7c trong c\u01a1 s\u1edf d\u1eef li\u1ec7u (nh\u01b0 CouchDB, MongoDB ho\u1eb7c Redis) ho\u1eb7c th\u1eadm ch\u00ed truy\u1ec1n ch\u00fang t\u1edbi \u0111i\u1ec3m cu\u1ed1i HTTP \u0111\u1ec3 x\u1eed l\u00fd ti\u1ebfp.<\/p>\n<h3 id=\"17-generate-fake-data\">17.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/Marak\/Faker.js\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"7\" data-component=\"Inline links\" data-count=\"15\">Generate fake data<\/a><\/h3>\n<p>Khi tri\u1ec3n khai ho\u1eb7c th\u1eed nghi\u1ec7m giao di\u1ec7n ng\u01b0\u1eddi d\u00f9ng, b\u1ea1n th\u01b0\u1eddng c\u1ea7n d\u1eef li\u1ec7u gi\u1ea3 nh\u01b0 \u0111\u1ecba ch\u1ec9 email, t\u00ean ng\u01b0\u1eddi d\u00f9ng, \u0111\u1ecba ch\u1ec9 \u0111\u01b0\u1eddng ph\u1ed1 v\u00e0 s\u1ed1 \u0111i\u1ec7n tho\u1ea1i. \u0110\u00f3 l\u00e0 n\u01a1i faker.js xu\u1ea5t hi\u1ec7n. \u0110i\u1ec1u n\u00e0y c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u1edf ph\u00eda m\u00e1y ch\u1ee7 (nh\u01b0 m\u1ed9t m\u00f4 \u0111un cho Node.js) ho\u1eb7c \u1edf ph\u00eda m\u00e1y kh\u00e1ch v\u00e0 cung c\u1ea5p m\u1ed9t t\u1eadp h\u1ee3p c\u00e1c ph\u01b0\u01a1ng th\u1ee9c \u0111\u1ec3 t\u1ea1o ra d\u1eef li\u1ec7u gi\u1ea3. C\u1ea7n m\u1ed9t t\u00ean ng\u01b0\u1eddi d\u00f9ng? Ch\u1ec9 c\u1ea7n g\u1ecdi faker.internet.userName () v\u00e0 b\u1ea1n nh\u1eadn \u0111\u01b0\u1ee3c m\u1ed9t ng\u1eabu nhi\u00ean. C\u1ea7n m\u1ed9t t\u00ean c\u00f4ng ty gi\u1ea3 m\u1ea1o? G\u1ecdi faker.company.companyName () v\u00e0 b\u1ea1n nh\u1eadn \u0111\u01b0\u1ee3c m\u1ed9t c\u00e1i. V\u00e0 c\u00f3 nhi\u1ec1u ph\u01b0\u01a1ng ph\u00e1p h\u01a1n cho t\u1ea5t c\u1ea3 c\u00e1c lo\u1ea1i d\u1eef li\u1ec7u.<\/p>\n<h3 id=\"18-send-emails\">18.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/nodemailer\/nodemailer\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"8\" data-component=\"Inline links\" data-count=\"15\">Send emails<\/a><\/h3>\n<p>G\u1eedi email theo ch\u01b0\u01a1ng tr\u00ecnh l\u00e0 m\u1ed9t trong nh\u1eefng t\u00ednh n\u0103ng b\u1ea1n c\u1ea7n th\u01b0\u1eddng xuy\u00ean khi tri\u1ec3n khai trang web. T\u1eeb x\u00e1c nh\u1eadn \u0111\u0103ng k\u00fd, \u0111\u1ec3 th\u00f4ng b\u00e1o cho ng\u01b0\u1eddi d\u00f9ng v\u1ec1 c\u00e1c s\u1ef1 ki\u1ec7n \u0111\u1eb7c bi\u1ec7t ho\u1eb7c g\u1eedi b\u1ea3n tin, c\u00f3 r\u1ea5t nhi\u1ec1u tr\u01b0\u1eddng h\u1ee3p s\u1eed d\u1ee5ng y\u00eau c\u1ea7u b\u1ea1n li\u00ean l\u1ea1c v\u1edbi ng\u01b0\u1eddi d\u00f9ng.<\/p>\n<p>API Node.js chu\u1ea9n kh\u00f4ng cung c\u1ea5p t\u00ednh n\u0103ng nh\u01b0 v\u1eady, nh\u01b0ng may m\u1eafn thay, m\u00f4-\u0111un Nodemailer l\u1ea5p \u0111\u1ea7y kho\u1ea3ng tr\u1ed1ng n\u00e0y. N\u00f3 h\u1ed7 tr\u1ee3 c\u1ea3 n\u1ed9i dung v\u0103n b\u1ea3n v\u00e0 HTML, h\u00ecnh \u1ea3nh nh\u00fang v\u00e0 &#8211; quan tr\u1ecdng nh\u1ea5t &#8211; n\u00f3 s\u1eed d\u1ee5ng giao th\u1ee9c SSL \/ STARTTLS an to\u00e0n.<\/p>\n<h3 id=\"19-create-rest-apis\">19.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/restify\/node-restify\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"9\" data-component=\"Inline links\" data-count=\"15\">Create REST APIs<\/a><\/h3>\n<p>REST l\u00e0 chu\u1ea9n th\u1ef1c t\u1ebf khi tri\u1ec3n khai c\u00e1c \u1ee9ng d\u1ee5ng web s\u1eed d\u1ee5ng c\u00e1c d\u1ecbch v\u1ee5 web. C\u00e1c khung nh\u01b0 Express t\u1ea1o thu\u1eadn l\u1ee3i cho vi\u1ec7c t\u1ea1o ra c\u00e1c d\u1ecbch v\u1ee5 web nh\u01b0 v\u1eady, nh\u01b0ng th\u01b0\u1eddng \u0111i k\u00e8m v\u1edbi r\u1ea5t nhi\u1ec1u t\u00ednh n\u0103ng nh\u01b0 t\u1ea1o khu\u00f4n m\u1eabu v\u00e0 hi\u1ec3n th\u1ecb &#8211; t\u00f9y thu\u1ed9c v\u00e0o tr\u01b0\u1eddng h\u1ee3p s\u1eed d\u1ee5ng &#8211; b\u1ea1n c\u00f3 th\u1ec3 kh\u00f4ng c\u1ea7n. M\u1eb7t kh\u00e1c, m\u00f4-\u0111un Node.js t\u1eadp trung v\u00e0o vi\u1ec7c t\u1ea1o v\u00e0 g\u1ee1 r\u1ed1i c\u00e1c API REST. N\u00f3 c\u00f3 m\u1ed9t API r\u1ea5t gi\u1ed1ng v\u1edbi ph\u1ea7n m\u1ec1m k\u1ebft n\u1ed1i trung gian (l\u00e0 c\u01a1 s\u1edf cho Express) nh\u01b0ng cho ph\u00e9p b\u1ea1n ki\u1ec3m so\u00e1t nhi\u1ec1u h\u01a1n c\u00e1c t\u01b0\u01a1ng t\u00e1c HTTP v\u00e0 c\u0169ng h\u1ed7 tr\u1ee3 DTrace \u0111\u1ec3 g\u1ee1 r\u1ed1i c\u00e1c \u1ee9ng d\u1ee5ng trong th\u1eddi gian th\u1ef1c.<\/p>\n<h3 id=\"20-create-cli-applications\">20.\u00a0<a class=\"hawk-link-parsed\" href=\"https:\/\/github.com\/tj\/commander.js\/\" target=\"_blank\" rel=\"noopener\" data-track-type=\"click\" data-index=\"10\" data-component=\"Inline links\" data-count=\"15\">Create CLI applications<\/a><\/h3>\n<p>\u0110\u00e3 c\u00f3 h\u00e0ng t\u1ea5n c\u00e1c \u1ee9ng d\u1ee5ng d\u00f2ng l\u1ec7nh (c\u00e1c \u1ee9ng d\u1ee5ng CLI) \u0111\u01b0\u1ee3c vi\u1ebft b\u1eb1ng Node.js \u0111\u1ec3 x\u1eed l\u00fd c\u00e1c tr\u01b0\u1eddng h\u1ee3p s\u1eed d\u1ee5ng kh\u00e1c nhau (xem, v\u00ed d\u1ee5, c\u00e1c m\u00f4-\u0111un n\u00f3i tr\u00ean \u0111\u1ec3 r\u00fat g\u1ecdn). N\u1ebfu b\u1ea1n mu\u1ed1n vi\u1ebft \u1ee9ng d\u1ee5ng CLI c\u1ee7a ri\u00eang m\u00ecnh, m\u00f4-\u0111un Commander.js l\u00e0 m\u1ed9t \u0111i\u1ec3m kh\u1edfi \u0111\u1ea7u r\u1ea5t t\u1ed1t. N\u00f3 cung c\u1ea5p m\u1ed9t API th\u00f4ng th\u1ea1o \u0111\u1ec3 x\u00e1c \u0111\u1ecbnh c\u00e1c kh\u00eda c\u1ea1nh kh\u00e1c nhau c\u1ee7a c\u00e1c \u1ee9ng d\u1ee5ng CLI nh\u01b0 c\u00e1c l\u1ec7nh, t\u00f9y ch\u1ecdn, b\u00ed danh, tr\u1ee3 gi\u00fap v\u00e0 nhi\u1ec1u th\u1ee9 kh\u00e1c, v\u00e0 n\u00f3 th\u1ef1c s\u1ef1 \u0111\u01a1n gi\u1ea3n h\u00f3a qu\u00e1 tr\u00ecnh t\u1ea1o \u1ee9ng d\u1ee5ng cho d\u00f2ng l\u1ec7nh.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Xin ch\u00e0o m\u1ecdi ng\u01b0\u1eddi H\u00f4m nay m\u00ecnh s\u1ebd gi\u1edbi thi\u1ec7u cho m\u1ecdi ng\u01b0\u1eddi 20 modules c\u1ee7a node m\u00e0 b\u1ea1n c\u1ea7n ph\u1ea3i bi\u1ebft \u0111\u1ec3 \u00e1p d\u1ee5ng v\u00e0o c\u00f4ng vi\u1ec7c: 01.\u00a0Manipulate images GraphicsMagick v\u00e0 ImageMagick l\u00e0 hai c\u00f4ng c\u1ee5 ph\u1ed5 bi\u1ebfn \u0111\u1ec3 t\u1ea1o, ch\u1ec9nh s\u1eeda, so\u1ea1n v\u00e0 chuy\u1ec3n \u0111\u1ed5i h\u00ecnh \u1ea3nh. Nh\u1edd c\u00f3 m\u00f4-\u0111un Node.js, b\u1ea1n c\u00f3 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":248,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[38,33],"tags":[90,89,88,95,94,93,86,58,87,91,92],"class_list":{"0":"post-247","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-node-js","8":"category-node-js-angular-js","9":"tag-format-dates-node-js","10":"tag-generate-sprite-sheets-node-js","11":"tag-manipulate-images-node-js","12":"tag-minify-css-node-js","13":"tag-minify-html-node-js","14":"tag-minify-javascript-node-js","15":"tag-module-can-thiet-cho-node-js","16":"tag-node-js","17":"tag-process-images-node-js","18":"tag-validate-strings-node-js","19":"tag-work-with-colour-values-node-js"},"_links":{"self":[{"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/posts\/247","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/comments?post=247"}],"version-history":[{"count":1,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/posts\/247\/revisions"}],"predecessor-version":[{"id":249,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/posts\/247\/revisions\/249"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/media\/248"}],"wp:attachment":[{"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/media?parent=247"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/categories?post=247"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/tags?post=247"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}