๐Ÿงจ Vue.js npm ํŒจํ‚ค์ง€ ์ถœ์‹œํ•˜๊ธฐ

BOHYEON SEOยท2021๋…„ 7์›” 12์ผ
10

(์›๊ธ€ : Vue.js npm ํŒจํ‚ค์ง€ ํƒ„์ƒ๋น„ํ™” )

์•ˆ๋…•ํ•˜์„ธ์š”. ๋ฉ”๋””์ŠคํŠธ๋ฆผ์˜ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์„œ๋ณดํ˜„์ž…๋‹ˆ๋‹ค.

3๊ฐœ์›”์˜ ์ธํ„ด ๊ธฐ๊ฐ„์„ ๊ฑฐ์ณ ์–ผ๋งˆ ์ „ ํ”„๋ก ํŠธ ๋ฉค๋ฒ„๋กœ ํ•ฉ๋ฅ˜ํ•˜๊ฒŒ ๋๊ณ , ์ธํ„ด ๊ธฐ๊ฐ„์ค‘ ์‹ค์ œ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์˜คํ”ˆ์†Œ์Šค ํŒจํ‚ค์ง€ํ™”ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ๊ฒฝํ—˜์ด์ง€๋งŒ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์ด ๋งŽ์ด ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์„œ๋น„์Šค์—์„œ ํŒจํ‚ค์ง€ํ™”๋ฅผ ๊ฑฐ์น˜๋Š” ๋ฐฉ์‹์€ ์ž˜ ํƒํ•˜์ง€ ์•Š์„ํ…๋ฐ์š”. ์ธํ„ด์ด์—ˆ๊ธฐ์— ๊ฐ์‚ฌํ•œ ๊ธฐํšŒ๊ฐ€ ์ฃผ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ( ์ด ์ž๋ฆฌ๋ฅผ ๋นŒ์–ด์„œ ๋˜ ์ข‹์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ์ •ํ•ด์ฃผ์‹ ๋ฐ์— ๊ฐ์‚ฌ.. ๐Ÿ™ )

์‚ฌ๋‚ด์—์„œ ์†Œ์†Œํ•œ ๊ธฐ์ˆ  ์„ธ๋ฏธ๋‚˜๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ ๊ฐœ๋ฐœ ๊ณผ์ • ์ค‘ ๊ฐ€์น˜์žˆ๋Š” ๊ฒฝํ—˜์„ ์ •๋ฆฌํ•ด ๊ณต์œ ํ•ด๋ณด์ž๋Š” ๊ธฐํš ์•„๋ž˜ ์ด๋ฒˆ ๊ธ€์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ „์ฒด ๊ธ€์€ ํŒจํ‚ค์ง€ํ™”์— ์ดˆ์ ์„ ๋งž์ท„์ง€๋งŒ, ๊ตฌํ˜„ํ•  ์ปดํฌ๋„ŒํŠธ์— ๊ด€ํ•ด์„œ๋„ ๊ฐ„๋žตํžˆ ์„ค๋ช…์„ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ํ™”ํ•  ์ปดํฌ๋„ŒํŠธ๋Š” Modal ์ปดํฌ๋„ŒํŠธ์ธ๋ฐ ์ผ๋ฐ˜์ ์ธ Modal์˜ ๊ตฌํ˜„ ๋ฐฉ์‹๊ณผ๋Š” ์ฐจ์ด์ ์„ ๊ฐ€์ ธ๊ฐ€๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

App, Viewport, Modal์„ ์˜†์—์„œ ๋ณธ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž

< ์ผ๋ฐ˜์ ์ธ Modal ๋ฐฉ์‹ >

์œ„์ฒ˜๋Ÿผ App, Viewport, Modal์ด ์กด์žฌํ•˜๊ณ  ์˜†์—์„œ ๋ณธ ๋ชจ์Šต์ด๋ผ๊ณ  ํ–ˆ์„ ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ Modal์€ ์•„๋ž˜์™€ ๊ฐ™์ด Viewport์— ์ƒ๋Œ€์ ์ธ ์œ„์น˜์— ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

App์„ ์Šคํฌ๋กคํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด Modal์€ Viewport์˜ ์ƒ๋Œ€์  ์œ„์น˜์— ๊ทธ๋Œ€๋กœ ๊ณ ์ •๋ผ์žˆ์„๊ฒ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ Modal ๋‚ด๋ถ€์˜ ์ปจํ…์ธ ๊ฐ€ ๋งŽ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”?

๊ทธ๋Ÿด ๋•Œ๋Š” Modal์„ Viewport๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ์ž‘๋„๋ก ๋งŒ๋“ค๊ณ  Modal ๋‚ด๋ถ€์— ์Šคํฌ๋กค์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์„œ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

< ๊ตฌํ˜„ํ•  Modal ๋ฐฉ์‹ : vue-fullpage-modal >

๊ตฌํ˜„ํ•  Modal ์ปดํฌ๋„ŒํŠธ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ์‹์œผ๋กœ Modal์„ ๋„์šฐ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

App์„ ์ž ์‹œ ๋ฐฐ๊ฒฝ์ฒ˜๋Ÿผ ๊ณ ์ •์‹œํ‚จ ํ›„ Modal์ด ๊ทธ ์ž๋ฆฌ๋ฅผ ๋Œ€์‹ ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ Modal์„ ๋„์šฐ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ Modal์„ ๊ตฌํ˜„ํ•˜๋ฉด Modal ๋‚ด๋ถ€์— ์ปจํ…์ธ ๊ฐ€ ๋งŽ๋“  ์ ๋“  ์Šคํฌ๋กค์ด Modal์„ ๊ธฐ์ค€์œผ๋กœ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํฌ๋กค์— ๊ด€๋ จํ•œ ์ด์Šˆ๋ฅผ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” fullpage๋ฐฉ์‹ Modal์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ( ๊ทธ๋ž˜์„œ ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์ด vue-fullpage-modal์ด ๋์Šต๋‹ˆ๋‹ค ๐ŸŽ‰ )

Best Practices ๋ฆฌ์„œ์น˜

์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•œ ์ดํ›„์—๋Š” ๋ณธ๊ฒฉ์ ์œผ๋กœ npm ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ํ™”์˜ ํ•„์ˆ˜์š”์†Œ๋Š” ์†Œ์Šค์ฝ”๋“œ์™€ package.json ์ž…๋‹ˆ๋‹ค.

๋ง‰๋ง‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋‹จ best practice๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋ณด๊ณ , ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค์˜ directory structure์™€ package.json๋„ ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค.

directory

#
.
โ”œโ”€โ”€ build/
โ”œโ”€โ”€ libs/
โ”œโ”€โ”€ src/
โ”œโ”€โ”€ tests/
โ”œโ”€โ”€ vendor/
โ””โ”€โ”€ package.json
Vue
      
  # vue
  .
  โ”œโ”€โ”€ .circleci/
  โ”œโ”€โ”€ .github/
  โ”œโ”€โ”€ benchmarks/
  โ”œโ”€โ”€ dist/
  โ”œโ”€โ”€ examples/
  โ”œโ”€โ”€ flow/
  โ”œโ”€โ”€ packages/
  โ”œโ”€โ”€ scripts/
  โ”œโ”€โ”€ src/
  โ”œโ”€โ”€ test/
  โ”œโ”€โ”€ types/
  โ”œโ”€โ”€ .babelrc.js
  โ”œโ”€โ”€ .editorconfig
  โ”œโ”€โ”€ .eslintignore
  โ”œโ”€โ”€ .eslintrc.js
  โ”œโ”€โ”€ .flowconfig
  โ”œโ”€โ”€ .gitignore
  โ”œโ”€โ”€ BACKERS.md
  โ”œโ”€โ”€ LICENSE
  โ”œโ”€โ”€ README.md
  โ”œโ”€โ”€ package.json
  โ””โ”€โ”€ yarn.lock
  11 directories, 11 files
      
    
vue-final-modal
      
# vue-final-modal
.
โ”œโ”€โ”€ .github/
โ”œโ”€โ”€ dist/
โ”œโ”€โ”€ docs/
โ”œโ”€โ”€ example/
โ”œโ”€โ”€ lib/
โ”œโ”€โ”€ tests/
โ”œโ”€โ”€ types/
โ”œโ”€โ”€ vetur/
โ”œโ”€โ”€ .babelrc
โ”œโ”€โ”€ .eslintignore
โ”œโ”€โ”€ .eslintrc.js
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ .prettierrc.yaml
โ”œโ”€โ”€ .travis.yml
โ”œโ”€โ”€ LICENSE
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ jest.config.js
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ rollup.config.js
โ””โ”€โ”€ yarn.lock
8 directories, 12 files
      
    

package.json

//
{
  "name": "package-name",
  "version": "1.0.0",
  "description": "A description to show on NPM",
  "keywords": ["search tags"],
  "author": "Your Name",
  "license": "MIT",
  "main": "./dist/index.js",
  "module": "./dist/index.mjs",
  "types": "./dist/index.d.ts",
  "repository": {
    "type": "git",
    "url": "https://github.com/..."
  },
  "scripts": {},
  "devDependencies": {},
  "dependencies": {}
}
Vue
//
{
  "name": "vue",
  "version": "2.6.14",
  "description": "...",
  "main": "dist/vue.runtime.common.js",
  "module": "dist/vue.runtime.esm.js",
  "unpkg": "dist/vue.js",
  "jsdelivr": "dist/vue.js",
  "typings": "types/index.d.ts",
  "files": [
    "src",
    "dist/*.js",
    "types/*.d.ts"
  ],
  "sideEffects": false,
  "scripts": { ... },
  "gitHooks": {
    "pre-commit": "lint-staged",
    "commit-msg": "node scripts/verify-commit-msg.js"
  },
  "lint-staged": {
    "*.js": [
      "eslint --fix",
      "git add"
    ]
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/vuejs/vue.git"
  },
  "keywords": [
    "vue"
  ],
  "author": "Evan You",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/vuejs/vue/issues"
  },
  "homepage": "https://github.com/vuejs/vue#readme",
  "devDependencies": { ... },
  "config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
  }
}
vue-final-modal
//
{
  "name": "vue-final-modal",
  "version": "2.4.1",
  "description": "...",
  "private": false,
  "main": "dist/VueFinalModal.umd.js",
  "module": "dist/VueFinalModal.esm.js",
  "jsnext:main": "dist/VueFinalModal.esm.js",
  "unpkg": "dist/VueFinalModal.umd.js",
  "jsdelivr": "dist/VueFinalModal.umd.js",
  "types": "types/index.d.ts",
  "files": [ "lib", "dist", ... ],
  "scripts": { ... },
  "devDependencies": { ... },
  "gitHooks": {
    "pre-commit": "lint-staged"
  },
  "lint-staged": {
    "*.{js,jsx,vue}": [
      "yarn lint"
    ]
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/vue-final/vue-final-modal.git"
  },
  "author": "Hunter Liu",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/vue-final/vue-final-modal/issues"
  },
  "homepage": "https://vue-final-modal.org",
  "keywords": [ ... ],
  "vetur": {
    "tags": "vetur/tags.json",
    "attributes": "vetur/attributes.json"
  },
  "peerDependencies": {
    "vue": "^2.6.14"
  }
}

Best Practice๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜ˆ์ƒ

๋ฆฌ์„œ์น˜๋ฅผ ํ•ด๋ณด๋‹ˆ ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€๋“ค์—์„œ ๋น„์Šทํ•œ directory structure์™€ package.json ์†์„ฑ๋“ค์ด ๋ฐ˜๋ณต๋์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์™„์„ฑ๋œ Modal ํŒจํ‚ค์ง€์˜ directory์™€ package.json์„ ์˜ˆ์ƒํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

directory ์ด๋ฆ„๊ณผ package.json ์†์„ฑ์˜ ์ด๋ฆ„์œผ๋กœ ์—ญํ•  ์ถ”์ธก์ด ๊ฐ€๋Šฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ƒํ•ด๋ณด๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

directory

.
โ”œโ”€โ”€ (dist/)
โ”œโ”€โ”€ docs/
โ”œโ”€โ”€ src/
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ LICENSE
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ package.json
โ””โ”€โ”€ webpack.config.js
  • dist ๋””๋ ‰ํ† ๋ฆฌ์— ์†Œ๊ด„ํ˜ธ๊ฐ€ ์žˆ๋Š” ์ด์œ ๋Š” ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ ๊ณผ์ •์—์„œ๋งŒ ์ƒ์„ฑ๋  ๋””๋ ‰ํ† ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

package.json

{
  "name": "my-package",
  "version": "0.1.1",
  "description": "good package",
  "main": "dist/myPackage.js",
  "scripts": {
    "build": "webpack"
    // ...
  },
  "files": [ "src", "dist/*.js" ], // files๋Š” ์ถ”๊ฐ€๋กœ ์„ค๋ช…ํ•  ์†์„ฑ
  "repository": {
    "type": "git",
    "url": "https://github.com/medistream-team/vue-fullpage-modal"
  },
  "keywords": [ "vuejs", "component", "vue" ],
  "author": "my-id",
  "license": "MIT",
  "dependencies": {
    "vue": "^2.5.2"
  },
  "devDependencies": {
    "@babel/core": "^7.13.16",
    "webpack": "^4.45.0"
		// ...
  }
}
  • files ๋Š” ์ถ”๊ฐ€๋กœ ์„ค๋ช…ํ•  ์†์„ฑ์ž…๋‹ˆ๋‹ค.
๐Ÿ’ก ํŒจํ‚ค์ง€ ์ถœ์‹œ ํ›„ ๋Œ์•„๋ณด๋‹ˆ ์ตœ์†Œํ•œ์˜ ๊ตฌ์กฐ์—์„œ ์‚ด์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ถ™์ด๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋– ์˜ฌ๋ ค๋„ ๊ดœ์ฐฎ์•˜์„ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

directory


.
โ”œโ”€โ”€ package.json
โ””โ”€โ”€ index.js

โ†“

.
โ”œโ”€โ”€ docs/
โ”œโ”€โ”€ src
โ”‚  โ”œโ”€โ”€ Component.vue
โ”‚  โ”œโ”€โ”€ index.js
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ LICENSE
โ””โ”€โ”€ README.md

โ†“

.
โ”œโ”€โ”€ docs/
โ”œโ”€โ”€ src
โ”‚  โ”œโ”€โ”€ Component.vue
โ”‚  โ”œโ”€โ”€ index.js
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ LICENSE
โ”œโ”€โ”€ README.md
โ””โ”€โ”€ webpack.config.js

Package.json

{
  "name": "my-package",
  "version": "0.0.1"
}

name๊ณผ version๋งŒ ์žˆ์–ด๋„ ํŒจํ‚ค์ง€ํ™”๊ฐ€ ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

โ†“

{
  "name": "my-package",
  "version": "0.1.0",
  "repository": {
    "type": "git",
    "url": "https://github.com/my-id/my-package"
  },
  "license": "MIT",
  "dependencies": {
    "vue": "^2.5.2"
  },
  "devDependencies": {
    "@babel/core": "^7.13.16",
		// ...
  }
}

โ†“

{
  "name": "my-package",
  "version": "0.1.1",
  "description": "good package",
  "main": "dist/myPackage.js",
  "scripts": {
    "build": "webpack"
    // ...
  },
  "files": [ "src", "dist/*.js" ],
  "repository": {
    "type": "git",
    "url": "https://github.com/medistream-team/vue-fullpage-modal"
  },
  "keywords": [ "vuejs", "component", "vue" ],
  "author": "my-id",
  "license": "MIT",
  "dependencies": {
    "vue": "^2.5.2"
  },
  "devDependencies": {
    "@babel/core": "^7.13.16",
    "webpack": "^4.45.0"
		// ...
  }
}

build & publish

์†Œ์Šค์ฝ”๋“œ์™€ package.json์ด ์ค€๋น„๋๋‹ค๋ฉด ๋ฐ”๋กœ publish๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€๋งŒ ๋ณดํ†ต build ๊ณผ์ •์„ ํ†ตํ•ด ํŒจํ‚ค์ง€์˜ ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ , ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋“ฑ ์ถ”๊ฐ€์ ์ธ ๋ณด์™„ ์ž‘์—…์„ ํ•ด์ค๋‹ˆ๋‹ค.

  • ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ CommonJS, ESM, AMD ๋“ฑ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋’ค์—์„œ ๋” ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

build

๋นŒ๋“œ ํˆด๋กœ๋Š” rollup, parcel, webpack, vite ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ๋น ๋ฅธ ๋นŒ๋“œ ์†๋„๋กœ ์ฃผ๋ชฉ์„ ๋ฐ›๊ณ ์žˆ๋Š” vite๋ฅผ ์‚ฌ์šฉํ• ๊นŒ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ vue2๋ฅผ ๊ณต์‹์ ์œผ๋กœ๋Š” ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋“ฑ์˜ ์ƒํ™ฉ์ด ์žˆ๊ณ , ๋นŒ๋“œ ์†๋„๊ฐ€ ๊ฒฐ์ •์ ์ธ ๊ณ ๋ ค ์š”์†Œ๊ฐ€ ์•„๋‹ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ†ต์ ์ธ webpack์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€์— ๋งž๊ฒŒ webpack์„ ์„ค์ •ํ•ด์ค€ ๋’ค ๋นŒ๋“œ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

npm run build

Hash: 3gfsdc123...
Version: webpack 4.46.0
Time: 1654ms
Built at: 07/07/2021 12:35:23 PM
           Asset      Size  Chunks                   Chunk Names
    myPackage.js  27.3 KiB       0  [emitted]        main
  • ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ ์ €์žฅ ๋””๋ ‰ํ† ๋ฆฌ๋กœ dist, ํŒŒ์ผ์ด๋ฆ„์„ myPackage.js๋กœ ์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— dist/myPackage.js ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

package๊ฐ€ ์ฝ์–ด๋“ค์ผ ํŒŒ์ผ ์ง€์ •

import 'my-package'๋ฅผ ํ•  ๋•Œ ์ฝ์–ด๋“ค์ด๋Š” ํŒŒ์ผ์€ package.json์˜ main ์†์„ฑ์— ์ง€์ •๋œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ main ์†์„ฑ์€ ํŒจํ‚ค์ง€ root ํด๋”์˜ index.js๋กœ ์ง€์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œ์ ์œผ๋กœ ๋นŒ๋“œ๋œ ํŒŒ์ผ๋กœ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค.

# package.json
{
	...
	"main": "dist/myPackage.js"
	...
}

publish

๋นŒ๋“œ๊ฐ€ ๋๊ณ  package.json ์„ค์ •์ด ์™„๋ฃŒ๋์œผ๋ฉด publish๋ฅผ ํ•  ์ค€๋น„๊ฐ€ ๋์Šต๋‹ˆ๋‹ค! ๐Ÿš€

> npm run publish

npm notice 
npm notice ๐Ÿ“ฆ  my-package@0.1.1
npm notice === Tarball Contents ===                                
npm notice 27.3kB dist/myPackage.js                    
npm notice 42.2kB src/components/MyComponent.vue
npm notice 1.2kB  src/index.js                             
npm notice 1.0kB  package.json                             
npm notice 1.9kB  README.md                                         
npm notice === Tarball Details === 
npm notice name:          my-package                      
npm notice version:       0.1.1                                   
npm notice package size:  12.1 kB                                 
npm notice unpacked size: 45.5 kB                                 
npm notice shasum:        2asdfasdfsdfsdfsa9b0857858dd295cd8801449
npm notice integrity:     sha512-NFHSDASDFAa5T[...]Kx1kpZyiJ5KZA==
npm notice total files:   5                                       
npm notice 
+ my-package@0.1.1

files

ํ•˜์ง€๋งŒ ํฌํ•จ๋œ ํŒŒ์ผ๋“ค์„ ์‚ดํŽด๋ณด๋ฉด ์กฐ๊ธˆ ์ด์ƒํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ํŒจํ‚ค์ง€์— ํฌํ•จํ•˜๊ณ  ์‹ถ์€๊ฑด dist/myPackage.js ํŒŒ์ผ๋งŒ์ธ๋ฐ, index.js๋‚˜ MyComponent.vue ํŒŒ์ผ๋„ ๊ฐ™์ด ํฌํ•จ๋ผ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” npm publishํ•  ๋•Œ ๊ธฐ๋ณธ์„ค์ • ๋•Œ๋ฌธ์ธ๋ฐ์š”. ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒจํ‚ค์ง€ root ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์˜ ํŒŒ์ผ ๋ฐ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋„๋ก ๋ผ์žˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ํŒŒ์ผ๋งŒ ํฌํ•จ์‹œ์ผœ์ฃผ๊ธฐ ์œ„ํ•ด์„œ package.json์— files ์†์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

{
  ...
  "files": "dist" // ํ˜น์€ "files": "dist/myPackage.js"
  ...
}
  • files ์†์„ฑ์€ .npmignore ํŒŒ์ผ๊ณผ ๋น„๊ตํ•ด์„œ ๋’ค์— ์ถ”๊ฐ€ ์„ค๋ช…์„ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

* ์‹ค์ œ๋กœ๋Š” vue plugin์„ ํŒจํ‚ค์ง€ํ™”ํ•œ ๊ฒƒ

Component๋ฅผ ๋งŒ๋“ค์—ˆ์ง€๋งŒ Vue์—์„œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค๊ณ , ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํŒจํ‚ค์ง€์˜ main ํŒŒ์ผ์€ ์‚ฌ์‹ค plugin์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

import MyComponent from 'my-component'

Vue.<use(MyComponent)
// ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฒŒ์–ด์ง€๋Š” ์ผ

Vue.component('my-modal', MyModal)
Vue.$myFunction = function(){ ... }

๋“ฑ๋“ฑ..

์ด๋ ‡๊ฒŒ npm package๋ฅผ publish ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ publish๊นŒ์ง€์˜ ๊ณผ์ •์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด์•˜๊ณ  ์ด์ œ ์ข€ ๋” ๊นŠ์€ ๋‚ด์šฉ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“ˆ ์‹œ์Šคํ…œ

JavaScript์—๋Š” CommonJS, ES Module, AMD ๋“ฑ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์•„์ฃผ ๊ฐ„๋žตํžˆ ๋น„๊ตํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ๋‹ค๋ฃฌ ๊ธ€๋“ค์„ ๋์— ์ถ”๊ฐ€ํ•ด๋†จ์œผ๋‹ˆ ์ฝ์–ด๋ณด์‹œ๊ธฐ๋ฅผ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

CommonJS

๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ , ์‹ฌํ”Œํ•œ ์‚ฌ์šฉ๋ฐฉ์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Node.js์—์„œ ์ฒ˜์Œ ๋„์ž…๋œ๋งŒํผ ์„œ๋ฒ„์‚ฌ์ด๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

AMD

๋น„๋™๊ธฐ๋ฅผ ์ง€์›ํ•˜๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค. Frontend์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋„์ž…๋œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

ESM

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ณต์‹ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์œผ๋กœ ๋น„๋™๊ธฐ์ ์ธ ํŠน์ง•๊ณผ CommonJS์˜ ์‹ฌํ”Œํ•œ ์‚ฌ์šฉ๋ฐฉ์‹์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

UMD

ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ CommonJS ๋ฐฉ์‹๊ณผ ESM, ์ €๋Š” ์ž˜ ์ ‘ํ•ด๋ณด์ง€ ๋ชปํ–ˆ์ง€๋งŒ AMD ๋ฐฉ์‹๋„ ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ์ƒํƒœ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํ˜ผ์šฉ์œผ๋กœ ์ธํ•œ ๋ณต์žกํ•จ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€์šฉ์œผ๋กœ ์“ฐ๋Š” ๋ฐฉ์‹์ด UMD์ธ๋ฐ์š”. ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์— ๋”ฐ๋ผ CommonJS, ES Module, AMD์—์„œ ํŒจํ‚ค์ง€๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ๋Š” ๋””์ž์ธ ํŒจํ„ด์— ๊ฐ€๊น๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • UMD ์˜ˆ์ œ ์ฝ”๋“œ
(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'b'], factory);
    } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('b'));
    } else {
        // Browser globals
        factory((root.commonJsStrict = {}), root.b);
    }
}(this, function (exports, b) {
    //use b in some fashion.

    // attach properties to the exports object to define
    // the exported module properties.
    exports.action = function () {};
}));

// https://riptutorial.com/javascript/example/16339/universal-module-definition--umd-

webpack์„ ํ†ตํ•œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ์„ ํƒ

webpack์—์„œ๋Š” ์ด๋ฏธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

// webpack.config.js

{
  ...
  "output": {
	"libraryTarget": "umd",
	...
  }
  ...
}

package.json

package.json์—์„œ๋„ ์—ฌ๋Ÿฌ ์†์„ฑ๋“ค ์ค‘ ๋” ์‚ดํŽด๋ณผ๋งŒํ•œ ์†์„ฑ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

files

ํŒจํ‚ค์ง€์— ํฌํ•จํ•  ํŒŒ์ผ๋“ค์„ ์ง€์ •ํ•ด์ฃผ๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€์— ํฌํ•จํ•  ํŒŒ์ผ์„ ์„ค์ •ํ•˜๋Š” 2๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

blacklist๋ฐฉ์‹์ธ .npmignore ์™€ whitelist ๋ฐฉ์‹์ธ files ์†์„ฑ์ž…๋‹ˆ๋‹ค.

  • blacklist ๋ฐฉ์‹์—์„œ๋Š” ํŒจํ‚ค์ง€์—์„œ ์ œ์™ธํ•˜๊ณ  ์‹ถ์€ ํŒŒ์ผ๋“ค์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • whitelist ๋ฐฉ์‹์—์„œ๋Š” ํŒจํ‚ค์ง€์— ํฌํ•จํ•˜๊ณ  ์‹ถ์€ ํŒŒ์ผ๋“ค์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ git repository๋ฅผ ๋Œ์•„๋‹ค๋‹ˆ๋‹ค๋ณด๋ฉด .npmignore ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์ด ๊ฑฐ์˜ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .npmignore๊ฐ€ ๋ณดํŽธ์ ์ธ ๋ฐฉ์‹์ธ์ค„ ์•Œ์•˜๊ธฐ์— ์ด ์‚ฌ์‹ค์— ๊ฝค๋‚˜ ๋†€๋ž์—ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

.npmignore์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ 

  • .gitignore์™€ .npmignore๊ฐ€ ๋™์‹œ์— ์กด์žฌํ•  ๋•Œ npm์—์„œ๋Š” .npmignore๋งŒ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

    .gitignore๋งŒ ์žˆ์œผ๋ฉด npm์—์„œ .gitignore๋ฅผ ์ฐธ์กฐํ•ด์„œ ํŒจํ‚ค์ง€์— ํฌํ•จํ•  ํŒŒ์ผ์ด๋‚˜ ํด๋”๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ, ๋‘˜ ๋‹ค ์กด์žฌํ•˜๋ฉด .gitignore์˜ ๋‚ด์šฉ์€ ๋ฌด์‹œํ•˜๊ณ  .npmignore์˜ ๋‚ด์šฉ๋งŒ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋˜ํ•œ blacklist ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ํŒŒ์ผ์ด๋‚˜ ํด๋”๊ฐ€ ์ถ”๊ฐ€๋ ๋•Œ๋งˆ๋‹ค ์ด๋ฅผ blacklist์— ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

    whitelist ๋ฐฉ์‹์—์„œ๋„ ํŒจํ‚ค์ง€ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜๋ฉด whitelist์— ์ถ”๊ฐ€ํ•ด์•ผํ•ด์„œ ์กฐ์‚ผ๋ชจ์‚ฌ๊ฐ€ ์•„๋‹Œ๊ฐ€ ์‹ถ์€๋ฐ, AWS Crendential ๊ด€๋ จ ํŒŒ์ผ ๋“ฑ ํŒจํ‚ค์ง€์— 'ํฌํ•จ๋˜์ง€ ์•Š์•„์•ผํ•  ํŒŒ์ผ์ด ํฌํ•จ๋˜๋Š” ๊ฒƒ'์ด ์ƒ๋‹นํ•œ risk๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— blacklist ๋ฐฉ์‹๋ณด๋‹ค whitelist ๋ฐฉ์‹์ด ๋” ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

version

x.y.z์˜ ํ˜•ํƒœ์˜ ๋ฒ„์ €๋‹์„ semantic versioning. ์ค„์—ฌ์„œ semver๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. npm์˜ ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ˆˆ์œผ๋กœ๋Š” ์ต์ˆ™ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๋‹ด๊ณ ์žˆ๋Š”์ง€๋Š” ๋ชฐ๋ž๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ ๊ธฐํšŒ์— versioning์— ๋Œ€ํ•ด์„œ๋„ ์ฐพ์•„๋ดค์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ์กด ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๊ฒŒ API๊ฐ€ ๋ฐ”๋€Œ๋ฉด x๋ฅผ ์˜ฌ๋ฆฌ๊ณ  (major ๋ฒ„์ „)

  • ๊ธฐ์กด ๋ฒ„์ „๊ณผ ํ˜ธํ™˜์ด ๋˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋ฉด y๋ฅผ ์˜ฌ๋ฆฌ๊ณ  (minor ๋ฒ„์ „)

  • ๊ธฐ์กด ๋ฒ„์ „๊ณผ ํ˜ธํ™˜์ด ๋˜๋ฉด์„œ ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋œ ๊ฒƒ์ด๋ผ๋ฉด z๋ฅผ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. (patch ๋ฒ„์ „)

  • major ๋ฒ„์ „ 0(0.y.z)์€ ์ดˆ๊ธฐ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ์”๋‹ˆ๋‹ค. ์•„๋ฌด ๋•Œ๋‚˜ ๋งˆ์Œ๋Œ€๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ •ํŒ์œผ๋กœ ๋ณด์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • patch๋ฒ„์ „ ๋ฐ”๋กœ ๋’ค์— ๋ถ™์ž„ํ‘œ(-)๋ฅผ ๋ถ™์ด๊ณ  ๋งˆ์นจํ‘œ(.)๋กœ ๊ตฌ๋ถ„๋œ ์‹๋ณ„์ž๋ฅผ ๋”ํ•ด์„œ ์ •์‹ ๋ฐฐํฌ๋ฅผ ์•ž๋‘” (pre-release) ๋ฒ„์ „์„ ํ‘œ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹๋ณ„์ž๋Š” ๋ฐ˜๋“œ์‹œ ์•„์Šคํ‚ค(ASCII) ๋ฌธ์ž, ์ˆซ์ž, ๋ถ™์ž„ํ‘œ๋กœ๋งŒ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค[0-9A-Za-z-]. ์ •์‹๋ฐฐํฌ ์ „ ๋ฒ„์ „์€ ์•„์ง ๋ถˆ์•ˆ์ •ํ•˜๋ฉฐ ์—ฐ๊ด€๋œ ์ผ๋ฐ˜ ๋ฒ„์ „์— ๋Œ€ํ•ด ํ˜ธํ™˜์„ฑ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: 1.0.0-alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92.

  • ~๋ฅผ ๋ถ™์ด๋Š” Tilde Ranges์™€ ^๋ฅผ ๋ถ™์ด๋Š” Caret Ranges ๋Š” ๋‚ด์šฉ์ด ์กฐ๊ธˆ ๊ธธ์–ด ์•„๋ž˜์˜ ์ข‹์€ ๋งํฌ๋กœ ๋Œ€์ฒด ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œํ™”

๋„ค.. ํŒจํ‚ค์ง€๋ฅผ ์ถœ์‹œํ•ด์„œ ๋์ด๋‚œ์ค„ ์•Œ์•˜๋Š”๋ฐ ๋ฌธ์„œํ™”๊ฐ€ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค..

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด ๋ฌธ์„œํ™”๊ฐ€ ์•„์ฃผ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฐ€ ๊ฐœ๋ฐœํ•œ ๋‚ด์šฉ์˜ ์‚ฌ์šฉ๋ฒ•์„ ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œํ™”๊ฐ€ ์•„์ฃผ ์ค‘์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

README.md

์ด๊ฒŒ ์ „๋ถ€์ธ README.md

์ €์žฅ์†Œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด ์ฒซ ๋ˆˆ์— ์˜ˆ์‹œ๋ถ€ํ„ฐ, ์„ค์น˜์™€ ์‚ฌ์šฉ๊นŒ์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ˆˆ์— ๋“ค์–ด์˜ค๊ฒŒํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

simple is the best!!

Documentation

๋ฌธ์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๊ณ  ์กฐ์ž‘ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ œ ์œ„์ฃผ๋กœ ๊ตฌ์„ฑํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์‹œ ํ›„ ์•ฝ ํ•œ๋‹ฌ

์ถœ์‹œ ํ›„ ์•ฝ ํ•œ๋‹ฌ์ด ์ง€๋‚œ ์‹œ์ ์— 5๋ช…์˜ ์ „ํ˜€ ๋ชจ๋ฅด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค๐Ÿ˜ฎ . ์–ด๋– ํ•œ ํ™๋ณด๋„ ํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์•˜๋Š”์ง€ ์ฐธ ์‹ ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ gif ์ด๋ฏธ์ง€๋ฅผ ๋ดค์„ ๋•Œ ๋ชจ๋ฐ”์ผ Navigation drawer ๊ฐ™์•„ ๋ณด์—ฌ์„œ ๋„์ž…ํ•˜์ง€ ์•Š์•˜์„๊นŒ ํ•ฉ๋‹ˆ๋‹ค.

ํ›„๊ธฐ

ํ•œ๋‹ฌ ๋™์•ˆ ์ž‘์—…์„ ํ–ˆ์ง€๋งŒ 1.0.0 ๋ฒ„์ „์„ ์ถœ์‹œํ•  ์ •๋„๊นŒ์ง€ ๋˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด์•ผํ•  ๋‹ค๋ฅธ ์ผ๋“ค์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋ฏธ๋ฃจ์ง€ ๋ชปํ•˜๊ณ  0.x ๋ฒ„์ „์œผ๋กœ ์‹ค์ œ ์„œ๋น„์Šค์—์„œ ํ•„์š”ํ•œ์ •๋„๋กœ๋งŒ ํŒจํ‚ค์ง€๋กœ ์™„์„ฑํ•˜๊ณ  ์ดํ›„ ํ•„์š”์— ๋”ฐ๋ผ ๋ฐœ์ „์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„๋ถ€ํ„ฐ npm ํŒจํ‚ค์ง€ ์ถœ์‹œ๊นŒ์ง€ ์ผ๋ จ์˜ ๊ณผ์ •์„ ๊ฒช์–ด๋ณด๋‹ˆ ๋Š๋ผ๋Š” ์ ๋“ค์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€์˜ ๋‹น์œ„์„ฑ, ํ•„์š”์„ฑ์ด ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

'ํŒจํ‚ค์ง€๊ฐ€ ์™œ ์กด์žฌํ•ด์•ผํ•˜๋Š”์ง€, ์ •๋ง ์œ ์šฉํ•œ์ง€'๊ฐ€ ๊ฒฐ๊ตญ ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ํ™”๋ฅผ ํ•˜๋ ค๊ณ  ์‹œ์ž‘ํ•˜๊ธฐ๋ณด๋‹ค ํ•„์š”ํ•œ ๊ฒƒ์ด ์žˆ์–ด์„œ ๋งŒ๋“ค๊ณ  ์ดํ›„์— ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŒจํ‚ค์ง€ํ™”๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์ˆœ์„œ์— ๋งž๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์˜ˆ์‹œ๋ฅผ ๋ชจ๋ฐ”์ผ์œ„์ฃผ๋กœ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. vue-fullpage-modal ์ด pc, mobile์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ Viewport๊ฐ€ ์ž‘์•„๋„ ์œ ์šฉํ•œ Modal์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ถœ๋ฐœํ–ˆ๊ธฐ๋•Œ๋ฌธ์— ๊ทธ๊ฑธ ๋ช…ํ™•ํžˆ ๋‚˜ํƒ€๋‚ด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ( ๋ฌธ์„œ์— pc ์˜ˆ์‹œ๋„ ๋„ฃ์–ด์•ผ ํ•˜๋Š”๋ฐ .. ํ•ญ์ƒ ๋…ธ์˜ค๋ ฅ์ด ๋ถ€์กฑํ•œ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค )

๋ฌธ์„œํ™”์—๋„ ์ž์›์„ ๋งŽ์ด ํ• ๋‹นํ•˜์ž

์‹ค์ œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์ ˆ๋ฐ˜์˜ ์‹œ๊ฐ„ ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์„œํ™”์— ๋‚˜๋จธ์ง€ ์ ˆ๋ฐ˜์ด ์†Œ์š”๋์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ ๋ฐœ์ „์‹œํ‚ค๊ณ  ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š” ๋‚ด์šฉ์ด ๋งŽ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œํ™”๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€ ์•Œ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ต๊ณ , ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๋ฌธ์„œ๋Š” ์—†๋Š” ๊ฒƒ๊ณผ ๋˜‘๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ๋ฌธ์„œ๋ฅผ ์œ„ํ•ด ๋งŽ์€ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ณ„ํš์„ ์งค ๋•Œ๋„ ๊ตฌํ˜„ ๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ ๋ฌธ์„œํ™”์— ๋งŽ์€ ๊ด€์‹ฌ์„ ์Ÿ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜คํ”ˆ์†Œ์Šค๋ฅผ ์ง€ํ–ฅํ•œ๋‹ค๋ฉด ํ•„์š”ํ•œ ๊ฒƒ๋“ค์ด ๋” ๋งŽ๋‹ค.

์˜คํ”ˆ์†Œ์Šค ํŒจํ‚ค์ง€๋ผ๊ณ  ํ•˜๊ธฐ์—๋Š” ์•„์ง ๋” ํ•„์š”ํ•œ ๊ฒƒ๋“ค์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์ด ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ฐœ์ „์‹œํ‚ค๊ณ  ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ธฐ์— ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋ฐ˜์ด ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ์—ฌ๊ฐ€์ด๋“œ ( CONTRIBUTING )
  • ํ–‰๋™ ๊ฐ•๋ น ( Code of Conduct )
  • ํ…Œ์ŠคํŒ… & ์ž๋™ํ™”
  • ์ด์Šˆ template

๋“ฑ๋“ฑ ..

์ด๋ ‡๊ฒŒ npm ํŒจํ‚ค์ง€ํ™”์˜ ๊ฒฝํ—˜์„ ๊ธ€๋กœ ์ •๋ฆฌํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํ•ด๋ณธ ๊ฒฝํ—˜์€ ๊ฐœ์ธ์ ์ธ career path ํ˜•์„ฑ์— ์ข‹์€ ๋ฐœ์ž์ทจ๋กœ ๋‚จ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธ€์„ ์ฝ๊ณ  ์•ฝ๊ฐ„์˜ ๊ฐ„์ ‘๊ฒฝํ—˜์ด๋ผ๋„ ๋œ๋‹ค๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธด ๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ ๋ฉ”๋””์ŠคํŠธ๋ฆผ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์„œ๋ณดํ˜„์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์€ ๋งํฌ๋“ค

๋ชจ๋“ˆ ์‹œ์Šคํ…œ

files

semver


๐Ÿ’ผ ์ฑ„์šฉ ํŽ˜์ด์ง€ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ฉ”๋””์ŠคํŠธ๋ฆผ์—์„œ๋Š” ํ›Œ๋ฅญํ•œ ์ธ์žฌ๋ฅผ ์ ๊ทน ์ฑ„์šฉ์ค‘์ž…๋‹ˆ๋‹ค.
ํ•œ์˜๊ณ„์˜ ์ƒˆ๋กœ์šด ํ๋ฆ„์— ํ•ฉ๋ฅ˜ํ•˜์„ธ์š”.

profile
FE Developer @Medistream

5๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2021๋…„ 7์›” 12์ผ

์ดํ•ด๊ฐ€ ์™์™~~

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 7์›” 19์ผ

๋งŽ์ด ๋ฐฐ์šฐ๊ณ  ๊ฐ‘๋‹ˆ๋‹ค~

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2022๋…„ 3์›” 30์ผ

๊ธ€์˜ ์„œ๋‘์— ๋ชจ๋‹ฌ์„ GIF๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‹œ๊ฐ์ ์œผ๋กœ ์„ค๋ช…ํ•˜์…”์„œ ์ดํ•ด๊ฐ€ ์ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํ˜น์‹œ ์–ด๋–ค ํˆด์„ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“œ์…จ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
์ข‹์€ ๊ธ€ ์ž˜ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€