vfunc.js

비교: Vanilla · vfunc · React/Vue

같은 기능(할 일 추가와 목록)을 세 방식으로 쓰면 차이가 드러납니다. 어느 쪽이 항상 낫다는 뜻은 아닙니다. 목적에 맞게 고르세요.

Vanilla JS

const list = document.querySelector('#list');
const items = [];
document.querySelector('#add').addEventListener('click', () => {
  const input = document.querySelector('#text');
  items.push(input.value);
  list.innerHTML = items.map((t) => '<li>' + t + '</li>').join('');  // 이스케이프 누락 → XSS
  input.value = '';
});

vfunc.js

const todo = vf.vfunc({
  state: { items: [] },
  render: (s) => vf.html`
    <form data-action="add"><input data-ref="text"><button>Add</button></form>
    <ul>${s.items.map((t) => vf.html`<li>${t}</li>`)}</ul>`,
  delegates: [{ selector: '[data-action="add"]', eventType: 'submit', onEvent: (e) => {
    e.event.preventDefault();
    e.sender.setState({ items: e.sender.items.concat(e.sender.refs.text.value) });
  } }]
});
todo.mount('#app');

React

function Todo() {
  const [items, setItems] = useState([]);
  const [text, setText] = useState('');
  return (
    <>
      <form onSubmit={(e) => { e.preventDefault(); setItems([...items, text]); setText(''); }}>
        <input value={text} onChange={(e) => setText(e.target.value)} /><button>Add</button>
      </form>
      <ul>{items.map((t, i) => <li key={i}>{t}</li>)}</ul>
    </>
  );
}

어떤 경우에 무엇을

Vanillavfunc.jsReact / Vue
빌드없음없음필요
크기(gzip)0약 9KB약 34~45KB + 앱
이스케이프직접위치별 자동자동(JSX/템플릿)
기존 HTML에 동작만 붙이기직접vf.attach어려움
큰 목록 성능직접 최적화render는 불리함(전체 교체), vf.ext.list로 보완(측정 결과)유리
IE11직접legacy 파일사실상 불가
생태계·채용—작음큼

vfunc.js가 잘 맞는 곳: 서버 렌더링 페이지나 퍼블리싱 HTML에 동작을 붙일 때, 사내 시스템처럼 빌드 파이프라인을 두기 어려울 때, AI와 함께 빠르게 화면을 만들 때, IE를 아직 지원해야 할 때.