๐ ๋ชจ๋ ํด์
Parcel ํด์๊ธฐ๋ ์์ ๋ ๋ฒ์ ์ node_modules ํด์ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํฉ๋๋ค.
๋ชจ๋ ํด์
ํ์ค ์๊ณ ๋ฆฌ์ฆ ์ธ์๋, Parcel์์ ์ง์ํ๋ ์ ์ ์ ํ๋ ํด์๋ฉ๋๋ค.
๋ชจ๋ ํด์์ ๋ค์๊ณผ ๊ด๋ จ๋ฉ๋๋ค.:
- entry root: Parcel์ ์ง์ ๋ ์ง์ ์ (entry point)์ ๋๋ ํ ๋ฆฌ ๋๋ ์ฌ๋ฌ ์ง์ ์ ์ด ์ง์ ๋ ๊ณต์ ๋ฃจํธ (๊ณตํต ์์ ๋๋ ํ ๋ฆฌ)
- package root:
node_modules
์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ชจ๋์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ
์ ๋๊ฒฝ๋ก
/foo
๋ entry root์ ์๋์ ์ธ ๊ฒฝ๋ก์ foo
๋ฅผ ํด์ํฉ๋๋ค.
~(ํธ๋) ๊ฒฝ๋ก
~/foo
๋ package root์ ์๋์ ์ธ ๊ฒฝ๋ก์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒฝ๋ก๋ฅผ ํด์ํฉ๋๋ค. ๋ง์ฝ ๋ชจ๋์ด ์๋ค๋ฉด, entry root์์ ํด์ํฉ๋๋ค.
Glob ํ์ผ ๊ฒฝ๋ก
Glob ํ์ผ ๊ฒฝ๋ก๋ ์ฌ๋ฌ ์ ์
์ ๋ฌถ์ด ํ๊บผ๋ฒ์ ๊ฐ์ ธ์ฌ ์ ์๋ ์์ผ๋์นด๋ ์ํฌํธ์
๋๋ค. Glob์ ์ผ๋ถ ๋๋ ๋ชจ๋ ํ์ผ (/assets/*.png
)๊ณผ ์ฌ๋ฌ ๋๋ ํ ๋ฆฌ์ ์๋ ํ์ผ (/assets/**/*
)๊ณผ ์ผ์นํ ์ ์์ต๋๋ค.
๋ค์์ png ํ์ผ์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ฌถ์ด dist URL์ ๋ฐํํ๋ ์์ ์ ๋๋ค.
import foo from "/assets/*.png";
// {
// 'file-1': '/file-1.8e73c985.png',
// 'file-2': '/file-1.8e73c985.png'
// }
package.json์ browser
ํ๋
๋ง์ฝ package์ package.browser ํ๋๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ, Parcel์ package.main๋์ ์ด ํญ๋ชฉ์ ์ฌ์ฉํฉ๋๋ค.
๋ณ์นญ (Aliases)
๋ณ์นญ์ package.json
ํ์ผ์ alias
ํ๋๋ฅผ ํตํด ์ง์ํฉ๋๋ค.
๋ค์ ์์ ๋ react
๋ฅผ preact
๋ก ๋ณ์นญ์ ์ง์ ํ๊ณ , node_modules
์ ์๋ ์ผ๋ถ ๋ก์ปฌ์ ์ฌ์ฉ์ ์ ์ ๋ชจ๋์ ์ง์ ํฉ๋๋ค.
// package.json
{
"name": "some-package",
"devDependencies": {
"parcel-bundler": "^1.7.0"
},
"alias": {
"react": "preact-compat",
"react-dom": "preact-compat",
"local-module": "./custom/modules"
}
}
์ผ๋ถ๋ Parcel์์ ์ฌ์ฉํ๊ณ , ๋ค๋ฅธ ์ผ๋ถ๋ ์๋ํํฐ ๋๊ตฌ ๋๋ ์ต์คํ ์ ์์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์, ํน์๋ฌธ์๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.:
~
๋ Parcel์์ ~ ๊ฒฝ๋ก๋ก ํด์ํฉ๋๋ค.@
๋ npm organizations์์ ์ฌ์ฉ๋ฉ๋๋ค.
๋ณ์นญ์ ์ ์ํ ๋๋ ๋ช ์์ ์ผ๋ก ์ ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํ์ผ ํ์ฅ์๋ฅผ ์ง์ ํ์ญ์์ค. ์ง์ ํ์ง ์๋ ๊ฒฝ์ฐ, Parcel์์ ์ด๋ฅผ ์ถ์ธกํด์ผ ํฉ๋๋ค. ์ด์ ๋ํ ์์ ๋ JavaScript Named Exports๋ฅผ ์ฐธ๊ณ ํ์ญ์์ค.
๊ณตํต ์ด์
Javascript Named Exports
๋ณ์นญ์ ๋งคํํ๋ ๊ฒ์ ๋ง์ ์ ์ ํ์ ์์ ์ฌ์ ์ฉ๋๋ฉฐ, Javascript named exports์์ ํน๋ณํ ์ ์ฉ๋์ง๋ ์์ต๋๋ค. JS named exports๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.:
// package.json
{
"name": "some-package",
"alias": {
"ipcRenderer": "./electron-ipc.js" // specify file extension
}
}
๊ทธ๋ฆฌ๊ณ ๋ณ์นญ์ด ๋งคํ๋ ํ์ผ์ ๋ค์ export ํฉ๋๋ค.:
// electron-ipc.js
module.exports = require('electron').ipcRenderer
Flow์์ ์ ๋๊ฒฝ๋ก ๋๋ ~๊ฒฝ๋ก ํด์
Flow์์ ์ ๋๊ฒฝ๋ก ๋๋ ~๊ฒฝ๋ก ํด์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ module.name_mapper๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ํ๋ก์ ํธ ๊ตฌ์ฑ์ด ์ ๊ณต๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.:
package.json
.flowconfig
src/
index.html
index.js
components/
apple.js
banana.js
๊ทธ๋ฆฌ๊ณ ์ง์
์ ์ src/index.html
์ด๋ฉฐ, *entry root๋ src/
ํด๋์
๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก, ์ํฌํธ๋ฅผ ์ ํํ๊ฒ ๋งคํํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.:
// index.js
import Apple from '/components/apple'
/components/apple
์ ์ ํ๋ /
๋ฅผ src/
๋ก ๋ฐ๊พธ๊ธฐ ์ํ Flow ์ค์ ์ด ํ์ํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก src/components/apple
์ด ๋ฉ๋๋ค.
.flowconfig
์ค์ ์ ๋ค์๊ณผ ๊ฐ์ด ๋์ฒดํฉ๋๋ค.
[options]
module.name_mapper='^\/\(.*\)$' -> '<PROJECT_ROOT>/src/\1'
<PROJECT_ROOT>
๋ .flowconfig
์ ์์น๋ฅผ ๋ํ๋ด๋ Flow์ ํน์ ์๋ณ์ ์
๋๋ค.
์ฐธ๊ณ : module.name_mapper
๋ ์ฌ๋ฌ ํญ๋ชฉ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ๋๊ฒฝ๋ก ๋๋ ~๊ฒฝ๋ก์ ํด์์ ์ง์ํ ์ ์์ต๋๋ค.
Typescript ํด์
Typescript์์๋ ~
๋ชจ๋์ ๋ํ ๋ด์ฉ์ด ๋ช
์๋์ด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ TypeScript Module Resolution docs์ ์ฐธ์กฐํ์ญ์์ค.
// tsconfig.json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"~*": ["./src/*"]
}
}
}
๋ชจ๋ ธ๋ฆฌํฌ ํด์
๋ชจ๋ ธ๋ฆฌํฌ์ ํจ๊ป ๊ถ์ฅ๋๋ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.:
๊ถ์ฅ ์ฌ์ฉ:
- ์๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ธ์.
- root๊ฒฝ๋ก๊ฐ ํ์ํ ๊ฒฝ์ฐ
/
๋ฅผ ์ฌ์ฉํ์ธ์
๊ถ์ฅํ์ง ์๋ ์ฌ์ฉ:
- ๋ชจ๋
ธ๋ฆฌํฌ์์
~
๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
๋ชจ๋ ธ๋ฆฌํฌ ์ฌ์ฉ์์ด๊ณ , ์ด๋ฌํ ๊ถ์ฅ ์ฌํญ์ ๊ธฐ์ฌํ๊ธฐ ์ํด์๋ ์์ ์ ํจ๊ป ์ด์๋ฅผ ์ ๊ณตํด ์ฃผ์ธ์.
๋ฌธ์์ ๊ฐ์ ์ ๋์์ฃผ์ธ์
๋น ์ง์ ์ด ์๊ฑฐ๋ ๋ช ํํ์ง ์์ ๊ฒฝ์ฐ, ์น ์ฌ์ดํธ ์ ์ฅ์์ ์ด์๋ฅผ ์ ๊ธฐํด ์ฃผ์๊ฑฐ๋ ํ์ด์ง๋ฅผ ์์ ํด ์ฃผ์ธ์..