๐ค ์์งlog ๐ค
TypeScript๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ง๋ค๊ธฐ ๋ณธ๋ฌธ
์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ํ์ง๋ง๊ณ ์ฐ๋ฆฌ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์๊ณ ํ์ฌ
๋ด๊ฐ ๋งก๊ฒ๋์๋๋ฐ ..
์ด๋ณด ๊ฐ๋ฐ์ ์ ์ฅ์์๋ ๋ํต ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๊ฒ ๊ณ ์ด๋์ ๋ถํฐ ์ด๋ป๊ฒ ์์ํ๋์ง๋ ๊ฐ์ด ์์์
์ฌ๊ธฐ์ ๊ธฐ ๊ฒ์ํด๋ณด๊ณ ๋์ด๋ชจ์ ์ ๋ณด๋ก ์์ฑํ๊ฒ ๋์๋ค.
์ด๊ฒ ์ ๋ต์ด๋ผ๊ณ ๋ ํ ์ ์์ง๋ง ๋น์ทํ ์ํฉ์ด์ ๋ถ๋ค์๊ฒ ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ๋จ ๐ฅ
๐ฉ๐ป๐ป NPM Package๋ฅผ ์์ฑํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฑด
๋์ผํ๊ธฐ์ ๊ด๋ จ ๊ธ ์ฐธ๊ณ ๋ฐ๋๋๋ค. ๐ฉ๐ป๐ป
- NPM ํ์ ๊ฐ์ ํด์ฃผ๊ธฐ
- ํ์๊ฐ์ ์ e-mail ์ธ์ฆ ํ์ (์ธ์ฆํ์ง ์์ผ๋ฉด ๋ฐฐํฌ๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.)
๐ Package ์ค์
์ ๋ React (create-react-app) + TypeScript์ ์ฌ์ฉํ์ฌ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
์์ฆ ํ๋ก์ ํธ๋ค์ ๋๋ถ๋ถ TypeScript๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ TypeScript๋ฅผ ์ง์ํด์ฃผ์ง ์๋๋ค๋ฉด ๋ค๋ฅธ ์ฌ์ฉ์๋ค์ด ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ธ์ด๋ JavaScript๊ฐ ์๋ TypeScript๋ฅผ ํตํด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ ์ข์ต๋๋ค.
๋ณธ์ธ์ ํฐ๋ฏธ๋์ ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์.
[ํ๋ก์ ํธ ๋ช ] ์๋ ๋ง๋ค๊ณ ์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํด๋๋ช ์ ์์ฑํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
npx create-react-app [ํ๋ก์ ํธ ๋ช
] --template typescript
์ฌ์ง๊ณผ ๊ฐ์ด ํด๋ ๋ด์ ์์ฑ๋ ๊ฒ์ ๋ณด์ค ์ ์์ ๊ฒ๋๋ค.
tsconfig.json ์์ Npm์ ํ์ ์คํฌ๋ฆฝํธ๋ก ๋ฐฐํฌํ๊ธฐ ์ํด์
๋ช ๊ฐ์ง ์ค์ ์ ํด์ผ ํฉ๋๋ค.
"compilerOptions": {
"target": "es5", // 'es3', 'es5', 'es2015', 'es2016', 'es2017','es2018', 'esnext' ๊ฐ๋ฅ
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true, // js ํ์ผ๋ค ts์์ importํด์ ์ธ ์ ์๋์ง
"checkJs": true, // ์ผ๋ฐ js ํ์ผ์์๋ ์๋ฌ์ฒดํฌ ์ฌ๋ถ
"skipLibCheck": true,
"esModuleInterop": true,
"removeComments": true, //์ปดํ์ผ์ ์ฃผ์์ ๊ฑฐ
"allowSyntheticDefaultImports": true,
"strict": true, //strict ๊ด๋ จ, noimplicit... ๊ด๋ จ ๋ชจ๋ ์ ๋ถ ์ผ๊ธฐ
"forceConsistentCasingInFileNames": true,
"noFallthroughCasesInSwitch": true, //switch๋ฌธ ์ด์ํ๋ฉด ์๋ฌ๋ด๊ธฐ
"module": "esnext", //๋ฌด์จ import ๋ฌธ๋ฒ ์ธ๊ฑด์ง 'commonjs', 'amd', 'es2015', 'esnext'
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": false,
"jsx": "react-jsx", // tsx ํ์ผ์ jsx๋ก ์ด๋ป๊ฒ ์ปดํ์ผํ ๊ฒ์ธ์ง 'preserve', 'react-native', 'react'
"declaration": true, //์ปดํ์ผ์ .d.ts ํ์ผ๋ ์๋์ผ๋ก ํจ๊ป์์ฑ (ํ์ฌ์ฐ๋ ๋ชจ๋ ํ์
์ด ์ ์๋ ํ์ผ)
"outDir": "./dist", //jsํ์ผ ์์ํ ๊ฒฝ๋ก๋ฐ๊พธ๊ธฐ
"outFile": "./", //๋ชจ๋ tsํ์ผ์ jsํ์ผ ํ๋๋ก ์ปดํ์ผํด์ค (module์ด none, amd, system์ผ ๋๋ง ๊ฐ๋ฅ)
"noImplicitAny": true, // any๋ผ๋ ํ์
์ด ์๋์น์๊ฒ ๋ฐ์ํ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ๋์์ฃผ๋ ์ค์
"strictNullChecks": true, // null, undefined ํ์
์ ์ด์ํ ์กฐ์ํ๋ฉด ์๋ฌ๋ฅผ ๋์ฐ๋ ์ค์
"strictFunctionTypes": true, //ํจ์ํ๋ผ๋ฏธํฐ ํ์
์ฒดํฌ ๊ฐํ๊ฒ
"strictPropertyInitialization": true, //class constructor ์์ฑ์ ํ์
์ฒดํฌ ๊ฐํ๊ฒ
"noImplicitThis": true, //this ํค์๋๊ฐ any ํ์
์ผ ๊ฒฝ์ฐ ์๋ฌ๋ด๊ธฐ
"alwaysStrict": true, //์๋ฐ์คํฌ๋ฆฝํธ "use strict" ๋ชจ๋ ์ผ๊ธฐ
"noUnusedLocals": true, //์ฐ์ง์๋ ์ง์ญ๋ณ์ ์์ผ๋ฉด ์๋ฌ๋ด๊ธฐ
"noUnusedParameters": true, //์ฐ์ง์๋ ํ๋ผ๋ฏธํฐ ์์ผ๋ฉด ์๋ฌ๋ด๊ธฐ
"noImplicitReturns": true //ํจ์์์ return ๋นผ๋จน์ผ๋ฉด ์๋ฌ๋ด๊ธฐ
}
โ ๊ฐ๋ฐ ์ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ๋ค๊ณผ ์ค๋ช ์ฐธ๊ณ ํ์ธ์.
๋ณธ์ธ์ด ํ์ํ ๊ฒ๋ค๋ง ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
์ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ํ ์ต์ํ์ ์ค์ ๋ง ํ๊ฒ ์ต๋๋ค.
{
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noFallthroughCasesInSwitch": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": false,
"jsx": "react-jsx",
"declaration": true,
"outDir": "./dist"
},
"include": ["./src/lib/**/*.tsx", "./src/lib/**/*.ts"]
}
1. "noEmit": false
noEmit ์ต์
์ ์ถ๋ ฅ์ ๋ด๋ณด๋ด์ง ์๋๋ค๋ ์ค์ ์
๋๋ค.
npm ๋ฐฐํฌ๋ฅผ ํ๊ธฐ ์ํด์๋ ๋ด๊ฐ ๋ง๋ ์ปดํฌ๋ํธ ํน์ ํ์ผ์ด ์ถ๋ ฅ์ผ๋ก ๋์์ผ ํฉ๋๋ค.
2. "declaration": true
. d.tsํ์ผ์ ์์ฑํ ๊ฒ์ธ์ง์ ๋ํ ์ต์
์
๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ง์ํ๊ธฐ ์ํด์๋ ํด๋น ์ต์
์ true๋ก ์ฃผ์ด์ผ ํฉ๋๋ค.
3. "outDir": "./dist"
tsc ๋ช
๋ น์ด๋ก ์ปดํ์ผ๋ ํ์ผ๋ค์ด ์ด๋์ ์์นํ ๊ฒ์ธ์ง์ ๋ํ ์ต์
์
๋๋ค.
dist ํด๋์ ๋๊ธฐ ์ํด์ ์์ ๊ฐ์ด ์์ฑํฉ๋๋ค.
4. "include" ์์ฑ
tsc ๋ช
๋ น์ด๋ก ์ปดํ์ผํ ํ์ผ์ด ์ด๋์ ์์นํ๋์ง๋ฅผ ๋ช
์ํด์ฃผ๋ ์ต์
์
๋๋ค.
์ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐํ ์์น๋ฅผ src ํด๋์์ lib ํด๋๋ฅผ ์์ฑํด์ ๊ทธ ์์์ ๊ฐ๋ฐ์ ํ ๊ฒ๋๋ค. ๊ทธ๋์ ์๋์ ๊ฐ์ด ์์ฑ์ ํฉ๋๋ค.
"include": ["./src/lib/**/*.tsx", "./src/lib/**/*.ts"]
์ด ์ธ์ ์ต์ ๋ค์ ๋ํด์๋ ์ ํ์ ์ ๋๋ค.
์ถ๊ฐ ์ ์ผ๋ก ํ์ํ ์ต์ ์ด ์์ผ์๋ค๋ฉด ์ฐธ๊ณ ํ์ธ์.
tsconfig.json์ ์์ ์ ๋ง์ณค๋ค๋ฉด package.json์ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
package.json์๋ ๋ด๊ฐ ๋ฐฐํฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๋ณด๋ค์ ์ ์ด์ฃผ๊ณ ,
๋ฐฐํฌํ ํ์ผ๋ค์ ์๋ํฌ์ธํธ๋ค์ ์ ์ด์ค๋๋ค.
๊ผญ ๋ณ๊ฒฝํด์ผ ํ๋ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. "name"
์ ์ผ ์ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฆ์ ์ ์ด์ฃผ์ด์ผ ํฉ๋๋ค.
์ด๋ฏธ ์กด์ฌํ๋ ํจํค์ง ์ด๋ฆ์ด๋ผ๋ฉด ์ค๋ณต์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฆ์ ๋ด๊ฐ ๋ง๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ฅ ์ ํํํ๊ณ ์ฐพ๊ธฐ ์ฌ์ด ์ด๋ฆ์ ์๊ฐํด๋ณด์ธ์.
npm info <Package Name>
์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณต ํ์ธ์ ํด๋ด์ผ ํฉ๋๋ค.
์ค๋ณต๋ ์ด๋ฆ์ด๋ผ๋ฉด ์ด๋ฏธ ๋ฐฐํฌ๋ ํจํค์ง์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๊ณ ,
์ค๋ณต๋์ง ์์ ์ด๋ฆ์ด๋ผ๋ฉด ์ ๋ณด๊ฐ ์๊ธฐ์ 404 ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
โ 404 ์๋ฌ๊ฐ ๋์ค๋ฉด ์์ฑํ ์ ์๋ ํจํค์ง ์ด๋ฆ์ ๋๋ค. โ
2. "description"
ํ๋ก์ ํธ ์ค๋ช
์ผ๋ก, ๋ฌธ์์ด๋ก ๊ธฐ์ ํฉ๋๋ค.
npm search๋ก ๊ฒ์๋ ๋ฆฌ์คํธ์ ํ์๋๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด ํจํค์ง๋ฅผ ์ฐพ์๋ด๊ณ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
// ์์์
๋๋ค
"description": "Very Very Awesome Component"
3. "version"
"version": "0.0.1"
์ฐ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ ์ ๋ช
์ํ๋ ๊ณณ์
๋๋ค.
๋ฒ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก major.minor.patch (0.0.1)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฏธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ์ด ์๋ฃ๋์๊ณ , ๋ฐฐํฌ๋ง์ ๋จ๊ฒจ๋ ์ํฉ์ด๋ผ๋ฉด 1.0.0์ ์ฌ์ฉํฉ๋๋ค.
์์ง ๊ฐ๋ฐ ์ค์ด๊ณ , ์๋ฒฝํ์ง ์๋ค๋ฉด 0.0.1์ ์ง์ ํ์ฌ ์์ ์ ์ธ ๋ฒ์ ์ด ์๋์ ๋ช ์ํฉ๋๋ค.
โ ๏ธ์ฃผ์โ ๏ธ ํจํค์ง๋ฅผ ์์ ํ ํ npm์ ๋ฐฐํฌํ ๋๋ ๋ฒ์ ์ ๋ฌด์กฐ๊ฑด ์ฌ๋ ค์ ๋ฐฐํฌํด์ผ ํฉ๋๋ค.
์ ๊ทธ๋ฌ๋ฉด ๋ฒ์ ์ด ๊ฒน์ณ์๋ค๊ณ ์๋ฌ๊ฐ ๋น๋๋ค.
package.json์ version ๋ช ์ํ๋ ๋ฒ์ด ๋ ์๊ณ ์ถ์ผ์๋ค๋ฉด ์ฐธ๊ณ ํ์ธ์.
4. "private"
"private": false
์ค์ ์ ์ฅ์์ธ npm์ ์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐฐํฌํ๊ธฐ ์ํด private ์ต์ ์ false๋ก ๋ณ๊ฒฝํด์ฃผ์ธ์.
5. "main"
"main": "dist/index.js"
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ง์
์ ํ์ผ์ ๋ช
์ํด์ฃผ๋ ๊ณณ์
๋๋ค.
์ ๋ dist ํด๋๋ก ์์ฑํด์ ๋ฐฐํฌํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
dist ํด๋์ ์๋ index.js ํ์ผ๋ก ๋ช
์ํด์ฃผ์ธ์.
(typescript ํ์ผ์ tsc ๋ช
๋ น์ด๋ฅผ ํตํด์ js๋ก ๋ณํ๋ฉ๋๋ค.)
6. "types"
"types": "dist/index.d.ts"
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ํ๊ธฐ ์ํด์ ํ์ ์ถ๋ก ์ ๋์์ฃผ๋ ์ง์ ์ ํ์ผ์ ๋ช ์ํด์ค๋๋ค.
โ ๏ธ์ฃผ์โ ๏ธ package.json์ด "files" ํ๋กํผํฐ๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉด "types" ํ๋กํผํฐ๋ ๋ฌด์๋ฉ๋๋ค.
์ด ๊ฒฝ์ฐ ๋ฉ์ธ ์ ์ธ ํ์ผ์ "files" ํ๋กํผํฐ์ ์ ๋ฌํด์ผ ํฉ๋๋ค.
7. "browser"
"browser": "./browser/specific/main.js"
์ฐ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ์์ ๊ตฌ๋๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํด์ผ ํ๊ธฐ ๋๋ฌธ์ browser ํ๋๋ ์ค์ ํด์ผ ํฉ๋๋ค.
ํด๋ผ์ด์ธํธ(client-side) ์ฌ์ฉ์ ์ํ๋ ๊ฒฝ์ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค๋ฌ ๋๋ ๊ตฌ์ฑ ์์ ๋๊ตฌ์ ๋ํ ํํธ๋ก ์ ๊ณตํ๊ธฐ ์ํด main ์ต์
(field) ๋์ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
8. "keywords"
๋ณธ์ธ์ ํจํค์ง๋ฅผ ๋ค๋ฅธ ์ฌ์ฉ์๋ค์ด ๊ฒ์ํ ๋ ์ฐธ์กฐ๋๋ ํค์๋์ ๋๋ค.
(ํด์ํ๊ทธ# ๊ฐ์ ๊ฐ๋
์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.)
description๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก npm search๋ก ๊ฒ์๋ ๋ฆฌ์คํธ์ ํ์๋ฉ๋๋ค.
// ์์์
๋๋ค
"keywords" : ["react", "component", "library", "scroll"]
9. "scripts"
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"prepare": "rm -rf dist && mkdir dist && tsc"
},
prepare ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํด๋์์ผ ํฉ๋๋ค.
1. rm -rf dist ๋ช ๋ น์ด๋ก distํด๋๋ฅผ ์ญ์ ํ๊ณ
2. mkdir dist ๋ช ๋ น์ด๋ก ๋ค์ dist ํด๋๋ฅผ ๋ง๋ค๊ณ
3. ๋ค์ ๋ง๋ค์ด์ง ํด๋์ tsc ๋ช ๋ น์ด๋ก ์ปดํ์ผ์ ์งํํด์ ๋์จ ํ์ผ๋ค์ dist์ ๋ฃ๋ ๊ณผ์ ์ ๋๋ค.
npm ๋ฐฐํฌ๋ฅผ ํ๊ธฐ ์ ์ ์คํํ๋ ๋ช ๋ น์ด์ ๋๋ค.
10. "author"
"author": "eun-ji <eun_ji_zz@naver.com>",
ํ๋ก์ ํธ ์์ฑ์ ์ ๋ณด๋ก, ํ ์ฌ๋๋ง์ ์ง์ ํฉ๋๋ค. ๋ณดํต Name <Email Address> ํ์์ผ๋ก ์์ฑํฉ๋๋ค.
11. "repository"
ํ๋ก์ ํธ์ ์์ค ์ฝ๋๋ฅผ ์ ์ฅํ ์ ์ฅ์์ ์ ๋ณด์
๋๋ค.
์์ค ์ฝ๋์ ์ฐธ์ฌํ๊ณ ์ ํ๋ ์ฌ๋๋ค์๊ฒ ๋์์ด ๋ ์ ์์ต๋๋ค.
โ ํ๋ก์ ํธ์ ํํ์ด์ง url์ ๋ช ์ํด์๋ ์ ๋ฉ๋๋ค.
// ์์์
๋๋ค.
"repository" : {
"type": "git",
"url" : "git://gitbub.com/documentcloud/test.git"
},
12. "license"
"license": "MIT",
๋ฐฐํฌํ๋ ค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ผ์ด์ ์ค์ ๋๋ค.
์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ผ์ด์ ์ค์ ๋ง๊ฒ ์์ฑํฉ๋๋ค. ex) MIT, ISC ๋ฑ
๋ผ์ด์ ์ค์ ํค์๋์ ๊ดํด์ ์ถ๊ฐ์ ์ธ ์ฌํญ์ ์ฐธ๊ณ ๋ฐ๋๋๋ค.
๐ .npmignore
npm์ ๋ฐฐํฌํ์ง ์์ ํ์ผ์ ๋ช ์ํด์ค๋๋ค.
์ฐ๋ฆฌ๋ dist ํด๋๋ฅผ ์ ์ธํ๊ณ ๋๋จธ์ง src ํด๋, public ํด๋, tsconfig๊ณผ ๊ฐ์ ๊ฒ๋ค์
์ฐ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ์์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌ๊ธฐ๋ฅผ ํค์ธ ํ์๊ฐ ์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉ๋์ง ์๋ ํด๋๋ ํ์ผ์ ์ด๊ณณ์์ ๋ช ์ํฉ์๋ค.
โ ๋ณธ์ธ์ด ์ค์ ํ๊ณ ์ถ์ ๊ฒ๋ค๋ง ์ค์ ํ์๋ฉด ๋ฉ๋๋ค.
์๋์ ํด๋๋ ํ์ผ์ด ์ ๋ต์ ์๋๋๋ค.
node_modules/
src/
public/
tsconfig.json
๐ ๊ฐ๋ฐ ์งํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ ํด๋๋ lib์ผ๋ก tsconfig.json์์ ์ค์ ํด๋์๊ธฐ ๋๋ฌธ์
lib ํด๋๋ฅผ ์์ฑํ๊ณ , ๊ฑฐ๊ธฐ์ index.tsx ํ์ผ์ ์ฐ๋ฆฌ๊ฐ ์ต์ข
์ ์ผ๋ก ๋ณด๋ด๊ณ ์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ด๋ณด๋ด๋ฉด ๋ฉ๋๋ค.
๐ ๏ธ ๊ฐ๋ฐ ๊ณผ์ ์์ CSS-in-JS๊ฐ ์๋ CSS, SASS, SCSS๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ฌ๋ฌ๊ฐ์ง ์ ์ฒ๋ฆฌ(webpack)๋ฅผ ํด์ฃผ์ด์ผ ํ๊ณ ,
๊ฐ๋ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊ณผ์ ์์กด์ฑ(Dependencies)๋ ์๊ฐํด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ๋ค๋ฅธ ํธ์์ฑ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ฉด ์ฌ๋ฌ ์ค์ (๊ฒ์ํด๋ณด์๊ธธ..๐งโ๏ธ)๋ ๋ฐ๊ฟ์ฃผ์ด์ผ ํฉ๋๋ค. ๐ ๏ธ
๐ฆsrc
โฃ ๐lib
โฃ ๐[Component]
โ โ ๐index.tsx
โ ๐index.tsx
ํด๋์ ๊ตฌ์กฐ๋ ๋๋ต ์ด๋ ๊ฒ ์๊ฒผ๊ณ ,
[Component] ๋ด์ index.tsx ํ์ผ์ ์์ฑํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋๊ฐ ๋ด๋ณด๋ด์ง๋ ํ์ผ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ด๋ณด๋ผ ๊ฐ๋ฅ์ฑ์ ์๊ฐํด, src/lib/index.tsx ํ์ผ์ ์ถ๊ฐ๋ก ๋ง๋ค๊ณ ์ต์ข ์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ด๋ณด๋ด๊ฒ๋ ํ์์ต๋๋ค.
ํ์์ ๊ฒฝ์ฐ์๋ ํ๋ก์ ํธ ํ ์ด๋ฆ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ index.tsx ํ์ผ๊ณผ svg ํ์ผ์ ๋ด์ assets๋ฅผ ์ค์ ํด๋์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ src/lib/index.tsx ์๋ export default๋ฅผ ํด์ฃผ์์ต๋๋ค.
๊ฐ๋ฐ์ ์งํํ๋ฉด์ ๋ ๋ง์ ์ปดํฌ๋ํธ๊ฐ ์๊ธด๋ค๋ฉด src/lib/index.tsx ์ export ํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
๐ ๊ฐ๋ฐ ์งํ ์ ์ฐธ๊ณ ํ๊ธฐ
๐ก ํ์ ์คํฌ๋ฆฝํธ์์ styled-components ์ฌ์ฉ ์,
// styled-components ๊ฐ ์ค์น๊ฐ ์๋์ด ์๋ค๋ฉด
npm i styled-components
// ํ์
์คํฌ๋ฆฝํธ - ํ์
์ ์ ๋ฐ๊ธฐ
npm i -D @types/styled-components
๊ธฐ์กด JavaScript์์ styled-components ์ฌ์ฉํ์ จ์ด๋ TypeScript๋ก ์งํ ์์๋
ํ์ ์ ์๋ฅผ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
๐ก ํ์ ์คํฌ๋ฆฝํธ์์ svgํ์ผ import ๋ฌธ์ ๋ฐ์ ์,
// custom.d.ts
declare module '*.svg' {
import React = require('react');
export const ReactComponent: React.FC<React.SVGProps<SVGSVGElement>>;
const src: string;
export default src;
}
custom.d.ts ํ์ผ์ ๋ง๋ค๊ณ ํ์ผ ๋ด์์ ๋ชจ๋ svgํ์ผ์ ๋ํด ์์ฑ์ ์ค์ ํด ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ts ์ปดํ์ผ๋ฌ๊ฐ ts|tsx ํ์ฅ์ ์ฒ๋ฆฌํ๋๋ก tsconfig.json ๋ด์ "include" ์์ฑ์ custom.d.ts๋ฅผ ํธ์ถํ๋๋ก ์ค์ ํด์ค๋๋ค.
๐ก ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ SCSS, SASS์ ๊ฐ์ ํ์ผ๋ค์ Webpack ์ค์ ์ด ํ์ํฉ๋๋ค.
๋์์ธ์ด ๋ง์ด ์๊ตฌ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ฉด CRA๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋น์ถํฉ๋๋ค.
CRA๋ sass-loader๊ฐ ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ก์ปฌ์์ ํ
์คํธ๋ฅผ ํ ๋๋ ๋ชจ๋ฆ
๋๋ค.
ํ์ง๋ง ๋ฐฐํฌ๋ฅผ ํ๊ณ ๋์ ํ
์คํธ๋ฅผ ํด๋ณด๋ฉด sass ํ์ผ์ ์ฐพ์ง ๋ชปํ๋ค๊ณ ์๋ฌ๋ฅผ ๋ฑ์ต๋๋ค.
sass, scss loader ๊ฐ์ ์ค์ ๋ค์ webpack์ ํด์ฃผ์ด์ผ ํ์ง๋ง, CRA๋ webpack ์ค์ ํ๊ธฐ๊ฐ ๋๋ฌด ํ๋ญ๋๋ค.
๐ฑ
์ด๋ ๊ฒ ํ๋ฉด ์ฐ๋ฆฌ๋ npm์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ด๋ณด๋ผ ์ค๋น๊ฐ ๋์์ต๋๋ค.
๐ Build ๋ฐ NPM ๋ฐฐํฌ ํ๊ธฐ
์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๋ ํ, NPM์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์งํํ๊ฒ ์ต๋๋ค.
NPM์ ์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ํด์๋, ์๋์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก๊ทธ์ธ์ ํ๊ธฐ ์ํ ์ ์ฐจ๊ฐ ์คํ๋ฉ๋๋ค.
npm login
NPM ๊ณ์ ์ ์ ๋ณด๋ฅผ ์ ๋ ฅํ์ฌ ๋ก๊ทธ์ธํฉ๋๋ค.
์ ์ ๋ค์, ํจ์ค์๋, ์ด๋ฉ์ผ ์ฃผ์๊น์ง ์ ๋ ฅํ ํ ํด๋น ๋ฉ์ผ์ ๋ฐ์ก๋ ์ผํ์ฑ OTP ๋ฒํธ๋ฅผ ์ ๋ ฅํ์๋ฉด ๋ฉ๋๋ค.
๋ก๊ทธ์ธ์ ํ์๋ค๋ฉด ์๋์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ์ ๋๋ก ๋ก๊ทธ์ธ๋์๋์ง ํ์ธํฉ๋๋ค.
npm whoami
๋ก๊ทธ์ธ๊น์ง ์๋ฃ๋์๋ค๋ฉด ์๋์ ๋ช ๋ น์ด๋ฅผ ํตํด ์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ NPM์ ๋ฐฐํฌํฉ๋๋ค.
npm publish
package.json๋ด์ ์ค์ ํด๋์๋
"scripts": {
"prepare": "rm -rf dist && mkdir dist && tsc"
}
์ด ์คํ๋๋ฉด์ dist ํด๋๊ฐ ์์ฑ๋๊ณ ์ปดํ์ผ์ ์งํํด์ ๋์จ ํ์ผ๋ค์ /dist์ ๋ฃ์ด์ฃผ๋ ๊ณผ์ ๋ ์งํ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๐ฅ ์ด๋ ๊ฒ ํด์ TypeScript๋ก NPM Package๋ฅผ ๋ง๋ค์ด
์์ ์ Library๋ฅผ ์์ฑ๋ถํฐ_๋ฐฐํฌ๊น์ง ํ๋ ๋ฒ์ ์งํํด๋ณด์์ต๋๋ค. ๐ฅ
๐ ๐ปโ๏ธ ๋น์ฐํ์ง๋ง ์์ ๊ณผ์ ๋ค์ด ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๋ ์ ๋ต์ ์๋๋๋ค. ๐ ๐ปโ๏ธ
๐ Open Source Library ์งํ ์ ์ค์ํ ๊ฒ
โ ๊ณต์๋ฌธ์
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๋ฉด์ ์ ์ผ ์ค์์ํด์ผ ํ๋ ์์ ์ค์ ํ๋์
๋๋ค.
๊ณต์๋ฌธ์๊ฐ ์ ๋์ด์๋ค๋ฉด, ๋ค๋ฅธ ์์๋ค์ ๋ฐ๋ผ์ ์ค๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์๋ค๋ฉด ์ปดํฌ๋ํธ์ ์์ฑ์ ๋ณ๊ฒฝ์ํค๋ฉฐ ์ฌ์ฉํด๋ณผ ์ ์๋ ๊ณต์๋ฌธ์๋ฅผ ๋ง๋ค์ด๋๊ณ ,
์ฌ์ฉ๋ฐฉ๋ฒ๊ณผ ์ข ๋ฅ์ ๋ํด์๋ ์ค๋ช ์ ์ํด๋๋๋ค๋ฉด ์ฌ์ฉ์๊ฐ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์ ๊ฒ์ ๋๋ค.
โ README.md
README ํ์ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๊ตด์ ๋๋ค.
๊นํ๋ธ์์ ์ฌ์ฉ์๋ค์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐพ๊ณ , ๋งจ ์ฒ์ ๋ณด๊ฒ ๋๋ ๊ฒ์ด README ํ์ผ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณํ ์ ๊ฒฝ์ ์จ์ผ ํฉ๋๋ค.
์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฒด์ฑ์ ์ ํํํ๊ณ , ์ฌ์ฉ๋ฒ๊ณผ ์ค๋ช ์ ์ ์ด๋์๋ฉด ๋๋๋ฐ,
์์ฑํ๊ธฐ ์ด๋ ต๋ค๋ฉด ์ ๋ช ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ README๋ฅผ ์ฐธ๊ณ ํด์ ์์ฑ์ ํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
โ ๋ผ์ด์ ์ค
์ package.json ์์ฑ์์๋ ์ธ๊ธํด๋์์ง๋ง, ๋ผ์ด์ ์ค๋ 'ํด์ผ ํ ๊ฒ'๊ณผ 'ํ์ง ๋ง์์ผ ํ ๊ฒ'์ ๋ํ ์ฝ์์
๋๋ค.
์คํ์์ค๋ ๋ชจ๋์๊ฒ ๊ณต๊ฐ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ์ฝ์์ ๋๋์ฑ ์ค์ํฉ๋๋ค.
Github ๋ฌธ์์ ์ํ๋ฉด, ๋ผ์ด์ ์ค๊ฐ ์์ผ๋ฉด ๊ธฐ๋ณธ ์ ์๊ถ๋ฒ์ด ์ ์ฉ๋์ง๋ง, ๋ผ์ด์ ์ค๋ฅผ ์ ํํ๊ฒ ๋จ์ผ๋ก์จ ์ฝ๋์ ๋ชจ๋ ๊ถ๋ฆฌ๋ ๋ด๊ฐ ๊ฐ์ง๊ณ ๋ค๋ฅธ ์ฌ๋์ด ๋ด ์ฝ๋๋ฅผ ๋ณต์ , ๋ฐฐํฌ, ์ฌ์์ฐ์ ํ ์ ์์ผ๋ ์คํ์์ค ํ๋ก์ ํธ๋ ์คํ์์ค ๋ผ์ด์ ์ค๋ฅผ ์ ํํ๋ผ๊ณ ๊ถ์ฅํ๊ณ ์์ต๋๋ค.
์ฐธ๊ณ : Github license์ ์ข ๋ฅ์ ๋์๊ฒ ๋ง๋ ๋ผ์ด์ ์ค ์ ํํ๊ธฐ
โ Contribute
์คํ์์ค๋ ํผ์ ๋ง๋ค ๋ ๋ณด๋ค, ๊ฐ์ด ๋ง๋ค ๋ ๊ทธ ๊ฐ์น๊ฐ ๋์ฑ ๋น๋ฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค ๋ ์ด๋ป๊ฒ ํ๋ฉด ์ฌ๋๋ค์ด ๊ธฐ์ฌํ๊ธฐ ์ฝ๊ฒ ๊ตฌ์กฐ๋ฅผ ์งค์ง,
์ค๋ช
์ ์ด๋ป๊ฒ ํ ์ง, ์ด๋ป๊ฒ ์ปค๋ฎค๋ํฐ๋ฅผ ํ์ฑํ์ํฌ์ง์ ๋ํ ๊ณ ๋ฏผ์ ํด๋ณด๋ ๊ฒ๋ ์ค์ํ ๊ฒ ๊ฐ์ต๋๋ค.
ํผ์ ํด์ ํค์๋๊ฐ๋ ๊ฒ๋ณด๋ค๋, ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด๋๊ณ ์ฌ๋๋ค์ด ์๋ฐ์ ์ผ๋ก ๋์์ฃผ๋๋ก ๋ง๋ค์ด ๋์ผ๋ฉด ๋ด๊ฐ ๋ค์ด๋ ์๊ฐ์ ์ค์ด๋ฉด์ ๋์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋จ๋จํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
'๐ธ Library' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Npm package install์ Invalid hook call ์๋ฌ (0) | 2022.11.11 |
---|---|
NPM ๊ณผ YARN (0) | 2022.11.08 |
NPM Package Version (0) | 2022.11.07 |
NPM Package ์์ฑ ๋ถํฐ ๋ฐฐํฌ _์ง์ง์ง์ง์ต์ข ๐ (1) | 2022.11.02 |