๐ API
๋ฒ๋ค๋ฌ
๋ณด๋ค ๋ณต์กํ ์ฌ์ฉ์ ์ํด(๊ฐ๋ น ๋งค ๋น๋ ํ ์์์ ํ๋ก์ธ์ฑ์ ํด์ผํ๋ค๋๊ฐ) CLI ๋์ API ๋ฅผ ์ด์ฉํด์ ๋ฒ๋ค๋ฌ๋ฅผ ์ด๊ธฐํ ํ ์ ์์ต๋๋ค. ๋ชจ๋ ์ต์ ์ด ์ค๋ช ๋ ์๋ ์์๋ฅผ ๋ณด์ธ์.
const Bundler = require('parcel-bundler')
const Path = require('path')
// ์ง์
์ ํ์ผ ์์น
const file = Path.join(__dirname, './index.html')
// ๋ฒ๋ค๋ฌ ์ต์
const options = {
outDir: './dist', // ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ด ์ ์ฅ๋ ๋๋ ํ ๋ฆฌ. ๊ธฐ๋ณธ๊ฐ์ dist
outFile: 'index.html', // ๊ฒฐ๊ณผ๋ฌผ์ ํ์ผ๋ช
publicUrl: '/', // ์๋ฒ์์ ์์น. ๊ธฐ๋ณธ๊ฐ์ '/'
watch: true, // ํ์ผ ๋ณ๊ฒฝ์ ๊ฐ์งํด์ ๋ณ๊ฒฝ์ ๋ค์ ๋น๋ํ ์ง ์ฌ๋ถ. ๊ธฐ๋ณธ๊ฐ์ process.env.NODE_ENV !== 'production'
cache: true, // ์บ์๋ฅผ ํ์ฑํํ ์ง ์ฌ๋ถ. ๊ธฐ๋ณธ๊ฐ์ true
cacheDir: '.cache', // ์บ์๋ฅผ ์ ์ฅํ ๋๋ ํ ๋ฆฌ. ๊ธฐ๋ณธ๊ฐ์ .cache
minify: false, // ํ์ผ ๋ฏธ๋ํ์ด์ผ์ด์
. process.env.NODE_ENV === 'production'๋ฉด ํ์ฑํ๋จ.
target: 'browser', // browser/node/electron, ๊ธฐ๋ณธ๊ฐ์ browser
https: false, // ํ์ผ์ https๋ก ์๋นํ ์ง http๋ก ํ ์ง ์ฌ๋ถ. ๊ธฐ๋ณธ๊ฐ์ false
logLevel: 3, // 3 = ๋ชจ๋ ๊ฒ์ ๋ก๊น
, 2 = ๊ฒฝ๊ณ ์ ์๋ฌ๋ฅผ ๋ก๊น
, 1 = ์๋ฌ๋ง ๋ก๊น
hmrPort: 0, // HMR ์์ผ์ด ๋์๊ฐ ํฌํธ๋ฒํธ. ๊ธฐ๋ณธ๊ฐ์ ๋ฌด์์์ ๋น ํฌํธ (node.js์์ 0์ ๋ฌด์์์ ๋น ํฌํธ๋ก ๋ฐฐ์ ๋จ)
sourceMaps: true, // ์์ค๋งต์ ํ์ฑํํ ์ง ์ฌ๋ถ. ๊ธฐ๋ณธ๊ฐ์ ํ์ฑํ (์์ง ๋ฏธ๋ํ์ด๋ ๋น๋์์ ์ง์๋์ง ์์)
hmrHostname: '', // ๋น ๋ฅธ ๋ชจ๋ ๊ต์ฒด๋ฅผ ์ํ hostname.๊ธฐ๋ณธ๊ฐ์ ''
detailedReport: false // ๋ฒ๋ค, ์ ์
, ํ์ผ ํฌ๊ธฐ, ๋น๋ ์๊ฐ์ ๋ด์ ์์ธํ ๋ฆฌํฌํธ๋ฅผ ์ถ๋ ฅ. ๊ธฐ๋ณธ๊ฐ์ false. ๋ฆฌํฌํธ๋ ์ค์ง watch๊ฐ ๋นํ์ฑ์ผ๋๋ง ์ถ๋ ฅ๋จ
}
async function runBundle() {
// ์ง์
์ ์์น์ ์ต์
์ ์ ๊ณตํด์ ๋ฒ๋ค๋ฌ๋ฅผ ์ด๊ธฐํ
const bundler = new Bundler(file, options)
// ๋ฒ๋ค๋ฌ๋ฅผ ์คํํจ. ์ด๊ฒ์ ๋ฉ์ธ ๋ฒ๋ค์ ๋ฐํํจ.
// watch ๋ชจ๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ด promise๋ ๋งค ๋น๋๋ง๋ค ํธ์ถํ๋๊ฒ ์๋๋ผ ๋ฑ ํ ๋ฒ๋ง ํธ์ถํ๊ณ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ ๊ฒ
const bundle = await bundler.bundle()
}
runBundle()
์ด๋ฒคํธ
๋ชจ๋ ๋ฒ๋ค๋ฌ ์ด๋ฒคํธ ๋ชฉ๋ก์ ๋๋ค.
bundled
์ด๋ฒคํธ๋ ์ฒ์ ํ ๋ฒ๋ง, Parcel ์ด ์ฑ๊ณต์ ์ผ๋ก ๋ฒ๋ค๋ง์ ๋ง์น ํ ๋ฐ์๋์ด, ๋ฉ์ธ ๋ฒ๋ค์ callback ์ ์ ๋ฌํฉ๋๋ค.
const bundler = new Bundler(...);
bundler.on('bundled', (bundler) => {
// bundler๋ ๋ชจ๋ ์ ์
๊ณผ ๋ฒ๋ค์ ํฌํจํฉ๋๋ค. ์์ธํ๊ฑด ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
});
// ์ด๋์ ๊ฐ bundler.bundle() ๋ฅผ ํธ์ถํจ
buildEnd
์ด๋ฒคํธ๋ ์ฌ๋น๋๋ฅผ ํฌํจํ ๋น๋ ํ ๋งค๋ฒ ๋ฐ์๋ฉ๋๋ค. ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ ๋ฐ์ํฉ๋๋ค.
const bundler = new Bundler(...);
bundler.on('buildEnd', () => {
// Do something...
});
// ์ด๋์ ๊ฐ bundler.bundle() ๋ฅผ ํธ์ถํจ
๋ฒ๋ค
Bundle
์ Parcel ์ด ์ ์
์ ํจ๊ป ๋ฒ๋ค๋งํ๊ธฐ ์ํด ์ฌ์ฉํ๋ฉฐ, ๋ฒ๋ค ํธ๋ฆฌ๋ฅผ ๋น๋ํ๊ธฐ ์ํด ์์, ํ์ ๋ฒ๋ค์ ํฌํจํฉ๋๋ค.
์์ฑ๋ค
type
: ์ ์ ์ ์ข ๋ฅ (e.g. js, css, map, ...)name
: ๋ฒ๋ค์ ์ด๋ฆ (entryAsset
์Asset.generateBundleName()
๋ก ์์ฑ)parentBundle
: ๋ถ๋ชจ ๋ฒ๋ค. ์ง์ ์ ๋ฒ๋ค์ผ ๊ฒฝ์ฐ nullentryAsset
: ๋ฒ๋ค์ ์ง์ ์ . name ์ ์์ฑ ๋ฐ ์ ์ ์์ง์ ์ฌ์ฉ.assets
: ๋ฒ๋ค ์์ ์๋ ๋ชจ๋ ์ ์ ์ ์งํฉ(Set
)childBundles
: ๋ชจ๋ ์์ ๋ฒ๋ค์Set
siblingBundles
: ๋ชจ๋ ํ์ ๋ฒ๋ค์Set
siblingBundlesMap
: ๋ชจ๋ ํ์ ๋ฒ๋ค์Map<String(Type: js, css, map, ...), Bundle>
offsets
: ๋ฒ๋ค ์์ ์ ์ ์์ ๋ชจ๋ ์์น์Map<Asset, number(bundle ์์ ์ค ๋ฒํธ)>
. ์ ํํ ์์ค๋งต ์์ฑ์ ์ํด ์ฌ์ฉ๋จ
Tree
Bundle
์ parentBundle
, childBundles
, siblingBundles
์ ํฌํจํ๊ณ , ์ด ๋ชจ๋ ์์ฑ์ ๋น ๋ฅด๊ฒ ๋ฒ๋คํธ๋ฆฌ๋ฅผ ์ํํ์ฌ ๋ง๋ค์ด์ง๋๋ค.
๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ์ ์ ํธ๋ฆฌ๋ก ๋ฒ๋ค ํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
์ ์ ํธ๋ฆฌ
index.html
๋ index.js
์ index.css
๋ฅผ ํ์๋ก ํฉ๋๋ค.
index.js
๋ test.js
์ test.txt
๋ฅผ ํ์๋ก ํฉ๋๋ค.
index.html
-- index.js
|--- test.js
|--- test.txt
-- index.css
๋ฒ๋ค ํธ๋ฆฌ:
index.html
์ ๋ฉ์ธ ๋ฒ๋ค์ ์ํด ์ง์
์ ์
์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๋ฉ์ธ ๋ฒ๋ค์ index.js
๊ณผ index.css
2 ๊ฐ์ ์์ ๋ฒ๋ค์ ๋ง๋ญ๋๋ค. ๋ ๋ค html
๊ณผ ๋ค๋ฅธ ํ์
์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
index.js
๋ test.js
, test.txt
๋ ํ์ผ์ ํ์๋ก ํฉ๋๋ค.
test.js
์ index.js
๋ฒ๋ค์ ์ ์
์ผ๋ก ์ถ๊ฐ๋ฉ๋๋ค. index.js
์ ๊ฐ์ ์์ ํ์
์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
test.txt
๋ index.js
์ ๋ค๋ฅธ ์ ์
ํ์
์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ํด ์ ๋ฒ๋ค์ด ์์ฑ๋๊ณ , ํด๋น ๋ฒ๋ค์ index.js
๋ฒ๋ค์ ์์์ผ๋ก ์ถ๊ฐ๋ฉ๋๋ค.
index.css
๋ ๋ค๋ฅธ ์์กด์ฑ์ด ์๊ณ , ์ํธ๋ฆฌ ์ ์
์์๋ง ์ฐ์
๋๋ค.
index.css
์ index.js
๋ฒ๋ค์ ๊ฐ์ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง๋ฏ๋ก ์๋ก์ ํ์ ๋ฒ๋ค ์
๋๋ค.
index.html
-- index.js (index.js์ test.js๋ฅผ ํฌํจ)
|--- test.txt (test.txt๋ฅผ ํฌํจ)
-- index.css (index.css๋ฅผ ํฌํจ)
Middleware
๋ฏธ๋ค์จ์ด๋ http ์๋ฒ์ ํ
์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค. (์๋ฅผ ๋ค์ด express
๋ node http
).
Parcel ๋ฏธ๋ค์จ์ด๋ฅผ express ์ ์ฌ์ฉํ๋ ์์ ์ ๋๋ค.
const Bundler = require('parcel-bundler')
const app = require('express')()
const file = 'index.html' // ์ํธ๋ฆฌ ํฌ์ธํธ๋ก ์ฐ์ผ ์ ๋๊ฒฝ๋ก๋ฅผ ์ ์ต๋๋ค
const options = {} // ๊ฐ๋ฅํ ์ต์
์ API ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์
// ํ์ผ๊ณผ ์ต์
์ ์ฌ์ฉํด ๋ฒ๋ค๋ฌ๋ฅผ ์ด๊ธฐํํฉ๋๋ค
const bundler = new Bundler(file, options)
// express๊ฐ ๋ฒ๋ค๋ฌ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด express server๋ฅผ ๊ฑฐ์น๋ ๋งค ์์ฒญ์ Parcel์ด ์ฒ๋ฆฌํ ๊ฒ์
๋๋ค.
app.use(bundler.middleware())
// 8080ํฌํธ๋ก listen์ ์์ํฉ๋๋ค.
app.listen(8080)
๋ฌธ์์ ๊ฐ์ ์ ๋์์ฃผ์ธ์
๋น ์ง์ ์ด ์๊ฑฐ๋ ๋ช ํํ์ง ์์ ๊ฒฝ์ฐ, ์น ์ฌ์ดํธ ์ ์ฅ์์ ์ด์๋ฅผ ์ ๊ธฐํด ์ฃผ์๊ฑฐ๋ ํ์ด์ง๋ฅผ ์์ ํด ์ฃผ์ธ์..