Mundarija (30)
- Bu darsda
- 1. Nega bu kerak?
- 2. Kirish nuqtasini topish
- 2.1 Papka ichida nima bor
- 2.2 exports javob beradi
- 2.3 exports — devor ham
- 3. Kodni o'qish: nanoid() qanday ishlaydi
- 3.1 Brauzer versiyasi — eng qisqasi
- 3.2 G'alati alifbo
- 3.3 Node versiyasi — uzunroq
- 3.4 O'qish yetmasa — kuzatish
- 4. npm'dagi kod va GitHub'dagi manba
- 4.1 Izohlar qayerda
- 4.2 gitHead — aynan qaysi commit
- 4.3 GitHub code search
- 5. .d.ts va "Go to Definition"
- 5.1 .d.ts — va'da
- 5.2 "Go to Definition" — tuzoq
- 6. Testlar — ishlaydigan hujjat
- 6.1 Testdan qoida o'qish
- 6.2 Strategiya
- 7. Ko'p uchraydigan xatolar
- 8. Mashqlar
- 1-mashq (oson): qaysi fayl?
- 2-mashq (o'rta): non-secure ni o'qing
- 3-mashq (o'rta): nega % xavfli
- 4-mashq (qiyin): Vite qaysi faylni oldi?
- 9. Real ishda
- Xulosa
- Manbalar
Kutubxona manba kodini o'qish: node_modules, .d.ts, testlar va GitHub
Qisqacha: Kutubxona qanday ishlashini bilish uchun uning kodini o'qish mumkin — u
node_modulesda, oddiy JavaScript. Tartib bor.package.jsondagiexportsqaysi fayl ishlashini aytadi,import.meta.resolvebuni tasdiqlaydi..d.tsnima va'da qilinganini ko'rsatadi, testlar — qanday holatlar kutilganini. GitHub'dagi repo esa izohlar va tarixni saqlaydi.nanoidning 117 baytliknanoid()funksiyasini shu yo'l bilan oxirigacha tushunamiz.
Bu darsda
node_modulesdagi paketni ochib, kirish nuqtasiniexportsvaimport.meta.resolvebilan topasiz..d.tsdan va VS Code'ning "Go to Definition" dan foydalanasiz va ularning chegarasini bilasiz.- Testlarni "ishlaydigan hujjat" sifatida o'qiysiz.
- npm'dagi kod va GitHub'dagi manba farqini (
gitHead) tushunasiz. - Kod o'qish strategiyasini notanish kutubxonaga qo'llaysiz.
Oldin bilishingiz kerak: Begona repoda orientatsiya, package.json IV: kirish nuqtalari, Declaration fayllari (.d.ts).
1. Nega bu kerak?
O'tgan darsda nanoid reposining ildizini o'qidik. Sardor endi bir savolga javob qidirmoqda: "nanoid() 21 ta belgini qanday yasaydi? Ular haqiqatan tasodifiymi? Brauzerda ham xuddi shunday ishlaydimi?"
README javob bermaydi — u "qanday ishlatish" haqida. Internetdagi maqolalar eskirgan bo'lishi mumkin. Eng ishonchli manba — kodning o'zi. U allaqachon kompyuteringizda: node_modules/nanoid/.
Ko'p boshlovchilar node_modules ni "qora quti" deb biladi — tegib bo'lmaydigan sehrli papka. Aslida u yerda xuddi siz yozgandek JavaScript fayllar turadi. Ularni o'qish — kasbiy o'sishning eng tez yo'llaridan biri: yaxshi kutubxonalar kodi — tayyor darslik. Shuningdek, xatoni topish uchun ham: "kutubxona xato qilyaptimi yoki men noto'g'ri ishlatyapmanmi?" degan savolga ko'pincha faqat kod javob beradi.
O'xshatish: yangi taomning ta'mini bilish uchun retseptni o'qiysiz, lekin tarkibini aniq bilish uchun oshxonaga kirib, oshpaz nima qo'shayotganini ko'rasiz.
2. Kirish nuqtasini topish
2.1 Papka ichida nima bor
Mashq loyihasi: kurs/mashqlar/16/47-manba-kod/ — npm i -E nanoid@6.0.2.
ls node_modules/nanoidLICENSE
README.md
bin
index.browser.js
index.d.ts
index.js
nanoid.js
non-secure
package.json
url-alphabetO'nta narsa, hammasi 14.7 KB (npm view nanoid@6.0.2 dist.unpackedSize → 14728). index.js va index.browser.js — ikkita! Qaysi biri ishlaydi?
2.2 exports javob beradi
Kirish nuqtalari darsidagi exports maydoni — paketning "qabulxonasi". nanoid/package.json dan:
{
"exports": {
".": {
"types": "./index.d.ts",
"browser": "./index.browser.js",
"react-native": "./index.browser.js",
"default": "./index.js"
},
"./non-secure": {
"types": "./non-secure/index.d.ts",
"default": "./non-secure/index.js"
},
"./package.json": "./package.json"
}
}"." — import … from "nanoid". Ichida shartlar (conditions): TypeScript — types, brauzer bundler'i — browser, qolganlar (Node) — default. Taxmin qilmasdan, Node'dan so'raymiz:
node --input-type=module -e '
console.log(import.meta.resolve("nanoid"))'file:///D:/kurs/mashqlar/16/47-manba-kod/node_modules/nanoid/index.jsimport.meta.resolve — "bu importni qaysi faylga aylantirasan?" degan savol. Node uchun — index.js. Bu bir qatorlik buyruq har qanday paketda ishlaydi va taxminni fakt bilan almashtiradi.
2.3 exports — devor ham
index.browser.js ni Node'da to'g'ridan-to'g'ri import qilib ko'ramiz:
node --input-type=module -e '
import { nanoid } from "nanoid/index.browser.js"'Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './index.browser.js' is not defined by "exports" in D:\kurs\mashqlar\16\47-manba-kod\node_modules\nanoid\package.json imported from D:\kurs\mashqlar\16\47-manba-kod\[eval1]"./index.browser.js yo'li exports da yo'q". exports faqat ruxsat etilgan eshiklarni ochadi — paketning ichki fayllari "yopiq". O'qish uchun esa nisbiy yo'l bilan to'g'ridan-to'g'ri ochish mumkin: await import("./node_modules/nanoid/index.browser.js") — mashqlarda shunday qilamiz. Real kodda bunday qilmang: ichki fayl keyingi versiyada yo'qolishi mumkin.
3. Kodni o'qish: nanoid() qanday ishlaydi
3.1 Brauzer versiyasi — eng qisqasi
Kichikdan boshlaymiz. index.browser.js dagi nanoid:
export let nanoid = (size = 21) => {
var id = ''
var bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))
while (size--) {
id += urlAlphabet[bytes[size] & 63]
}
return id
}Qatorma-qator:
| Qator | Nima qiladi |
|---|---|
size = 21 |
sukut — 21 belgi |
size |= 0 |
size ni butun songa aylantiradi ("5" → 5, 2.7 → 2) |
crypto.getRandomValues(new Uint8Array(size)) |
size ta tasodifiy bayt (0–255), kriptografik xavfsiz manbadan (chuqur — crypto darsida) |
bytes[size] & 63 |
baytning oxirgi 6 biti: 0–63 oralig'idagi son |
urlAlphabet[…] |
64 belgili alifbodan belgi |
Asosiy hiyla — & 63. 63 ikkilikda 111111 — oltita bir. Bitli "VA" (&) baytning faqat oxirgi 6 bitini qoldiradi:
const urlAlphabet =
"57X6y3wQZNzYjJB2L_10pxbackgroundhimselfUTF-8DEMOGRAPHICSVqvt4KW9";
console.log(urlAlphabet.length); // 64
console.log((63).toString(2)); // 111111
console.log(200 & 63); // 8
console.log(urlAlphabet[200 & 63]); // Z256 ta bayt qiymati 64 ta belgiga teng taqsimlanadi: har belgiga aynan 4 ta bayt (256 ÷ 64 = 4). Hech bir belgi boshqasidan ko'proq chiqmaydi — ID haqiqatan tasodifiy. Bitli amallar — Bitwise operatorlar darsida.
3.2 G'alati alifbo
urlAlphabet — 57X6y3wQZNzYjJB2L_10pxbackgroundhimselfUTF-8DEMOGRAPHICSVqvt4KW9. Ichida inglizcha so'zlar: background, himself, UTF-8, DEMOGRAPHICS! Nega? npm'dagi faylda izoh yo'q. Bunday savollarga javob — reponing asl manbasida (keyingi bo'lim).
3.3 Node versiyasi — uzunroq
index.js (Node) dagi nanoid boshqacha: export const nanoid = customAlphabet(urlAlphabet). customAlphabet 50 qatorga yaqin va ichida yangi g'oya — pool (havza): tasodifiy baytlarni bittalab emas, katta bo'lak qilib oladi va keyingi chaqiruvlarda shu zaxiradan beradi. Ba'zi qatorlar:
const POOL_MAX = GET_RANDOM_LIMIT / 2
…
if (poolOffset + size > pool.length) {
let target = Math.max(poolNext, size)
poolNext = Math.min(target * 16, POOL_MAX)
let buffer = Buffer.allocUnsafe(target)Zaxira tugasa — 16 baravar kattaroq yangisi olinadi (eng ko'pi 32 768 bayt). Bu — README'dagi "50% faster than native crypto.randomUUID()" va'dasining sababi: tizimdan tasodif so'rash qimmat, kam so'rash tezroq. Buffer — Node'ning baytlar massivi; brauzerda u yo'q, shuning uchun brauzer versiyasi boshqa fayl.
Bu bo'limni to'liq tushunish shart emas. Muhimi — strategiya: avval qisqa versiyani o'qib, g'oyani tushunish, keyin murakkabini.
Tekshirib ko'ring:
nanoid(5)brauzer versiyasida nechta tasodifiy bayt so'raydi va negasize--teskari tartibda yuradi?
Javob
5 ta: new Uint8Array(5). while (size--) — size ni 4, 3, 2, 1, 0 qilib, massivni oxiridan boshiga o'qiydi. Tartibning ahamiyati yo'q (baytlar baribir tasodifiy), lekin bu yozuv qisqa: alohida i o'zgaruvchisi kerak emas. 117 bayt chegarasi uchun har belgi hisobda.
3.4 O'qish yetmasa — kuzatish
Havza haqidagi gapimiz — hozircha kodni o'qishdan chiqargan taxmin. Uni tekshirishning eng oddiy yo'li: node_modules dagi faylga vaqtincha console.log qo'yish. Bu sizning kompyuteringizdagi nusxa — boshqa hech kimga ta'sir qilmaydi. node_modules/nanoid/index.js dagi let target = … qatoridan keyin:
console.log("[nanoid] havza to'ldirildi:", target, "bayt")Sinov fayli havza.js:
import { nanoid } from "nanoid";
for (let i = 1; i <= 4; i++) {
console.log(i, nanoid());
}node havza.js[nanoid] havza to'ldirildi: 21 bayt
1 16HAPjPowr6xxPhvKpss_
[nanoid] havza to'ldirildi: 336 bayt
2 alI8egljI6zUcWKJVu2eT
3 T5IT5FfAxCRDocYcXlxPm
4 ORXHGfZnG27dx7302llwxTaxmin tasdiqlandi va aniqlashdi. Birinchi chaqiruv faqat 21 bayt oldi — kerakli miqdorni. Ikkinchisi 16 baravar ko'p — 336 bayt — va keyingi ikki ID shu zaxiradan, tizimga murojaatsiz chiqdi. 30 marta chaqirsak, uchinchi to'ldirish 5 376 bayt bo'ladi (yana ×16). ID'lar sizda boshqacha — ular tasodifiy.
Tajribadan keyin asl holatga qaytarish shart:
npm ci
added 16 packages, and audited 17 packages in 1snpm ci node_modules ni lock-fayldan qayta quradi — console.log qatori yo'qoldi (Lock-fayllar va npm ci). Bu usulni faqat o'rganish va xato qidirish uchun ishlating. Kutubxonani doimiy o'zgartirish kerak bo'lsa — boshqa yo'llar bor (patch-package).
Diqqat:
node_modulesdagi o'zgarishni unutib qoldirsangiz, keyingi kun "nega terminalda g'alati yozuvlar chiqyapti?" deb hayron bo'lasiz. Tajribani tugatgach, darholnpm ci.
4. npm'dagi kod va GitHub'dagi manba
4.1 Izohlar qayerda
Repodagi url-alphabet/index.js (o'tgan darsdagi commit):
// This alphabet uses `A-Za-z0-9_-` symbols.
// The order of characters is optimized for better brotli compression.
// Same as in non-secure/index.js
//
// References to the brotli default dictionary:
// `DEMOGRAPHICS`, `UTF-8`, `himself`, `background`, and `10px`
export let urlAlphabet =
'57X6y3wQZNzYjJB2L_10pxbackgroundhimselfUTF-8DEMOGRAPHICSVqvt4KW9'Javob: brotli siqish algoritmining ichki lug'atida bu so'zlar bor (bundle tahlili dagi gzip va brotli). Alifbo shunday tartiblanganki, siqilgan fayl kichikroq chiqadi. Hammasi 117 bayt uchun.
Nega npm'dagi faylda bu izoh yo'q? Reponing .github/workflows/release.yml ida ai/clean-npm-project qadami bor, sozlamasi clean-comments: true: nashrdan oldin izohlar olib tashlanadi. Natija: repodagi index.js — 177 qator, npm'dagisi — 125 qator. Kod bir xil, izohlar — faqat GitHub'da.
4.2 gitHead — aynan qaysi commit
npm har versiyani qaysi commitdan chiqarilganini eslab qoladi:
npm view nanoid@6.0.2 gitHead repository.urlgitHead = '3167e108865702c0539d8e552365ed840ac9d8d9'
repository.url = 'git+https://github.com/ai/nanoid.git'github.com/ai/nanoid/tree/3167e108… — sizdagi 6.0.2 ning aynan manbasi. main branch'da kod allaqachon o'zgargan bo'lishi mumkin — eski versiyaning xatosini qidirsangiz, main emas, gitHead ni oching. Bu Kod arxeologiyasi darsidagi git log -S bilan birga ishlaydigan qurol.
Tekshirib ko'ring: Malika loyihasida
nanoid5.1.0. U GitHub'damainbranch'dagiindex.jsni o'qidi va o'z loyihasidagi xulqni shu kod bilan tushuntirdi. Xulosa ishonchlimi?
Javob
Yo'q. main — eng yangi kod, Malikada esa boshqa versiya. Kod versiyalar orasida o'zgaradi: funksiya qo'shiladi, nomi almashadi, o'chiriladi. To'g'ri yo'l — o'z versiyasining manbasi: npm view nanoid@5.1.0 gitHead bergan commit yoki undan ham sodda — o'z node_modules/nanoid/index.js i. Kompyuteringizdagi fayl — aynan siz ishlatayotgan kod.
4.3 GitHub code search
GitHub'ning qidiruvi (github.com saytidagi qidiruv maydoni, akkaunt bilan kirgan holda) butun repo bo'yicha ishlaydi. Foydali shablonlar:
| So'rov | Nima topadi |
|---|---|
repo:ai/nanoid "Wrong ID size" |
xato matni qayerda tashlanadi |
repo:ai/nanoid path:test/ customAlphabet |
customAlphabet testlari |
"from 'nanoid'" language:TypeScript |
boshqa loyihalar uni qanday ishlatadi |
Xato xabarini qidirish — eng tez yo'l: xabar matni kodda deyarli doim aynan shunday yozilgan.
5. .d.ts va "Go to Definition"
5.1 .d.ts — va'da
index.d.ts dagi nanoid e'loni:
/**
* Generate secure URL-friendly unique ID.
*
* By default, the ID will have 21 symbols to have a collision
* probability similar to UUID v4.
* …
* @param size Size of the ID. The default size is 21.
* @typeparam Type The ID type to replace `string` with some opaque
* type.
* @returns A random string.
*/
export function nanoid<Type extends string>(size?: number): TypeDeclaration fayllari darsidan bilasiz: bu — shartnoma, kod emas. JSDoc izohlari VS Code'da sichqoncha ostida ko'rinadi. Va <Type extends string> — branded types uchun eshik: nanoid<UserId>().
5.2 "Go to Definition" — tuzoq
VS Code'da nanoid ustida F12 ("Go to Definition") bossangiz, index.js emas, index.d.ts ochiladi. TypeScript faqat turlarni biladi. Haqiqiy kodga borish uchun boshqa buyruq bor: sichqonchaning o'ng tugmasi → "Go to Source Definition" (TypeScript 4.7 dan). U .d.ts ni chetlab, .js faylni ochadi.
6. Testlar — ishlaydigan hujjat
6.1 Testdan qoida o'qish
Reponing test/index.test.js ida:
test('throws on negative or too big ID length', () => {
throws(() => {
nanoid(2147483648)
}, /Wrong ID size|Invalid typed array length/)
throws(() => {
nanoid(-10)
}, /Wrong ID size|Invalid typed array length/)
…
})Testning nomi — qoida: "manfiy yoki juda katta uzunlikda xato tashlaydi". throws — assert dagi "xato tashlashi kerak" tekshiruvi. Kutilgan xabar esa ikkita: Wrong ID size yoki Invalid typed array length. Nega ikkita? Tekshiramiz:
node --input-type=module -e '
import { nanoid } from "nanoid";
try { nanoid(-1) } catch (e) {
console.log(`${e.name}: ${e.message}`)
}'RangeError: Wrong ID sizeBrauzer faylini to'g'ridan-to'g'ri ochib:
RangeError: Invalid typed array length: -1Node versiyasi o'zi tekshiradi (if (size < 0) throw new RangeError('Wrong ID size')), brauzer versiyasida tekshiruv yo'q — xatoni new Uint8Array(-1) ning o'zi beradi. 117 baytda tekshiruvga joy yo'q. Test ikkala variantni ham qabul qiladi — va bu farqni kodni o'qimay turib ochib berdi.
6.2 Strategiya
flowchart LR
P["exports"] --> R["import.meta.resolve"]
R --> S["qisqa versiya:<br/>asosiy g'oya"]
S --> T["testlar:<br/>qoidalar va chegaralar"]
T --> G["GitHub:<br/>izoh, gitHead, tarix"]
G --> D[".d.ts:<br/>va'da va hujjat"]- Kirish nuqtasi —
exports, keyinimport.meta.resolvebilan tasdiq. - Eng qisqa yo'l — avval oddiy variant (brauzer,
non-secure), keyin murakkabi. - Testlar — chegaraviy holatlar ro'yxati; test nomlari — qoidalar.
- Asl manba — izohlar,
gitHeaddagi commit,git log. .d.ts— nima va'da qilingani; amalga oshirilishi bilan solishtiring.
Tekshirib ko'ring: Vite bilan yig'ilgan saytda
nanoidning qaysi fayli ishlaydi? Qanday isbotlaysiz?
Javob
index.browser.js — Vite brauzer uchun yig'adi va exports dagi browser shartini tanlaydi. Isbot: build natijasini qidirish. Biz sinadik: dist/assets/index-*.js da getRandomValues va &63 bor, Node versiyasidagi allocUnsafe (Buffer) esa yo'q. Hajmi 0.86 kB — sahifa bilan birga.
7. Ko'p uchraydigan xatolar
| Belgi | Sabab | Davosi |
|---|---|---|
F12 .d.ts ni ochdi, kod yo'q |
"Go to Definition" turlarga boradi | "Go to Source Definition" |
ERR_PACKAGE_PATH_NOT_EXPORTED |
ichki faylni paket nomi bilan import | faqat exports dagi yo'llar |
| GitHub'dagi kod siz o'rnatgandan farq qiladi | main ochilgan, versiya emas |
npm view <paket>@<versiya> gitHead |
node_modules dagi faylni tahrirladim — yo'qoldi |
npm ci qayta yozadi |
vaqtinchalik sinov uchun mayli; doimiy tuzatish — patch-package |
Yana bir tuzoq — minifikatsiya qilingan paket (dist/index.min.js). Uni o'qib bo'lmaydi: exports da boshqa (.mjs, src/) fayl bormi qarang yoki GitHub'dagi manbaga o'ting. Source map bo'lsa, DevTools asl kodni ko'rsatadi.
8. Mashqlar
Mashq papkasi: kurs/mashqlar/16/47-manba-kod/ — npm init -y, npm pkg set type=module, npm i -E nanoid@6.0.2.
1-mashq (oson): qaysi fayl?
import.meta.resolve bilan toping: "nanoid" → [:nanoid/index.js], "nanoid/non-secure" → [:nanoid/non-secure/index.js].
Yechim
node --input-type=module -e '
console.log(import.meta.resolve("nanoid/non-secure"))'file:///D:/kurs/mashqlar/16/47-manba-kod/node_modules/nanoid/non-secure/index.js./non-secure uchun exports da browser sharti yo'q — Node ham, brauzer ham bir faylni oladi.
2-mashq (o'rta): non-secure ni o'qing
node_modules/nanoid/non-secure/index.js ni oching. Savollar: tasodif qayerdan olinadi? Nega bu versiya "secure emas"? Qachon ishlatsa bo'ladi?
Yechim
export let nanoid = (size = 21) => {
let id = ''
let i = size | 0
while (i-- > 0) {
id += urlAlphabet[(Math.random() * 64) | 0]
}
return id
}Tasodif — Math.random(). U kriptografik emas: natijasini oldindan taxmin qilish nazariy jihatdan mumkin. Shuning uchun parol, token, havola kaliti uchun — yo'q. Faqat xavfsizlik ahamiyatsiz joyda (masalan, sahifadagi elementga vaqtinchalik id). i-- > 0 — manfiy uzunlikda xato emas, shunchaki bo'sh satr qaytaradi.
3-mashq (o'rta): nega % xavfli
Repodagi customRandom izohi aytadi: 17 belgili alifboda bayt % 17 ba'zi belgilarni "ko'proq" chiqaradi. Buni o'zingiz sanang: 0 dan 255 gacha har bayt uchun alphabet[bayt % 17] va har belgi necha marta tushganini chiqaring.
Yechim
// egrilik.mjs — bayt % 17: har belgiga nechta bayt tushadi
const alphabet = "0123456789abcdefg"; // 17 ta belgi
const counts = new Map();
for (let byte = 0; byte < 256; byte++) {
const symbol = alphabet[byte % alphabet.length];
counts.set(symbol, (counts.get(symbol) ?? 0) + 1);
}
console.log([...counts].map(([s, n]) => `${s}:${n}`).join(" "));
const cutoff = 256 - (256 % alphabet.length);
console.log("safeByteCutoff:", cutoff);Konsolda:
0:16 1:15 2:15 3:15 4:15 5:15 6:15 7:15 8:15 9:15 a:15 b:15 c:15 d:15 e:15 f:15 g:15
safeByteCutoff: 255Natija: 0 — 16 marta, qolganlari — 15. Hisob: 256 = 17 × 15 + 1. Ortiqcha bitta bayt (255) yana 0 ga tushadi. Shuning uchun nanoid safeByteCutoff (255) dan katta baytni tashlab yuboradi. 64 belgili alifboda bu muammo yo'q: 256 ga qoldiqsiz bo'linadi — & 63 yetarli.
4-mashq (qiyin): Vite qaysi faylni oldi?
Shu papkada npm i -D -E vite@8.3.3, index.html (<script type="module" src="/main.js">) va main.js:
import { nanoid } from "nanoid";
document.title = nanoid();npx vite build. Natijadagi JS faylda qaysi versiya kodi borligini isbotlang. Yordam: grep -o "allocUnsafe\|&63\|getRandomValues" dist/assets/index-*.js (grep -o — faqat topilgan bo'lakni chiqaradi).
Yechim
dist/assets/index-Dc-3RjTk.js 0.86 kB │ gzip: 0.53 kBgrep natijasi: &63 — 1, getRandomValues — 1, allocUnsafe — 0. Ya'ni brauzer versiyasi (index.browser.js). Faylning oxirida aynan o'sha funksiya, minifikatsiya qilingan holda: ((t=21)=>{for(var n=,r=crypto.getRandomValues(new Uint8Array(t|=0));t--;)n+=e[r[t]&63];return n})()``. Node versiyasi (Buffer) brauzerda ishlamas edi — exports dagi browser sharti buni oldini oldi.
9. Real ishda
- Xato tergovi — "kutubxona xatosimi?" savoliga javob: kodni oching, testlarni qidiring,
gitHeaddagi versiyani GitHub'da ko'ring. Ko'pincha javob — sizning ishlatishingizda. - Issue yozishdan oldin — kodni o'qib, xato qatorini ko'rsatsangiz, muallif tezroq javob beradi (Fork va upstream).
- O'rganish —
nanoid,picocolors,mskabi kichik paketlar — mukammal kod namunasi. Har hafta bitta paketni o'qish odati katta foyda beradi. - Intervyu: "Kutubxona qanday ishlashini qanday bilasiz?", "
exportsdagi shartlar nima?", "Math.randomvacrypto.getRandomValuesfarqi?".
Xulosa
node_modules— oddiy JavaScript; kirish nuqtasiexportsda,import.meta.resolve— aniq javob.exportsshartlari: Node —default(index.js), brauzer bundler'i —browser(index.browser.js); ichki fayllar yopiq (ERR_PACKAGE_PATH_NOT_EXPORTED).- Avval qisqa versiya:
nanoid()=getRandomValues+& 63+ 64 belgili alifbo (teng taqsimot). - npm'dagi kod izohsiz bo'lishi mumkin — asl manba
gitHeaddagi commitda; GitHub code search xato matnini tez topadi. .d.ts— va'da; F12 o'rniga "Go to Source Definition"; testlar — chegaraviy holatlar hujjati.
Keyingi dars: Ishlatilmagan kod va bog'liqliklarni topish: knip — vazifalar da hech kim ishlatmayotgan eksportlarni knip topadi; 15-qismda yozgan ApiKlient turimiz ham ro'yxatda bo'ladi.
Manbalar
- nanoid: npm (6.0.2), manba 6.0.2 — gitHead, repo, commit c0d01e3
- Node.js: import.meta.resolve, Conditional exports
- MDN: Crypto.getRandomValues()
- GitHub: Understanding GitHub Code Search syntax
- TypeScript 4.7: Go to Source Definition
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!