GN⁺: HN 소개: 노드 또는
(github.com/chearon)Dropflow 소개
- Dropflow는 기초적인 CSS 표준(인라인, 블록, 플로트, 포지셔닝, 테이블 등)의 범위를 탐색하기 위해 만들어진 CSS 레이아웃 엔진임.
- 고품질의 텍스트 레이아웃 구현을 지원하며, 세계 여러 언어의 표시가 가능함.
- 백엔드에서 Node와 node-canvas를 사용하여 PDF나 이미지를 생성하거나, 브라우저에서 캔버스로 풍부하고 감싸진 텍스트를 렌더링하는 데 사용할 수 있음.
주요 기능
-
float
과 같은 복잡한 30개 이상의 속성 지원 - 양방향 및 RTL 텍스트 지원
- HTML과 CSS를 받아들이는 것 외에도 객체로 스타일을 지정하는 Hyperscript(
h()
) API 지원 - 모든 OpenType/TrueType 버퍼를 등록해야 함
- 그래피미 단위에서의 폰트 폴백
- 색상 있는 발음 기호 지원
- 바람직한 줄바꿈(예: 다음 줄로 시작 패딩 이동)
- 최적화된 shaping
- 상속 및 계단식 스타일은 두 번 계산되지 않음
- 가능한 많은 CSS 레이아웃 엣지 케이스 처리
- 완전한 타이핑
- 많은 테스트
- 빠름
지원되는 CSS 규칙
- 인라인 포맷팅:
color
,direction
,font-family
,font-size
,font-stretch
,font-style
,font-weight
,line-height
,text-align
,vertical-align
,white-space
등의 속성이 작동 상태임. - 블록 포맷팅:
clear
,float
속성이 작동 상태임. - 박스 및 포지셔닝:
background-clip
,background-color
,border-color
,border-style
,border-width
,top
,right
,bottom
,left
,box-sizing
,display
,height
,margin
,padding
,position
,width
,z-index
등의 속성이 작동 상태임.
사용 방법
- Dropflow는 상속받고 계산된 스타일을 가진 DOM에서 작동함.
-
h()
함수를 사용하여 DOM을 생성하고, 스타일을 일반 객체로 지정함. - 폰트를 레이아웃 전에 등록하는 것은 필수 단계임.
- 캔버스의 전체 크기로 레이아웃하고 그림을 그릴 수 있음.
성능 특성
- 성능은 정확성 다음으로 중요한 목표임.
- 여러 예제를 통해 성능을 확인할 수 있음.
- 2019년형 MacBook Pro에서 HTML을 이미지로 변환하는 데 9ms, 2012년형 MacBook Pro에서는 13ms가 소요됨.
- 'The Little Prince'를 HTML에서 이미지로 변환하는 데 2019년형 MacBook Pro에서는 160ms 미만, 2012년형 MacBook Pro에서는 250ms 미만이 소요됨.
- 10글자 단어를 생성하고 레이아웃하는 데(그리기 제외) 2019년형 MacBook Pro에서는 25µs 미만, 2012년형 MacBook Pro에서는 50µs 미만이 소요됨.
- Hyperscript API를 사용하면 HTML과 CSS 파싱 단계를 건너뛰고 DOM을 직접 생성하여 가장 빠른 성능을 달성할 수 있음.
API
- 폰트 등록 및 DOM 생성이 첫 두 단계임.
- DOM을 캔버스에 렌더링하거나, 레이아웃을 유지하고 싶은 경우 하위 수준 함수를 사용할 수 있음.
HarfBuzz
- 글리프 레이아웃은 WebAssembly로 컴파일된 HarfBuzz에 의해 수행됨.
- 이를 통해
measureText
API를 사용할 때는 불가능한 수준의 정확성을 달성할 수 있음.
감사의 말
- dropflow는
package.json
의존성이 없지만, 많은 다른 프로젝트 덕분에 가능했음. - Javascript 의존성은 프로젝트에 맞게 수정되어 체크인되었음.
GN⁺의 의견
- Dropflow는 웹 개발자들에게 CSS 레이아웃의 복잡성을 해결하고, 브라우저와 백엔드 모두에서 일관된 텍스트 레이아웃을 제공하는 새로운 도구임.
- 이러한 도구는 특히 다양한 언어와 폰트를 지원해야 하는 국제화된 웹 애플리케이션 개발에 유용할 수 있음.
- HarfBuzz를 사용하는 것은 텍스트 렌더링의 정확성을 크게 향상시킬 수 있지만, 웹어셈블리 기술에 익숙하지 않은 개발자에게는 진입 장벽이 될 수 있음.
- 비슷한 기능을 제공하는 다른 프로젝트로는 CSS Grid와 Flexbox를 사용하는 레이아웃 라이브러리들이 있지만, Dropflow는 더 전통적인 CSS 레이아웃 방식에 초점을 맞추고 있음.
- Dropflow를 도입하기 전에는 성능과 호환성을 고려하여 프로젝트 요구 사항과 잘 맞는지 평가해야 함.
원 제목은 "Show HN: Dropflow, a CSS layout engine for node or <canvas>" 이거였군요. 지금은 "GN⁺: HN 소개: 노드 또는 <canvas>용 CSS 레이아웃 엔진, Dropflow</canvas>"로 들어가있네요.
Hacker News 의견
- 브라우저 렌더링 엔진의 '마법 상자'를 명확히 설명하는 자료의 중요성을 강조함. HTML과 CSS 렌더링을 위한 기계가 읽을 수 있는 전체 사양을 만들 수 있다면, 렌더러를 생성할 수 있을 것이며, 브라우저의 특이점은 그 확장이 될 수 있음.
- 오픈소스로 제공된 이 작업에 대한 감사를 표함. 백엔드에서 아름다운 PDF를 생성하는 현재의 방법은 헤드리스 브라우저를 실행하고 브라우저 API를 사용하여 HTML/CSS를 PDF로 변환하는 것인데, 이는 서버에서 브라우저 인스턴스를 실행하고 큰 작업 부하에 적절히 확장하는 것이 비용이 많이 든다고 함. 이제 브라우저 오버헤드 없이 HTML/CSS를 사용하여 PDF를 설계하고 생성할 수 있음.
- CSS와 SVG를 그래픽 및 UI 라이브러리에 대한 추상화로 사용할 수 있는지에 대한 궁금증과 관련이 있음. node-canvas가 그림 그리기 부분을 채우는 것처럼 보이며, 이는 UI 라이브러리에서 필요한 레이아웃 부분을 할 수 있을 것으로 보임. CSS 구현의 어려움에 대한 의문을 제기함.
- 프로젝트에 이와 같은 것을 찾고 있었고, SVG나 캔버스를 사용하는 다른 프로젝트에도 유용할 것이라는 감사의 말을 전함.
- HTML을 PNG로 프로그래밍 방식으로 변환하는 것이 얼마나 어려운지 대부분의 사람들이 깨닫지 못할 것이라고 함. Node와 브라우저의 차이 또는 HTML과 캔버스의 차이와 관련된 수많은 작은 문제들에 직면하게 됨.
- CSS를 이해하고 그 주위에 레이아웃 엔진을 구축하는 데 필요한 엄청난 작업량을 상상할 수 없다는 의견을 제시함.
- Flexbox에 어려움을 겪는 사람들을 위해, 다양한 속성에 집중할 필요 없이 반응형 레이아웃을 만드는 과정을 간소화할 수 있는 도구를 소개함.
- 이것이 큰 성과라며 축하를 전함. 많은 시간이 투자되었을 것이라고 확신하며, 스프레드시트 제품과 PDF(미리보기?) 제품도 만들고 있는지, 어떻게 결합하는지에 대한 궁금증을 표함.
- 작업에 대한 칭찬과 함께 chearon에게 감사를 표함.
- 이것을 NativeScript나 Node.js와 같은 것의 기본 요소로 사용할 가능성을 확인해볼 것이라고 공유함. 텍스트는 UI 프레임워크가 제공하는 가장 복잡한 UI 요소 중 하나이며, Flow Layout이 작동한다면 매우 고무적임. 제스처(특히 텍스트 강조) 및 IME 통합과 같은 기능이 얼마나 진행되었는지에 대한 관심을 표함. 어쨌든 오픈소스로 제공해준 것에 대한 칭찬을 전함.