Snowpack
은 Webpack
처럼 복잡하고 무거운 빌드 시스템의 대안으로 만들어졌다.
기존의 Webpack, Rollup 그리고 Parcel 같은 무겁고 복잡한 번들러의 번들 소요 시간을 획기적으로 절약할 수 있습니다.
단일 파일만 다시 빌드
$ npm init
$ npm i --save-dev snowpack
$ npm i react react-dom
snowpack 하나도 복잡한 웹팩 설정 플러그인 설치과정을 생략 할 수 있습니다
생략 가능 플로그인들...
$npm i -D babel-loader @babel/core @babel/preset-env
$npm i -D webpack webpack-cli webpack-dev-server
$npm i -D html-webpack-plugin ts-loader
일반적으로 webpack으로 번들링 한다면 webpack.config, babelrc 등과 같은 설정 파일이 필요하겠지만
snowpack을 사용하면 모두 불필요 ⚔️
2. index.html 에 script 추가하기
//index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Snow pack demo</title>
</head>
<body>
<div id="root"></div>
// snowpack으로 인해 jsx -> js 로 컴파일될 index.js를 추가해줍니다.
<script type=module src="./src/index.js"></script>
</body>
</html>
ESM을 사용하려면 script 요소에 type="module" 속성을 추가해야 한다. 그러면 인라인 스크립트 안에서도 import 구문을 쓸 수 있게 된다.
3. index.jsx 구조 맞추기
// index.jsx
import React from 'react';
import ReactDom from 'react-dom';
import { App } from './App'
ReactDom.render(<App />, document.getElementById('root'));
4. 마지막으로 스크립트에 snowpack dev 명령을 추가해 서버를 켜기
// package.json
"scripts": {
"start": "snowpack dev",
},
// snowpack.config.js
module.exports = {
devOptions: {
port: 8080, // 개발 서버를 실행할 포트 번호
fallback: 'index.html', // SPA인 경우 제공할 모든 사용자 경로
open: 'default', // 새 브라우저 탭에 개발 서버를 열기, "default" | "none" | "BROWSER_NAME"
output: 'dashboard', // 콘솔의 출력 모드를 지정, "stream" | "dashbaord"
hostname: 'localhost', // 브라우저가 열리는 호스트 이름
hmr: true, // Hot Module Replacement(HMR, 수정사항을 즉시 반영) 활성화
hmrErrorOverlay: true, // HMR 활성화시 자바스크립트 오류 표시 여부
secure: false, // HTTP2 활성화 상태에서 HTTPS 사용 여부
// out: 'build' // Deprecated!
},
buildOptions: {
out: 'build', // 최종 빌드를 출력하는 로컬 디렉토리 이름
baseUrl: '/', // 제품 모드의 기본 URL 지정, 현재 앱이 하위 디렉토리로 배포되는 경우 유용
clean: false, // 빌드 전 기존 데이터 제거
metaDir: '__snowpack__', // HMR 및 ENV 등의 정보를 출력할 디렉토리 이름
sourceMap: false, // 소스 맵 사용 여부
webModulesUrl: 'web_modules' // 사용하는 웹 모듈이 저장될 디렉토리 이름
}
}
$ npm i -g typescript
$ tsc --init
preact를 적용하기 위해 typescript에 설정을 추가해줍니다.
//tsconfig.json
"compilerOptions": {
"jsx": "react",
"jsxFactory": "h"
...
}
최소한의 쉬운 프로젝트 구조로 프로젝트 초기세팅을 쉽고 즉시 실행 할 수 있게 해줍니다.
webpack, babel, terser등의 구성없이 핫 리로딩, CSS 인라이닝에 이르기까지 모든 것이 최적으로 설정 됩니다
Light house score
100 지원! routes
에 대한 자동 코드 분할오프라인 캐싱
을 위해 자동 생성된 서비스 워커.PRPL 패턴
지원."preact": "^10.6.4"
"wouter-preact": "^2.8.0-alpha.2"
// A tiny routing solution for modern React and Preact apps
// package.json
"snowpack": {
"webDependencies": [
"preact",
"preact/compat",
"wouter-preact"
]
}
before
// index.jsx
import React from 'react';
import ReactDom from 'react-dom';
import { App } from './App'
ReactDom.render(<App />, document.getElementById('root'));
after
// index.tsx
import { h, render } from 'preact';
import { App } from './App'
const dom = document.getElementById('root') as Document | Element | ShadowRoot | DocumentFragment;
render(<App />, dom);
before
// Component.jsx
import React from 'react';
after
// Component.tsx
import { h } from 'preact'
import { h } from 'preact'
import { Link, Route } from 'wouter-preact'
import {Suspense, lazy} from 'preact/compat'
const sleep = (ms:number) => new Promise(resolve => setTimeout(resolve,ms));
const Account = lazy(async() => {
await sleep(3000);
return import("./Account");
})
const App = () => {
return(
<div>
<ul>
<li><Link href="/account">Account</Link></li>
</ul>
<Suspense fallback={'loading...'}>
<Route path="/account">
<Account />
</Route>
</Suspense>
</div>
)
}
끝-
https://heropy.blog/2020/10/31/snowpack/
https://blog.rhostem.com/posts/2020-12-16-migration-from-cra-to-snowpack