Skip to content

pengooseDev/goose_module

Repository files navigation

๐Ÿง Goose module

๐Ÿ“ฆ A guide to creating and publishing your first npm package.

jotai | theme | funnel | goostate | pinterest


IMAGE

* Illustration created by ๆฒขๅบต

npm : KO | EN | JA
Creation guide: KO | EN | JA

1. ํŒจํ‚ค์ง€ ์ƒ์„ฑ

๋จผ์ €, npm init ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•ด์š”.

> npm init

๋ชจ๋“  ์„ค์ •์„ ์ง€๊ธˆ ์™„๋ฃŒํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ƒ์„ฑ ํ›„ package.json ํŒŒ์ผ์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์—ฌ ํ•„์š”ํ•œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ง€์š”! :)

Typescript ์‚ฌ์šฉ

Typescript๋ฅผ ํŒจํ‚ค์ง€์— ์ ์šฉํ•˜๋ ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐœ๋ฐœ ์˜์กด์„ฑ์œผ๋กœ Typescript์™€ Node.js ํƒ€์ž… ์ •์˜๋ฅผ ์„ค์น˜ํ•ด์ค˜์š”!

> npm install --save-dev typescript @types/node

2. package.json ์„ค์ •

package.json ํŒŒ์ผ์€ ํŒจํ‚ค์ง€์˜ ์ •๋ณด์™€ ์˜์กด์„ฑ์„ ์ •์˜ํ•ด์š”. ์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”!

"build": "tsc"๋Š” Typescript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ package.json์— ์ถ”๊ฐ€๋˜๋Š” ์˜ต์…˜์ด์—์š”! :)

{
  "name": "module-name",
  "version": "1.0.0",
  "description": "",
  "main": "lib/index.js",
  "files": ["lib"],
  "types": "lib/index.d.ts",
  "private": false,
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "tsc"
  },
  "author": "pengoose",
  "license": "MIT",
  "devDependencies": {
    "@types/node": "^20.3.3",
    "typescript": "^5.1.6"
  }
}

tsconfig์„ค์ • (Typescript ์‚ฌ์šฉ ์‹œ)

Typescript ํ”„๋กœ์ ํŠธ์—์„œ tsconfig.json ํŒŒ์ผ์„ ํ†ตํ•ด ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. :)

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "outDir": "./lib",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"]
}

3. ์ฝ”๋“œ ์ž‘์„ฑ

๋ณธ์ธ์˜ ์•„์ด๋””์–ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„์—์š”! :) "๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ"๋‚˜ "๋ชจ๋“ˆ"์„ ๋งŒ๋“ ๋‹ค๊ณ  ๋„ˆ๋ฌด ๊ฒ์„ ๋จน์„ ํ•„์š”๋Š” ์—†์–ด์š”!

๋ชจ๋“ˆ์„ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์€, ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ ์–ด๋А ํ”„๋กœ์ ํŠธ์—์„œ๋“  ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐฐํฌํ•˜๋Š” ํ–‰์œ„๋ฅผ ์˜๋ฏธํ•ด์š”.

ํ‰์†Œ์— ์ž์ฃผ ์“ฐ๋Š” ์ปค์Šคํ…€ ํ›…์ด๋‚˜, ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ฝ”๋“œ, ๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์˜ˆ์‹œ๋“ค ๋ชจ๋‘๊ฐ€ ๋ฉ‹์ง„ ๋ชจ๋“ˆ์ด ๋  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

  • ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: ์ž…๋ ฅ๊ฐ’์ด ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ์ง‘ํ•ฉ
  • ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜: ์ •๋ ฌ, ํƒ์ƒ‰ ๋“ฑ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ชจ์•„ ๋†“์€ ๋ชจ๋“ˆ
  • API ์š”์ฒญ ๋ž˜ํผ: ํŠน์ • API์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์‰ฝ๊ฒŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๋ž˜ํ•‘ํ•œ ํ•จ์ˆ˜
  • UI ์ปดํฌ๋„ŒํŠธ: ๋ฒ„ํŠผ, ํผ, ๋‹ค์ด์–ผ๋กœ๊ทธ ๋“ฑ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UI ์ปดํฌ๋„ŒํŠธ

์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜๊ณ  ๋ฉ‹์žˆ๋Š” ์ผ์ด์ฃ ? ๐Ÿฅณ

4. readme ์ž‘์„ฑ

์ด์ œ ๋ชจ๋“ˆ์˜ ์‚ฌ์šฉ๋ฒ•์„ ๋ฌธ์„œํ™” ํ•  ์‹œ๊ฐ„์ด์—์š”! ๋‹น์‹ ์ด ๋งŒ๋“  ๋ฉ‹์ง„ ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์นœ์ ˆํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”.

readme ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”!

  • ๋ชจ๋“ˆ์˜ ์„ค๋ช…: ์ด ๋ชจ๋“ˆ์ด ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”์ง€ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”. ์‚ฌ์šฉ์ž๊ฐ€ ์ด ๋ชจ๋“ˆ์ด ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!
  • ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•: ์ด ๋ชจ๋“ˆ์„ ์–ด๋–ป๊ฒŒ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ƒ์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”!
  • ์˜ˆ์ œ ์ฝ”๋“œ: ์‹ค์ œ๋กœ ์ด ๋ชจ๋“ˆ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ดํ•ดํ•˜๋Š”๋ฐ ๋งŽ์€ ๋„์›€์ด ๋  ๊ฑฐ์—์š”. :)
  • API ๋ฌธ์„œ: ๋ชจ๋“ˆ์ด ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ๋ฉ”์†Œ๋“œ, ๊ทธ๋ฆฌ๊ณ  ์ด๋“ค์˜ ์ธ์ž์™€ ๋ฐ˜ํ™˜๊ฐ’ ๋“ฑ์„ ์ƒ์„ธํ•˜๊ฒŒ ๋ฌธ์„œํ™”ํ•ด์ฃผ์„ธ์š”!

์ด๋ ‡๊ฒŒ ๋ฌธ์„œ๋ฅผ ์ž˜ ์ž‘์„ฑํ•˜๋Š” ์—ฐ์Šต์€ ๋‹น์‹ ์˜ ์ฝ”๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋กœ์„œ "ํ˜‘์—… ๋Šฅ๋ ฅ"์„ ํ‚ค์šฐ๋Š”๋ฐ๋„ ํฐ ๋„์›€์ด ๋  ๊ฑฐ์—์š”. ๋„ˆ๋ฌด ๊ฒ๋จน์ง€ ๋ง๊ณ  ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? :)

5. build

Typescript ๋˜๋Š” Babel์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ณผ์ •(build)์„ ๊ฑฐ์ณ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•ด์•ผ ํ•ด์š”!

> npm run build

์ด ๋ช…๋ น์–ด๋Š” ์œ„์—์„œ ์ž‘์„ฑํ•œ tsconfig.json์— ๋”ฐ๋ผ, ๋นŒ๋“œ๋œ ํŒŒ์ผ๋“ค์ด ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ lib ํด๋” ๋‚ด์— ์ƒ์„ฑ๋˜๊ฒŒ ๋˜์–ด์žˆ์–ด์š”.

6. ๋ฐฐํฌ ๐Ÿš€

npm ๋ชจ๋“ˆ์„ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, npm์—์„œ ๊ณ„์ •์„ ์ƒ์„ฑํ•ด์•ผ ํ•ด์š”!

๊ณ„์ • ์ƒ์„ฑ์„ ๋งˆ์ณค๋‹ค๋ฉด, ํ„ฐ๋ฏธ๋„์—์„œ npm login ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค :)

npm ๋กœ๊ทธ์ธ

> npm login

npm login image

npm ํŒจํ‚ค์ง€ ๋ฐฐํฌ

๋กœ๊ทธ์ธ์ด ์™„๋ฃŒ๋˜๋ฉด, npm publish ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐํฌํ•ด์š”.

> npm publish

๋‹จ, package.json์˜ version ํ•„๋“œ๊ฐ€ ์ด์ „์— ๋ฐฐํฌ๋œ version๋ณด๋‹ค ๋†’์•„์•ผ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์š”!

{
  "version": "1.0.0" // ์ด์ „์— ๋ฐฐํฌ๋œ version
}
{
  "version": "1.0.1" // ์ƒˆ๋กœ์šด version (๋ฌธ์„œ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ์—๋„)
}

๐ŸŽ‰ ์ถ•ํ•˜ํ•ด์š”! ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ฉ‹์ง„ ํŒจํ‚ค์ง€๊ฐ€ npm์— ๊ณต๊ฐœ๋˜์—ˆ์–ด์š”! ๐Ÿฅณ ์ด์ œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

์•ž์œผ๋กœ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ๋“  ๋ฉ‹์ง„ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ณ , ๊ทธ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ”ํƒ•์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์ด ์‹œ์ž‘๋ ๊ฑฐ์—์š”. :) (๋‘๊ทผ๊ฑฐ๋ฆฌ์ง€ ์•Š๋‚˜์š”?)

์˜ˆ๋ฅผ ๋“ค์–ด, ๊นƒํ—ˆ๋ธŒ์˜ issue ํƒญ์—์„œ ์‚ฌ์šฉ์ž๋“ค์˜ ๋ฌธ์ œ์ ์„ ๋“ค์„ ์ˆ˜ ์žˆ๊ณ , feature ์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”! ๋˜ํ•œ, Pull Request(PR)๋ฅผ ํ†ตํ•ด, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๋„์›€์„ ๋ฐ›์•„ ๋” ๋ฉ‹์ง„ ์ฝ”๋“œ๋กœ ์„ฑ์žฅ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

์—ฌ๋Ÿฌ๋ถ„๋“ค์˜ ์ฒซ ํŒจํ‚ค์ง€ ๋ฐฐํฌ๋ฅผ ์ถ•ํ•˜ํ•˜๋ฉฐ, ๋Š์ž„์—†์ด ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž์˜ ๊ธธ์„ ํ•ญ์ƒ ์‘์›ํ•ด์š”! :)

์ฒซ ๋ฐฐํฌ ๊ณผ์ •์„ ํ•จ๊ป˜ํ•˜๊ฒŒ ๋˜์–ด ์˜๊ด‘์ด์—ˆ์–ด์š”! ๐Ÿฅฐ


์ถ”๊ฐ€ ํŒ!

yarn ๋ฐฐํฌ ์ถ”๊ฐ€ํ•˜๊ธฐ

package.json์˜ "private"๋ผ๋Š” filed๋ฅผ false๋กœ ์„ค์ •ํ•˜๋ฉด yarn์œผ๋กœ๋„ ํ•ด๋‹น ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์–ด์š” :)

{
  "private": false
}

"private": false,

๋ชจ๋“ˆ ์ด๋ฆ„์— "@" ๋„ฃ๊ธฐ

๋ชจ๋“ˆ์— "@"๊ฐ€ ๋“ค์–ด๊ฐ„์ฑ„๋กœ npm publish๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ๋˜๋ฉด, npm์ด ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ๋น„๊ณต๊ฐœ ํŒจํ‚ค์ง€๋กœ ์ธ์‹ํ•ด ์œ ๋ฃŒ ๊ฒฐ์ œ๋ฅผ ํ•˜๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด์š”.

ํ•ด๋‹น ์ €์žฅ์†Œ๊ฐ€ ๊ณต๊ฐœ๋˜์–ด์žˆ๋Š” ํŒจํ‚ค์ง€๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•ด์š”.

> npm publish --access=public

TS ๋ชจ๋“ˆ ๋ช…์‹œํ•˜๊ธฐ

package.json์˜ "type"๋ผ๋Š” filed๋ฅผ "index.d.ts"๋กœ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ์ด TS๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฆด ์ˆ˜ ์žˆ์–ด์š”. :)

{
  "types": "index.d.ts"
}

npm ํŽ˜์ด์ง€ ์ €์žฅ์†Œ ์—ฐ๋™ํ•˜๊ธฐ

package.json์˜ "repository"๋ผ๋Š” field๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•˜๋ฉด ์ €์žฅ์†Œ๋ฅผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์–ด์š”.

"repository": {
  "type": "git",
  "url": "repositoryURL"
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published