본문으로 건너뛰기

포매터

Phasis는 자체 파서를 기반으로 한 네이티브 JavaScript 포매터를 제공합니다. 소스를 prettier 호환 레이아웃 규칙에 따라 다시 출력하며, 전적으로 PHP에서 실행됩니다. Node.js도, 해석되는 포매터 번들도, 외부 프로세스도 필요하지 않습니다.

formatSource

PHP
public static function formatSource(
    string $source,
    string $sourceType = 'script',
    ?FormatOptions $options = null,
): string

Phasis\Formatter\Formatter의 단일 호출 진입점입니다. $sourceType로 언어를 선택합니다. JavaScript에는 script 또는 module를, json나 css에는 해당 언어를 지정합니다. JavaScript은 지정된 목표에 따라 파싱하고 주석을 다시 연결한 뒤, 설정된 출력 너비에 맞춰 출력합니다.

PHP
use Phasis\Formatter\Formatter;
use Phasis\Formatter\FormatOptions;

$formatted = Formatter::formatSource(
    "const a={x:1,y:2};",
    'script',
    new FormatOptions(useTabs: true, singleQuote: true),
);
// "const a = { x: 1, y: 2 };\n"

유효하지 않은 소스는 파서와 동일하게 줄, 열, 오프셋 정보가 포함된 Phasis\Exceptions\SyntaxError를 발생시킵니다.

FormatOptions

레이아웃 옵션은 prettier 3.x를 따르며, 기본값도 prettier의 기본값을 사용합니다.

옵션 기본값 의미
printWidth 80 레이아웃을 맞출 목표 줄 너비입니다.
tabWidth 2 들여쓰기 단계당 공백 수(탭의 측정 너비)이기도 합니다.
useTabs false 공백 대신 탭으로 들여씁니다.
semi true 문장 끝의 세미콜론입니다.
singleQuote false 이스케이프가 더 적게 필요한 경우 "보다 '을 선호합니다.
trailingComma 'all' 'all', 'es5' 또는 'none'입니다.
bracketSpacing true 객체 중괄호 안의 공백: { a }와 {a} 중 하나입니다.
arrowParens 'always' 매개변수가 하나인 화살표 함수에 'always' 또는 'avoid'를 사용합니다.

CSS

formatSource($css, 'css')는 prettier의 스타일시트 레이아웃 규칙으로 스타일시트를 포맷합니다. 선택자 목록에서는 선택자마다 한 줄씩, 선언마다 한 줄씩 배치하고, 결합자와 값의 간격을 정규화합니다. 단순 값 목록은 줄 너비에 맞춰 채우고, 그림자와 그라디언트의 쉼표 목록은 항목마다 한 줄씩 배치합니다. 함수 인수는 모두 한 줄에 두거나 모두 여러 줄로 나누며, 빈 줄과 주석을 보존합니다. Tailwind의 @apply처럼 알 수 없는 at-rule의 전치부는 수정하지 않습니다. 긴 복합 선택자는 하위 선택자 결합자 앞에서 줄을 나누며, 너무 긴 의사 클래스 인수는 괄호 안에서 줄을 바꿉니다.

JSON

formatSource($json, 'json')는 JavaScript 파서와 프린터를 재사용하며 prettier의 JSON 규칙을 적용합니다. 키는 따옴표로 감싸고, singleQuote와 관계없이 문자열은 큰따옴표를 유지하며, 후행 쉼표는 사용하지 않습니다. 문서 내부의 // 주석도 보존됩니다.

레이아웃 규칙

프린터는 prettier 문서 모델을 구현합니다. 그룹이 출력 너비에 들어가면 한 줄로 펴고, 그렇지 않으면 줄을 나눕니다. 호출 인수는 뒤따르는 함수 또는 객체 인수와 붙여 배치하며, 멤버 체인이 줄을 넘으면 각 점 앞에서 줄을 나눕니다. 여러 줄로 작성된 객체는 여러 줄 형식을 유지하고, 문장 사이에는 빈 줄을 최대 하나까지 보존합니다. 옵션이 일치하는 prettier 포맷 입력은 실제 코드에서도 바이트 단위로 동일하게 출력됩니다. 적합성 테스트는 prettier 자체에서 생성한 픽스처로 이를 검증합니다.

주석

토큰화 중 주석을 수집하고(Parser::setCollectComments(true), 도구에서 사용할 수 있도록 파서에 노출됨) 트리에 선행, 후행 또는 독립 주석으로 다시 연결합니다. 줄 주석은 원래 줄에 유지되고, 같은 줄의 후행 주석은 해당 문장에 붙어 있으며, 주석 주변의 빈 줄도 보존됩니다. /** ... */ 블록은 들여쓰기를 다시 적용하고 * 여백을 맞춥니다.

보장 사항

테스트 스위트가 적용하는 다음 세 가지 불변 조건은 포맷된 모든 출력에서 성립합니다.

  • 출력은 동등한 프로그램으로 다시 파싱됩니다(위치는 제외).
  • 입력의 모든 주석이 출력에도 유지됩니다.
  • 포맷은 멱등적입니다. 포맷된 출력을 다시 포맷해도 바뀌지 않습니다.

성능

포맷은 파서 속도로 실행됩니다. 실제 파일은 수십 밀리초 안에 포맷되며, 일반적인 프로젝트에서 직접 작성한 JavaScript도 단일 프로세스에서 전체 포맷에 1초가 채 걸리지 않습니다.