{"id":93943,"date":"2025-12-30T17:08:31","date_gmt":"2025-12-30T10:08:31","guid":{"rendered":"https:\/\/itviec.com\/blog\/?p=93943"},"modified":"2025-12-30T17:08:33","modified_gmt":"2025-12-30T10:08:33","slug":"huong-dan-npm-link","status":"publish","type":"post","link":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/","title":{"rendered":"NPM link: C\u00e1ch s\u1eed d\u1ee5ng, l\u1ee3i \u00edch v\u00e0 l\u01b0u \u00fd quan tr\u1ecdng"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">N\u1ed9i dung b\u00e0i vi\u1ebft<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#Npm_link_la_gi\" >Npm link l\u00e0 g\u00ec?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#Huong_dan_cach_thiet_lap_npm_link_cho_package_cua_ban\" >H\u01b0\u1edbng d\u1eabn c\u00e1ch thi\u1ebft l\u1eadp npm link cho package c\u1ee7a b\u1ea1n<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#Vi_du_thuc_te_ve_cach_dung_npm_link\" >V\u00ed d\u1ee5 th\u1ef1c t\u1ebf v\u1ec1 c\u00e1ch d\u00f9ng npm link<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#Mot_so_loi_thuong_gap_khi_su_dung_npm_link\" >M\u1ed9t s\u1ed1 l\u1ed7i th\u01b0\u1eddng g\u1eb7p khi s\u1eed d\u1ee5ng npm link<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#Go_lien_ket_unlinking_trong_npm\" >G\u1ee1 li\u00ean k\u1ebft (unlinking) trong npm<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#Vi_du_ve_unlinking\" >V\u00ed d\u1ee5 v\u1ec1 unlinking<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#Cac_cau_hoi_thuong_gap_ve_npm_link\" >C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 npm link<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#Tong_ket\" >T\u1ed5ng k\u1ebft<\/a><\/li><\/ul><\/nav><\/div>\n\n<p><strong><em>npm link l\u00e0 l\u1ec7nh trong npm d\u00f9ng \u0111\u1ec3 t\u1ea1o m\u1ed9t li\u00ean k\u1ebft symlink gi\u1eefa m\u1ed9t package c\u1ee5c b\u1ed9 v\u00e0 d\u1ef1 \u00e1n \u0111ang s\u1eed d\u1ee5ng n\u00f3, gi\u00fap b\u1ea1n ph\u00e1t tri\u1ec3n v\u00e0 th\u1eed nghi\u1ec7m th\u01b0 vi\u1ec7n theo th\u1eddi gian th\u1ef1c m\u00e0 kh\u00f4ng c\u1ea7n publish l\u00ean npm registry. \u0110\u00e2y l\u00e0 c\u00f4ng c\u1ee5 c\u1ef1c k\u1ef3 h\u1eefu \u00edch khi b\u1ea1n mu\u1ed1n ch\u1ec9nh s\u1eeda package local v\u00e0 quan s\u00e1t ngay l\u1eadp t\u1ee9c thay \u0111\u1ed5i trong project.<\/em><\/strong><\/p>\n\n\n\n<p>\u0110\u1ecdc b\u00e0i vi\u1ebft sau \u0111\u1ec3 \u0111\u01b0\u1ee3c gi\u1ea3i \u0111\u00e1p chi ti\u1ebft h\u01a1n v\u1ec1:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>npm link l\u00e0 g\u00ec v\u00e0 ho\u1ea1t \u0111\u1ed9ng th\u1ebf n\u00e0o?<\/li>\n\n\n\n<li>H\u01b0\u1edbng d\u1eabn c\u00e1ch c\u00e0i \u0111\u1eb7t li\u00ean k\u1ebft (link) cho package.\u00a0<\/li>\n\n\n\n<li>H\u01b0\u1edbng d\u1eabn chi ti\u1ebft c\u00e1ch s\u1eed d\u1ee5ng npm link.<\/li>\n\n\n\n<li>M\u1ed9t s\u1ed1 v\u00ed d\u1ee5 th\u1ef1c t\u1ebf v\u1ec1 npm link trong l\u1eadp tr\u00ecnh.<\/li>\n\n\n\n<li>C\u00e1c l\u1ed7i th\u01b0\u1eddng g\u1eb7p khi s\u1eed d\u1ee5ng npm link.<\/li>\n\n\n\n<li>So s\u00e1nh s\u1ef1 kh\u00e1c bi\u1ec7t gi\u1eefa npm link vs unlinking.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>\u0110\u1ecdc chi ti\u1ebft: <strong><a href=\"https:\/\/itviec.com\/blog\/npm-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">NPM l\u00e0 g\u00ec: Kh\u00e1i ni\u1ec7m, l\u1ec7nh v\u00e0 thao t\u00e1c c\u01a1 b\u1ea3n v\u1edbi NPM<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-npm-link-la-gi\"><span class=\"ez-toc-section\" id=\"Npm_link_la_gi\"><\/span><strong>Npm link l\u00e0 g\u00ec?<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>npm link \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o m\u1ed9t symlink t\u1edbi to\u00e0n b\u1ed9 th\u01b0 m\u1ee5c package g\u1ed1c (n\u01a1i c\u00f3 package.json) v\u00e0 th\u01b0 m\u1ee5c node_modules c\u1ee7a \u1ee9ng d\u1ee5ng, m\u00e0 kh\u00f4ng quan t\u00e2m th\u01b0 m\u1ee5c dist hay th\u01b0 m\u1ee5c main.<\/p>\n\n\n\n<p>Khi t\u1ea1o c\u00e1c package NPM, b\u1ea1n s\u1ebd c\u1ea7n test n\u00f3 trong m\u1ed9t project kh\u00e1c \u0111\u1ec3 xem h\u00e0nh vi th\u1ef1c t\u1ebf khi \u0111\u01b0\u1ee3c d\u00f9ng l\u00e0m dependency. B\u1ea1n c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n \u0111i\u1ec1u n\u00e0y b\u1eb1ng c\u00e1ch publish package l\u00ean NPM r\u1ed3i c\u00e0i l\u1ea1i v\u00e0o project m\u1ed7i l\u1ea7n, ho\u1eb7c copy package tr\u1ef1c ti\u1ebfp v\u00e0o th\u01b0 m\u1ee5c node_modules c\u1ee7a project, nh\u01b0ng c\u1ea3 hai c\u00e1ch \u0111\u1ec1u ch\u1eadm v\u00e0 d\u1ec5 g\u00e2y l\u1ed7i.<\/p>\n\n\n\n<p>L\u00fac n\u00e0y, khi s\u1eed d\u1ee5ng npm link s\u1ebd gi\u00fap b\u1ea1n t\u1ed1i \u01b0u quy tr\u00ecnh b\u1eb1ng c\u00e1ch d\u00f9ng project local c\u1ee7a m\u00ecnh l\u00e0m dependency cho project kh\u00e1c m\u00e0 kh\u00f4ng c\u1ea7n ph\u1ea3i publish hay copy th\u1ee7 c\u00f4ng v\u00e0o node_modules.<\/p>\n\n\n\n<p><strong>L\u01b0u \u00fd: <\/strong>T\u1eeb npm v9 tr\u1edf \u0111i, npm link KH\u00d4NG t\u1ef1 \u0111\u1ed9ng th\u00eam dependency v\u00e0o package.json. N\u00f3 ch\u1ec9 t\u1ea1o symlink trong node_modules, nh\u01b0ng kh\u00f4ng ghi g\u00ec v\u00e0o package.json.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-h\u01b0\u1edbng-d\u1eabn-cach-thi\u1ebft-l\u1eadp-npm-link-cho-package-c\u1ee7a-b\u1ea1n\"><span class=\"ez-toc-section\" id=\"Huong_dan_cach_thiet_lap_npm_link_cho_package_cua_ban\"><\/span><strong>H\u01b0\u1edbng d\u1eabn c\u00e1ch thi\u1ebft l\u1eadp npm link cho package c\u1ee7a b\u1ea1n<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u0110\u1ec3 li\u00ean k\u1ebft m\u1ed9t package b\u1eb1ng npm link, b\u1ea1n ch\u1ec9 c\u1ea7n th\u1ef1c hi\u1ec7n hai b\u01b0\u1edbc \u0111\u01a1n gi\u1ea3n sau:<\/p>\n\n\n\n<p><strong>B\u01b0\u1edbc 1: <\/strong>V\u00e0o th\u01b0 m\u1ee5c package g\u1ed1c m\u00e0 b\u1ea1n mu\u1ed1n \u0111\u01b0\u1ee3c li\u00ean k\u1ebft v\u1edbi project kh\u00e1c (package n\u00e0y s\u1ebd \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng nh\u01b0 m\u1ed9t dependency cho project kh\u00e1c) v\u00e0 ch\u1ea1y l\u1ec7nh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm link<\/code><\/pre>\n\n\n\n<p>B\u01b0\u1edbc 2: V\u00e0o th\u01b0 m\u1ee5c c\u1ee7a project s\u1ebd s\u1eed d\u1ee5ng package c\u1ee7a b\u1ea1n nh\u01b0 m\u1ed9t dependency v\u00e0 ch\u1ea1y l\u1ec7nh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm link &lt;package-name&gt;<\/code><\/pre>\n\n\n\n<p>V\u1eady l\u00e0 xong. Sau khi li\u00ean k\u1ebft, b\u1ea1n c\u00f3 th\u1ec3 ch\u1ec9nh s\u1eeda v\u00e0 build package dependency c\u1ee7a m\u00ecnh trong khi project ch\u00ednh \u0111ang ch\u1ea1y, v\u00e0 c\u00e1c thay \u0111\u1ed5i s\u1ebd \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt t\u1ef1 \u0111\u1ed9ng, gi\u00fap b\u1ea1n debug m\u1ed9t c\u00e1ch ch\u00ednh x\u00e1c v\u00e0 hi\u1ec7u qu\u1ea3.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-vi-d\u1ee5-th\u1ef1c-t\u1ebf-v\u1ec1-cach-dung-npm-link\"><span class=\"ez-toc-section\" id=\"Vi_du_thuc_te_ve_cach_dung_npm_link\"><\/span><strong>V\u00ed d\u1ee5 th\u1ef1c t\u1ebf v\u1ec1 c\u00e1ch d\u00f9ng npm link<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Gi\u1ea3 s\u1eed ch\u00fang ta c\u00f3 hai th\u01b0 m\u1ee5c:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>web-logger \u2013 m\u1ed9t package NPM d\u00f9ng \u0111\u1ec3 hi\u1ec3n th\u1ecb log tr\u1ef1c ti\u1ebfp tr\u00ean giao di\u1ec7n, ti\u1ec7n cho vi\u1ec7c debug m\u00e0 kh\u00f4ng c\u1ea7n m\u1edf DevTools.<\/li>\n\n\n\n<li>test-react-application \u2013 m\u1ed9t \u1ee9ng d\u1ee5ng React t\u1ea1o b\u1eb1ng create-react-app\u00a0<\/li>\n<\/ul>\n\n\n\n<p>B\u1ea1n v\u00e0o project web-logger (s\u1ebd \u0111\u01b0\u1ee3c d\u00f9ng l\u00e0m dependency) v\u00e0 ch\u1ea1y l\u1ec7nh<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm link<\/code><\/pre>\n\n\n\n<p>Sau \u0111\u00f3, trong project test-react-application, ti\u1ebfp t\u1ee5c ch\u1ea1y:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm link @bsartori\/web-logger<\/code><\/pre>\n\n\n\n<p>Trong \u0111\u00f3:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>@bsartori\/web-logger l\u00e0 t\u00ean package c\u00f3 scope t\u1ed5 ch\u1ee9c.\u00a0<\/li>\n\n\n\n<li>Sau khi ch\u1ea1y l\u1ec7nh, b\u1ea1n s\u1ebd th\u1ea5y @bsartori\/web-logger b\u00ean trong th\u01b0 m\u1ee5c node_modules. Bi\u1ec3u t\u01b0\u1ee3ng th\u01b0 m\u1ee5c cho th\u1ea5y \u0111\u00e2y l\u00e0 m\u1ed9t symlink.<\/li>\n<\/ul>\n\n\n\n<p>Trong project test-react-application, ti\u1ebfn h\u00e0nh import dependency b\u1eb1ng l\u1ec7nh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import logger from '@bsartori\/web-logger';<\/code><\/pre>\n\n\n\n<p>L\u01b0u \u00fd r\u1eb1ng khi di chu\u1ed9t v\u00e0o t\u00ean dependency, b\u1ea1n c\u00f3 th\u1ec3 th\u1ea5y \u0111\u01b0\u1eddng d\u1eabn g\u1ed1c c\u1ee7a n\u00f3 (original pathname). Sau khi import dependency, b\u1ea1n ch\u1ec9 c\u1ea7n th\u1ef1c hi\u1ec7n m\u1ed9t s\u1ed1 c\u1ea5u h\u00ecnh m\u00e0 dependency y\u00eau c\u1ea7u v\u00e0 g\u1ecdi h\u00e0m logging c\u1ee7a m\u00ecnh. Cu\u1ed1i c\u00f9ng, l\u01b0u file v\u00e0 xem k\u1ebft qu\u1ea3 tr\u1ef1c ti\u1ebfp tr\u00ean tr\u00ecnh duy\u1ec7t c\u1ee7a b\u1ea1n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-m\u1ed9t-s\u1ed1-l\u1ed7i-th\u01b0\u1eddng-g\u1eb7p-khi-s\u1eed-d\u1ee5ng-npm-link\"><span class=\"ez-toc-section\" id=\"Mot_so_loi_thuong_gap_khi_su_dung_npm_link\"><\/span><strong>M\u1ed9t s\u1ed1 l\u1ed7i th\u01b0\u1eddng g\u1eb7p khi s\u1eed d\u1ee5ng npm link<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-l\u1ed7i-khi-dung-npm-link-v\u1edbi-react-multiple-instances-of-react\"><strong>L\u1ed7i khi d\u00f9ng npm link v\u1edbi React (multiple instances of React)<\/strong><\/h3>\n\n\n\n<p>Khi b\u1ea1n s\u1eed d\u1ee5ng npm link \u0111\u1ec3 ph\u00e1t tri\u1ec3n m\u1ed9t module c\u1ee5c b\u1ed9, v\u00e0 module \u0111\u00f3 khai b\u00e1o React d\u01b0\u1edbi d\u1ea1ng peer dependency, r\u1ea5t d\u1ec5 g\u1eb7p l\u1ed7i n\u1ed5i ti\u1ebfng: \u201cmultiple instances of React\u201d. D\u01b0\u1edbi \u0111\u00e2y l\u00e0 2 c\u00e1ch kh\u1eafc ph\u1ee5c:<\/p>\n\n\n\n<p><strong>C\u00e1ch 1: Li\u00ean k\u1ebft ng\u01b0\u1ee3c (back-link) dependency React c\u1ee7a module v\u1ec1 React c\u1ee7a \u1ee9ng d\u1ee5ng<\/strong><\/p>\n\n\n\n<p>Trong \u1ee9ng d\u1ee5ng n\u01a1i b\u1ea1n g\u1eb7p l\u1ed7i nhi\u1ec1u phi\u00ean b\u1ea3n React:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Truy c\u1eadp v\u00e0o th\u01b0 m\u1ee5c: node_modules\/react<\/li>\n\n\n\n<li>Ch\u1ea1y l\u1ec7nh: <code>yarn link<\/code><\/li>\n<\/ul>\n\n\n\n<p>Ti\u1ebfp theo, trong module \u0111\u01b0\u1ee3c link (module local) c\u0169ng \u0111ang s\u1eed d\u1ee5ng React:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn link react<\/code><\/pre>\n\n\n\n<p>K\u1ebft qu\u1ea3: C\u1ea3 hai n\u01a1i s\u1ebd \u0111\u1ec1u tr\u1ecf v\u1ec1 c\u00f9ng m\u1ed9t file React \u2013 ch\u00ednh l\u00e0 React n\u1eb1m trong node_modules\/react c\u1ee7a \u1ee9ng d\u1ee5ng. Nh\u1edd \u0111\u00f3 b\u1ea1n tr\u00e1nh \u0111\u01b0\u1ee3c l\u1ed7i nhi\u1ec1u phi\u00ean b\u1ea3n React ch\u1ea1y song song.<\/p>\n\n\n\n<p><strong>C\u00e1ch 2: D\u00f9ng Rescripts&nbsp;<\/strong><\/p>\n\n\n\n<p>Rescripts cho ph\u00e9p b\u1ea1n override c\u1ea5u h\u00ecnh Webpack c\u1ee7a CRA m\u00e0 kh\u00f4ng c\u1ea7n eject. C\u00e1c b\u01b0\u1edbc d\u00f9ng nh\u01b0 sau:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u00e0i \u0111\u1eb7t: <code>yarn add @rescripts\/cli<\/code><\/li>\n\n\n\n<li>Thay c\u00e1c l\u1ec7nh react-scripts trong project b\u1eb1ng rescripts t\u01b0\u01a1ng \u1ee9ng.<\/li>\n\n\n\n<li>Th\u00eam file .rescriptsrc.js n\u00e0y v\u00e0o th\u01b0 m\u1ee5c g\u1ed1c c\u1ee7a project:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>const path = require('path')\nconst resolveFrom = require('resolve-from')\n\nconst fixLinkedDependencies = config => {\n  config.resolve = {\n    ...config.resolve,\n    alias: {\n      ...config.resolve.alias,\n      react$: resolveFrom(path.resolve('node_modules'), 'react'),\n      'react-dom$': resolveFrom(path.resolve('node_modules'), 'react-dom'),\n    },\n  }\n  return config\n}\n\nmodule.exports = &#91;\n  fixLinkedDependencies,\n]<\/code><\/pre>\n\n\n\n<p>Ch\u1ea1y \u1ee9ng d\u1ee5ng b\u1eb1ng l\u1ec7nh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn start<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-lien-k\u1ebft-b\u1ecb-h\u1ecfng\"><strong>Li\u00ean k\u1ebft b\u1ecb h\u1ecfng<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>D\u1ea5u hi\u1ec7u: npm h\u1ecfi l\u1ea1i b\u1ea1n c\u00f3 mu\u1ed1n c\u00e0i package t\u1eeb registry. V\u00ed d\u1ee5:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>Need to install the following packages:\n\ncreate-project-calavera@0.0.5\n\nOk to proceed? (y)<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u00e1ch x\u1eed l\u00fd l\u00e0 ch\u1ea1y l\u1ea1i l\u1ec7nh:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>npm link\nnpm link &lt;package-name><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-g\u1ee1-lien-k\u1ebft-unlinking-trong-npm\"><span class=\"ez-toc-section\" id=\"Go_lien_ket_unlinking_trong_npm\"><\/span><strong>G\u1ee1 li\u00ean k\u1ebft (unlinking) trong npm<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Khi mu\u1ed1n ng\u1eebng s\u1eed d\u1ee5ng package \u0111\u01b0\u1ee3c li\u00ean k\u1ebft b\u1eb1ng npm link, b\u1ea1n c\u1ea7n g\u1ee1 symlink theo \u0111\u00fang th\u1ee9 t\u1ef1 \u0111\u1ec3 tr\u00e1nh l\u1ed7i.<\/p>\n\n\n\n<p>Tr\u01b0\u1edbc h\u1ebft, trong project \u0111ang th\u1eed nghi\u1ec7m, ch\u1ea1y:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm unlink &lt;package-name&gt;<\/code><\/pre>\n\n\n\n<p>L\u1ec7nh n\u00e0y ch\u1ec9 g\u1ee1 link trong project hi\u1ec7n t\u1ea1i, kh\u00f4ng x\u00f3a symlink global. \u0110\u1ec3 x\u00f3a ho\u00e0n to\u00e0n symlink, b\u1ea1n d\u00f9ng l\u1ec7nh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm uninstall -g package-name<\/code><\/pre>\n\n\n\n<p>L\u1ec7nh n\u00e0y \u0111\u1ea3m b\u1ea3o c\u00e1c l\u1ec7nh npm create ho\u1eb7c c\u00e0i package sau \u0111\u00f3 s\u1ebd s\u1eed d\u1ee5ng phi\u00ean b\u1ea3n t\u1eeb registry thay v\u00ec package c\u1ee5c b\u1ed9,&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-vi-d\u1ee5-v\u1ec1-unlinking\"><span class=\"ez-toc-section\" id=\"Vi_du_ve_unlinking\"><\/span><strong>V\u00ed d\u1ee5 v\u1ec1 unlinking<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Gi\u1ea3 s\u1eed b\u1ea1n \u0111ang ph\u00e1t tri\u1ec3n m\u1ed9t package NPM t\u00ean cowabunga v\u1edbi c\u1ea5u tr\u00fac project nh\u01b0 sau:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"name\": \"cowabunga\",\n  \"version\": \"0.0.1\",\n  \"description\": \"Component n\u00e0y th\u00f4ng b\u00e1o khi m\u1ecdi th\u1ee9 tr\u1edf n\u00ean tuy\u1ec7t v\u1eddi\",\n  \"main\": \"dist\/index.js\",\n  \"keywords\": &#91;\n    \"component\",\n    \"cowabunga\",\n    \"dude\"\n  ],\n  \"dependencies\": {\n    \"some-package\": \"^10.0.1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"access\": \"public\"\n}<\/code><\/pre>\n\n\n\n<p><strong>L\u01b0u \u00fd: <\/strong>Package n\u00e0y c\u00f3 th\u01b0 m\u1ee5c node_modules ri\u00eang b\u00ean trong. \u0110\u00e2y l\u00e0 ngu\u1ed3n c\u01a1n c\u1ee7a nhi\u1ec1u r\u1eafc r\u1ed1i: khi b\u1ea1n \u0111\u1ed5i branch, th\u01b0 m\u1ee5c n\u00e0y c\u00f3 th\u1ec3 bi\u1ebfn m\u1ea5t. Khi \u0111\u00f3 symlink c\u1ee7a project s\u1ebd kh\u00f4ng c\u00f2n t\u00ecm th\u1ea5y dependencies c\u1ee7a cowabunga, d\u1eabn \u0111\u1ebfn l\u1ed7i:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm ERR! enoent ENOENT: no such file or directory, access \u2018my_project\/node_modules\/cowabunga\/node_modules\/some-package\u2019<\/code><\/pre>\n\n\n\n<p>\u0110\u1ec3 kh\u1eafc ph\u1ee5c l\u1ed7i n\u00e0y c\u00f3 th\u1ec3 x\u1eed l\u00fd nhanh b\u1eb1ng c\u00e1ch ch\u1ea1y l\u1ea1i npm install trong th\u01b0 m\u1ee5c cowabunga tr\u01b0\u1edbc khi unlink.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-g\u1ee1-lien-k\u1ebft-unlinking\"><strong>G\u1ee1 li\u00ean k\u1ebft (Unlinking)<\/strong><\/h3>\n\n\n\n<p>Tr\u01b0\u1edbc khi chuy\u1ec3n branch ho\u1eb7c x\u00f3a th\u01b0 m\u1ee5c node_modules trong ch\u00ednh package, b\u1ea1n c\u1ea7n unlink theo \u0111\u00fang th\u1ee9 t\u1ef1 \u0111\u1ec3 tr\u00e1nh l\u1ed7i symlink.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>B\u01b0\u1edbc 1: Trong project \u0111ang d\u00f9ng package, b\u1ea1n h\u00e3y ch\u1ea1y l\u1ec7nh<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>npm unlink cowabunga<\/code><\/pre>\n\n\n\n<p>Ho\u1eb7c t\u1eeb npm 9+ c\u00f3 th\u1ec3 d\u00f9ng l\u1ec7nh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm uninstall cowabunga<\/code><\/pre>\n\n\n\n<p>Hai l\u1ec7nh n\u00e0y ch\u1ec9 g\u1ee1 symlink trong project th\u1eed nghi\u1ec7m.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>B\u01b0\u1edbc 2: Trong ch\u00ednh th\u01b0 m\u1ee5c package cowabunga, ch\u1ec9 c\u1ea7n ch\u1ea1y l\u1ec7nh <code>npm unlink<\/code> l\u00e0 npm t\u1ef1 g\u1ee1 global symlink<\/li>\n<\/ul>\n\n\n\n<p>Ngo\u00e0i ra, b\u1ea1n n\u00ean l\u01b0u \u00fd r\u1eb1ng th\u1ee9 t\u1ef1 s\u1ebd r\u1ea5t quan tr\u1ecdng, v\u1ea5n \u0111\u1ec1 th\u01b0\u1eddng g\u1eb7p l\u00e0 khi chuy\u1ec3n branch, symlink kh\u00f4ng th\u1ec3 t\u00ecm th\u1ea5y package n\u1eefa. \u0110i\u1ec1u n\u00e0y d\u1eabn \u0111\u1ebfn t\u00ecnh tr\u1ea1ng \u201cn\u1eeda v\u1eddi\u201d l\u00e0 b\u1ea1n kh\u00f4ng th\u1ec3 link, kh\u00f4ng th\u1ec3 unlink v\u00ec nh\u1eefng th\u01b0 m\u1ee5c c\u1ea7n thi\u1ebft \u0111\u00e3 kh\u00f4ng c\u00f2n t\u1ed3n t\u1ea1i.<\/p>\n\n\n\n<p>Khi \u0111i\u1ec1u n\u00e0y x\u1ea3y ra, h\u00e3y checkout l\u1ea1i branch ban \u0111\u1ea7u c\u1ee7a b\u1ea1n v\u00e0 b\u1eaft \u0111\u1ea7u l\u1ea1i t\u1eeb \u0111\u1ea7u quy tr\u00ecnh linking gi\u1eefa package v\u00e0 project.<\/p>\n\n\n\n<p>Ho\u1eb7c b\u1ea1n c\u0169ng c\u00f3 th\u1ec3 ch\u1ea1y&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install -g .<\/code><\/pre>\n\n\n\n<p>Trong th\u01b0 m\u1ee5c package \u0111\u1ec3 c\u00e0i \u0111\u1eb7t n\u00f3 global, gi\u00fap tr\u00e1nh \u0111\u01b0\u1ee3c m\u1ed9t s\u1ed1 r\u1eafc r\u1ed1i li\u00ean quan \u0111\u1ebfn vi\u1ec7c t\u1ea1o link.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cac-cau-h\u1ecfi-th\u01b0\u1eddng-g\u1eb7p-v\u1ec1-npm-link\"><span class=\"ez-toc-section\" id=\"Cac_cau_hoi_thuong_gap_ve_npm_link\"><\/span><strong>C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 npm link<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-npm-link-d\u01b0\u1ee3c-l\u01b0u-\u1edf-dau\"><strong>npm link \u0111\u01b0\u1ee3c l\u01b0u \u1edf \u0111\u00e2u?<\/strong><\/h3>\n\n\n\n<p>npm link \u0111\u01b0\u1ee3c l\u01b0u trong th\u01b0 m\u1ee5c global node_modules c\u1ee7a npm tr\u00ean m\u00e1y t\u00ednh. Khi b\u1ea1n ch\u1ea1y npm link trong m\u1ed9t package, npm s\u1ebd t\u1ea1o m\u1ed9t symbolic link (symlink) trong th\u01b0 m\u1ee5c global c\u1ee7a npm (npm root -g) tr\u1ecf \u0111\u1ebfn th\u01b0 m\u1ee5c package c\u1ee5c b\u1ed9 c\u1ee7a b\u1ea1n.<\/p>\n\n\n\n<p>Khi b\u1ea1n ch\u1ea1y <code>npm link &lt;package-name><\/code> trong m\u1ed9t project kh\u00e1c, npm s\u1ebd t\u1ea1o li\u00ean k\u1ebft t\u1eeb project \u0111\u00f3 \u0111\u1ebfn symlink global, thay v\u00ec c\u00e0i tr\u1ef1c ti\u1ebfp package t\u1eeb registry.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-lam-th\u1ebf-nao-d\u1ec3-xoa-t\u1ea5t-c\u1ea3-cac-npm-link\"><strong>L\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 x\u00f3a t\u1ea5t c\u1ea3 c\u00e1c npm link?<\/strong><\/h3>\n\n\n\n<p>B\u1ea1n c\u00f3 th\u1ec3 ch\u1ea1y <code>npm uninstall -g &lt;package-name><\/code> \u0111\u1ec3 x\u00f3a link global ho\u1eb7c <code>npm unlink &lt;package-name><\/code> trong project \u0111\u1ec3 x\u00f3a link local.\u00a0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>X\u00f3a link local trong project: <\/strong>V\u00e0o th\u01b0 m\u1ee5c project v\u00e0 ch\u1ea1y <code>npm unlink &lt;package-name><\/code>. L\u1ec7nh n\u00e0y s\u1ebd x\u00f3a symlink \u0111\u1ebfn package global.<\/li>\n\n\n\n<li><strong>X\u00f3a link global: <\/strong>V\u00e0o th\u01b0 m\u1ee5c package g\u1ed1c v\u00e0 ch\u1ea1y <code>npm uninstall -g &lt;package-name><\/code>. L\u1ec7nh n\u00e0y x\u00f3a symlink global v\u00e0 l\u00e0m package kh\u00f4ng c\u00f2n \u0111\u01b0\u1ee3c li\u00ean k\u1ebft v\u1edbi b\u1ea5t k\u1ef3 project n\u00e0o.<\/li>\n\n\n\n<li><strong>X\u00f3a nhi\u1ec1u link: <\/strong>N\u1ebfu mu\u1ed1n x\u00f3a nhi\u1ec1u link c\u00f9ng l\u00fac, b\u1ea1n c\u1ea7n l\u1eb7p l\u1ea1i l\u1ec7nh cho t\u1eebng package. npm kh\u00f4ng c\u00f3 l\u1ec7nh duy nh\u1ea5t \u0111\u1ec3 x\u00f3a t\u1ea5t c\u1ea3 link c\u00f9ng l\u00fac, nh\u01b0ng b\u1ea1n c\u00f3 th\u1ec3 d\u00f9ng script shell \u0111\u1ec3 t\u1ef1 \u0111\u1ed9ng unlink nhi\u1ec1u package.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>\u0110\u1ecdc chi ti\u1ebft: <strong><a href=\"https:\/\/itviec.com\/blog\/huong-dan-npm-remove-package\/\" target=\"_blank\" rel=\"noreferrer noopener\">NPM remove package: C\u00e1ch xo\u00e1 package kh\u1ecfi d\u1ef1 \u00e1n NodeJS<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-lam-th\u1ebf-nao-d\u1ec3-vo-hi\u1ec7u-hoa-npm-link\"><strong>L\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 v\u00f4 hi\u1ec7u h\u00f3a npm link?<\/strong><\/h3>\n\n\n\n<p>Npm link kh\u00f4ng c\u00f3 ch\u1ebf \u0111\u1ed9 \u201cv\u00f4 hi\u1ec7u h\u00f3a\u201d, b\u1ea1n ch\u1ec9 c\u00f3 th\u1ec3 unlink package \u0111\u1ec3 ng\u1eebng s\u1eed d\u1ee5ng li\u00ean k\u1ebft. Khi b\u1ea1n \u0111\u00e3 t\u1ea1o link, npm s\u1ebd lu\u00f4n \u01b0u ti\u00ean package c\u1ee5c b\u1ed9 qua symlink. \u0110\u1ec3 \u201cv\u00f4 hi\u1ec7u h\u00f3a\u201d, b\u1ea1n ch\u1ec9 c\u1ea7n ch\u1ea1y <code>npm unlink<\/code> trong project ho\u1eb7c <code>npm unlink -g<\/code> \u1edf package g\u1ed1c. Sau khi unlink, project s\u1ebd tr\u1edf v\u1ec1 tr\u1ea1ng th\u00e1i s\u1eed d\u1ee5ng package \u0111\u00e3 \u0111\u01b0\u1ee3c c\u00e0i t\u1eeb npm registry thay v\u00ec t\u1eeb th\u01b0 m\u1ee5c c\u1ee5c b\u1ed9.<\/p>\n\n\n\n<p>Ngo\u00e0i ra, sau khi g\u1ee1 symlink, n\u1ebfu package kh\u00f4ng c\u00f3 trong package.json, project s\u1ebd b\u00e1o l\u1ed7i Cannot find module. \u0110\u1ec3 d\u00f9ng l\u1ea1i phi\u00ean b\u1ea3n t\u1eeb registry, b\u1ea1n ph\u1ea3i ch\u1ea1y <a href=\"https:\/\/itviec.com\/blog\/huong-dan-npm-install\/\" target=\"_blank\" rel=\"noreferrer noopener\">npm install &lt;package><\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-t\u1ed5ng-k\u1ebft\"><span class=\"ez-toc-section\" id=\"Tong_ket\"><\/span><strong>T\u1ed5ng k\u1ebft<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>npm link l\u00e0 gi\u1ea3i ph\u00e1p m\u1ea1nh m\u1ebd gi\u00fap \u0111\u01a1n gi\u1ea3n h\u00f3a vi\u1ec7c ph\u00e1t tri\u1ec3n v\u00e0 th\u1eed nghi\u1ec7m package trong m\u00f4i tr\u01b0\u1eddng c\u1ee5c b\u1ed9. Khi hi\u1ec3u \u0111\u00fang c\u01a1 ch\u1ebf ho\u1ea1t \u0111\u1ed9ng, b\u1ea1n s\u1ebd r\u00fat ng\u1eafn \u0111\u00e1ng k\u1ec3 th\u1eddi gian c\u00e0i \u0111\u1eb7t, ti\u1ebft ki\u1ec7m c\u00f4ng s\u1ee9c v\u00e0 c\u1ea3i thi\u1ec7n ch\u1ea5t l\u01b0\u1ee3ng s\u1ea3n ph\u1ea9m tr\u01b0\u1edbc khi publish l\u00ean npm registry. H\u00e3y t\u1eadn d\u1ee5ng c\u00f4ng c\u1ee5 n\u00e0y k\u1ebft h\u1ee3p v\u1edbi c\u00e1c chi\u1ebfn l\u01b0\u1ee3c qu\u1ea3n l\u00fd package hi\u1ec7n \u0111\u1ea1i nh\u01b0 workspaces hay monorepo \u0111\u1ec3 t\u1ed1i \u01b0u hi\u1ec7u su\u1ea5t l\u00e0m vi\u1ec7c.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>npm link l\u00e0 l\u1ec7nh trong npm d\u00f9ng \u0111\u1ec3 t\u1ea1o m\u1ed9t li\u00ean k\u1ebft symlink gi\u1eefa m\u1ed9t package c\u1ee5c b\u1ed9 v\u00e0 d\u1ef1 \u00e1n \u0111ang s\u1eed d\u1ee5ng n\u00f3, gi\u00fap b\u1ea1n ph\u00e1t tri\u1ec3n v\u00e0 th\u1eed nghi\u1ec7m th\u01b0 vi\u1ec7n theo th\u1eddi gian th\u1ef1c m\u00e0 kh\u00f4ng c\u1ea7n publish l\u00ean npm registry. \u0110\u00e2y l\u00e0 c\u00f4ng c\u1ee5 c\u1ef1c k\u1ef3 h\u1eefu \u00edch khi b\u1ea1n [&hellip;]<\/p>\n","protected":false},"author":95,"featured_media":93947,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_gspb_post_css":"","footnotes":""},"categories":[109,10344],"tags":[],"class_list":["post-93943","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-chuyen-mon-it","category-javascript"],"blocksy_meta":[],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.8 (Yoast SEO v27.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>NPM link: C\u00e1ch s\u1eed d\u1ee5ng, l\u1ee3i \u00edch v\u00e0 l\u01b0u \u00fd quan tr\u1ecdng - ITviec Blog<\/title>\n<meta name=\"description\" content=\"Chi ti\u1ebft c\u00e1ch \u00e1p d\u1ee5ng npm link \u0111\u1ec3 li\u00ean k\u1ebft package c\u1ee5c b\u1ed9 \u0111\u1ec3 ph\u00e1t tri\u1ec3n v\u00e0 th\u1eed nghi\u1ec7m nhanh ch\u00f3ng, gi\u00fap t\u1ed1i \u01b0u h\u00f3a workflow.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/\" \/>\n<meta property=\"og:locale\" content=\"vi_VN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NPM link: C\u00e1ch s\u1eed d\u1ee5ng, l\u1ee3i \u00edch v\u00e0 l\u01b0u \u00fd quan tr\u1ecdng\" \/>\n<meta property=\"og:description\" content=\"npm link l\u00e0 l\u1ec7nh trong npm d\u00f9ng \u0111\u1ec3 t\u1ea1o m\u1ed9t li\u00ean k\u1ebft symlink gi\u1eefa m\u1ed9t package c\u1ee5c b\u1ed9 v\u00e0 d\u1ef1 \u00e1n \u0111ang s\u1eed d\u1ee5ng n\u00f3, gi\u00fap b\u1ea1n ph\u00e1t tri\u1ec3n v\u00e0 th\u1eed nghi\u1ec7m th\u01b0 vi\u1ec7n\" \/>\n<meta property=\"og:url\" content=\"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/\" \/>\n<meta property=\"og:site_name\" content=\"ITviec Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ITviec\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-30T10:08:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-30T10:08:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/12\/npm-link-scaled.png\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"421\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Tuong Uyen\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ITviec\" \/>\n<meta name=\"twitter:site\" content=\"@ITviec\" \/>\n<meta name=\"twitter:label1\" content=\"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tuong Uyen\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 ph\u00fat\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"NPM link: C\u00e1ch s\u1eed d\u1ee5ng, l\u1ee3i \u00edch v\u00e0 l\u01b0u \u00fd quan tr\u1ecdng - ITviec Blog","description":"Chi ti\u1ebft c\u00e1ch \u00e1p d\u1ee5ng npm link \u0111\u1ec3 li\u00ean k\u1ebft package c\u1ee5c b\u1ed9 \u0111\u1ec3 ph\u00e1t tri\u1ec3n v\u00e0 th\u1eed nghi\u1ec7m nhanh ch\u00f3ng, gi\u00fap t\u1ed1i \u01b0u h\u00f3a workflow.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/","og_locale":"vi_VN","og_type":"article","og_title":"NPM link: C\u00e1ch s\u1eed d\u1ee5ng, l\u1ee3i \u00edch v\u00e0 l\u01b0u \u00fd quan tr\u1ecdng","og_description":"npm link l\u00e0 l\u1ec7nh trong npm d\u00f9ng \u0111\u1ec3 t\u1ea1o m\u1ed9t li\u00ean k\u1ebft symlink gi\u1eefa m\u1ed9t package c\u1ee5c b\u1ed9 v\u00e0 d\u1ef1 \u00e1n \u0111ang s\u1eed d\u1ee5ng n\u00f3, gi\u00fap b\u1ea1n ph\u00e1t tri\u1ec3n v\u00e0 th\u1eed nghi\u1ec7m th\u01b0 vi\u1ec7n","og_url":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/","og_site_name":"ITviec Blog","article_publisher":"https:\/\/www.facebook.com\/ITviec","article_published_time":"2025-12-30T10:08:31+00:00","article_modified_time":"2025-12-30T10:08:33+00:00","og_image":[{"width":800,"height":421,"url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/12\/npm-link-scaled.png","type":"image\/png"}],"author":"Tuong Uyen","twitter_card":"summary_large_image","twitter_creator":"@ITviec","twitter_site":"@ITviec","twitter_misc":{"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi":"Tuong Uyen","\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc":"9 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#article","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/"},"author":{"name":"Tuong Uyen","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/e97d0e359f8840eaea7dc3a96006a8d4"},"headline":"NPM link: C\u00e1ch s\u1eed d\u1ee5ng, l\u1ee3i \u00edch v\u00e0 l\u01b0u \u00fd quan tr\u1ecdng","datePublished":"2025-12-30T10:08:31+00:00","dateModified":"2025-12-30T10:08:33+00:00","mainEntityOfPage":{"@id":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/"},"wordCount":2358,"publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"image":{"@id":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/12\/npm-link-scaled.png","articleSection":["Chuy\u00ean m\u00f4n IT","JavaScript"],"inLanguage":"vi"},{"@type":"WebPage","@id":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/","url":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/","name":"NPM link: C\u00e1ch s\u1eed d\u1ee5ng, l\u1ee3i \u00edch v\u00e0 l\u01b0u \u00fd quan tr\u1ecdng - ITviec Blog","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#primaryimage"},"image":{"@id":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/12\/npm-link-scaled.png","datePublished":"2025-12-30T10:08:31+00:00","dateModified":"2025-12-30T10:08:33+00:00","description":"Chi ti\u1ebft c\u00e1ch \u00e1p d\u1ee5ng npm link \u0111\u1ec3 li\u00ean k\u1ebft package c\u1ee5c b\u1ed9 \u0111\u1ec3 ph\u00e1t tri\u1ec3n v\u00e0 th\u1eed nghi\u1ec7m nhanh ch\u00f3ng, gi\u00fap t\u1ed1i \u01b0u h\u00f3a workflow.","breadcrumb":{"@id":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/itviec.com\/blog\/huong-dan-npm-link\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#primaryimage","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/12\/npm-link-scaled.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/12\/npm-link-scaled.png","width":800,"height":421,"caption":"npm link - itviec blog"},{"@type":"BreadcrumbList","@id":"https:\/\/itviec.com\/blog\/huong-dan-npm-link\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Chuy\u00ean m\u00f4n IT","item":"https:\/\/itviec.com\/blog\/chuyen-mon-it\/"},{"@type":"ListItem","position":2,"name":"NPM link: C\u00e1ch s\u1eed d\u1ee5ng, l\u1ee3i \u00edch v\u00e0 l\u01b0u \u00fd quan tr\u1ecdng"}]},{"@type":"WebSite","@id":"https:\/\/itviec.com\/blog\/#website","url":"https:\/\/itviec.com\/blog\/","name":"ITviec Blog","description":"IT Jobs &amp; People in Vietnam","publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/itviec.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"vi"},{"@type":"Organization","@id":"https:\/\/itviec.com\/blog\/#organization","name":"ITviec","url":"https:\/\/itviec.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2018\/12\/itviec-black-square-facebook.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2018\/12\/itviec-black-square-facebook.png","width":1800,"height":1800,"caption":"ITviec"},"image":{"@id":"https:\/\/itviec.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/ITviec","https:\/\/x.com\/ITviec","https:\/\/www.linkedin.com\/company\/itviec","https:\/\/www.youtube.com\/channel\/UCYthAQ3bcGr57M_ag5gHDvQ"]},{"@type":"Person","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/e97d0e359f8840eaea7dc3a96006a8d4","name":"Tuong Uyen","image":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2022\/10\/tuong-uyen-profile-picture-100x100.jpg","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2022\/10\/tuong-uyen-profile-picture-100x100.jpg","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2022\/10\/tuong-uyen-profile-picture-100x100.jpg","caption":"Tuong Uyen"},"url":"https:\/\/itviec.com\/blog\/author\/tuong-uyen-pikachu\/"}]}},"_links":{"self":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/93943","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/users\/95"}],"replies":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/comments?post=93943"}],"version-history":[{"count":4,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/93943\/revisions"}],"predecessor-version":[{"id":93948,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/93943\/revisions\/93948"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media\/93947"}],"wp:attachment":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media?parent=93943"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/categories?post=93943"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/tags?post=93943"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}