Prettier 1.10: Ett Ă„r med Prettier đ
Denna sida har översatts av PageTurner AI (beta). Inte officiellt godkĂ€nd av projektet. Hittade du ett fel? Rapportera problem â
Grattis pÄ Prettier-Ärsdagen! Det Àr rÀtt otroligt att Prettier slÀpptes för bara ett Är sedan och redan fÄtt sÄ massiv spridning och sÄ mÄnga bidragsgivare. För den hÀr speciella utgÄvan ska vi göra en liten Äterblick kring projektet.
Det Àr ocksÄ en spÀnnande utgÄva i sig eftersom Prettier nu har partiellt stöd för .vue-filer och kÀrnkoden har omstrukturerats sÄ att det finns ett riktigt plugin-API för att stödja olika sprÄk!
Ă terblickâ
Ănda sedan gofmt kom 2013 blev jag (@vjeux) besatt av idĂ©n om automatisk formatering. Jag började hela tiden se problem som skulle lösas av en automatisk formaterare: diskussioner om kodstil, manuell formatering, svĂ„righeter att skriva codemod-verktygâŠ
NÀr det förra december inte var en utan tvÄ personer som sjÀlvstÀndigt arbetade med en JavaScript-pretty-printer var det ett tecken! Pieter Vanderwerff byggde en i Reason baserad pÄ Flow-infrastruktur och James Long i JavaScript. Jag agerade hejarklack genom att sÀtta upp samma testpaket för bÄda projekten samt köra deras pretty-printer pÄ befintliga kodbaser och extrahera listor över saker som inte formaterades bra.
TyvÀrr, efter semestern var bÄda tvungna att ÄtergÄ till sina ordinarie jobb :( Jag bestÀmde mig för att kliva in och övertala min chef att lÄta mig arbeta med det heltid. James hade öppnat kÀllkoden till sitt projekt (Prettier) och jag var mer bekant med JavaScript sÄ jag valde att fokusera pÄ det!
HÀr Àr en lista över saker som fungerat bra i projektet:
LĂ€gg ned tid pĂ„ versionsfaktaâ
Versionsfakta har den intressanta egenskapen att de ofta delas, Àven om innehÄllet Àr dÄligt. Alla verkar vilja veta nÀr version 1.5.8 av nÄgon mjukvara slÀpps. Det Àr ett utmÀrkt tillfÀlle att marknadsföra ditt projekt.
För Prettiers releaser la jag mycket tid pÄ att förklara tankarna bakom alla Àndringar och tog upp saker som annars skulle blivit separata blogginlÀgg (som detta!). Dessutom Àr man ofta lat och hittar ursÀkter för att inte skriva blogginlÀgg, men man vill absolut slÀppa nya versioner - sÄ det Àr en bra pÄdrivkraft.
Tydlig beslutsprocessâ
Stilregler Àr bland de mest omdiskuterade Àmnena samtidigt som mÄnga beslut mÄste fattas. Jag försökte skapa en beslutsprocess som möjliggjorde framsteg.
Folk anvÀnder alla möjliga kÀnslomÀssiga argument för att övertyga om att deras stil Àr bÀst. Vi behövde nÄgot rent rationellt sÄ att folk, Àven om de föredrog annat, inte kunde argumentera mot metodiken.
Den bÀsta lösningen jag hittade var att rÀkna förekomster i Facebooks kodbas. Det Àr enkelt för mig att köra och presentera relativa siffror (stil A anvÀnds 5x mer Àn stil B) för att övertyga. Om en sÄ stor kodbas skriven av tusentals utvecklare över Ären har en tydlig vinnare, kanske den inte Àr optimal men troligen inte kontroversiell.
Allt kunde inte lösas sÄ - vissa saker hade ingen tydlig vinnare eller algoritm för bra utskrift. DÀr var det viktigt med en eskalering dÀr en person (jag) fattade slutgiltigt beslut. PÄ sÄ vis kunde vi göra framsteg utan konsensus, vilket skulle varit mycket svÄrt.
Ăppen kĂ€llkod som försökskaninerâ
En fullstÀndig pretty printer Àr ett av de projekt dÀr den mÄste vara nÀra perfekt för att introduceras i en stor kodbas som Facebook. Första intrycket Àr extremt viktigt och det Àr mycket svÄrt att skapa nÄgot som Àr korrekt (det fÄr inte introducera ogiltig JavaScript eller kod som beter sig annorlunda) för alla specialfall.
Min ursprungliga plan var att arbeta ensam i ett gömstÀlle bortom omvÀrlden i 6 mÄnader tills allt var perfekt, och sedan fÄ andra att anvÀnda det. Vad jag inte förvÀntade mig var att open source-vÀrlden inte hade samma kvalitetskrav och började anvÀnda det mycket tidigare. Riskerna med att anvÀnda det i ett sidoprojekt Àr helt annorlunda jÀmfört med miljontals kodrader pÄ Facebook.
Det visade sig vara mycket fördelaktigt för projektet att fÄ feedback under utvecklingsfasen tills det slutligen var klart för anvÀndning pÄ Facebook.
Open source som bidragsgivareâ
Under de första 6 mÄnaderna arbetade jag heltid med projektet men skrev bara hÀlften av commiterna. Det Àr i sig hÀpnadsvÀckande! Inte nog med att projektets genomströmning fördubblades, utan bidragsgivare arbetade Àven med saker jag inte skulle prioriterat: integrationer med alla textredigerare, en fuzzer för att hitta buggar, TypeScript-stöd, infrastruktur för flersprÄkstolkning i samma fil med mera.
Ăven om vi inte anvĂ€nder alla dessa funktioner pĂ„ Facebook, visade sig mĂ„nga vara anvĂ€ndbara. CSS-in-JS-stöd gjorde det enkelt att formatera GraphQL-fragment i malliteraler. Det stora anvĂ€ndarunderlaget bidrog ocksĂ„ till att upptĂ€cka ovanliga buggar som vi sĂ„ smĂ„ningom skulle stöta pĂ„, och mĂ„nga olika personer hjĂ€lpte till att fixa dem.
Det bĂ€sta Ă€r att jag slutade arbeta heltid med projektet för 6 mĂ„nader sedan, men det fortsatte under @azzs ledning. Jag vill tacka alla som bidragit pĂ„ olika sĂ€tt â det Ă€r otroligt spĂ€nnande att skapa historia tillsammans!
Open source har gjort underverk för projektet, levererat enormt vÀrde för Facebook (nÀstan alla vÄra JavaScript-filer Àr nu formaterade) och för hela branschen med sin omfattande anvÀndning.
Verktyg: Jest Snapshot-tester & Playgroundâ
Alla dessa bidrag möjliggjordes tack vare enkla processer för felrapportering, kodbidrag och granskning. De tvÄ mest inflytelserika verktygen var jest snapshot-tester och playground.
Snapshot-tester Ă€r fantastiska för en pretty printer. Att lĂ€gga till tester Ă€r enkelt: skapa en fil i testmappen med koden du vill formatera och kör jest â voilĂ ! Vid Ă€ndringar ser du hur flera exempel formateras annorlunda, och fĂ„r bedöma om det Ă€r förbĂ€ttringar. För granskare Ă€r det perfekt att se före/efter för alla Ă€ndringar. Jag lĂ€gger numera mer vikt vid ögonblicksbilderna Ă€n sjĂ€lva implementeringen.
Playground Àr ett utmÀrkt sÀtt att skapa reproducerbara exempel eller testa Prettier utan att installera utvecklingsmiljö eller byta gren. Detta har visat sig ovÀrderligt för att fÄ detaljerade, ÄtgÀrdsbara felrapporter.
Höjdpunkterâ
Stöd för Vue Single File Components (#3563) av @vjeuxâ
EfterfrÄgan pÄ Vue SFC (#2097) Àr stor. Vi har nu partiellt stöd: all HTML skrivs ut oförÀndrad, men nu formateras <script>- och <style>-taggarna med Prettier.
För att anvÀnda det: kör helt enkelt prettier pÄ dina *.vue-filer!
Prettier Plugin API (#3536) av @azzâ
NÀr Prettier för JavaScript har blivit stabil har vi pÄ senare tid haft bidragsgivare som vill lÀgga till nya sprÄk i Prettier, sÀrskilt har vi haft pull requests för att lÀgga till stöd för Python och PHP. Vi vill behÄlla kÀrnpaketet prettier portabelt och underhÄllbart, men vi vill ocksÄ ge folk möjlighet att köra Prettier pÄ fler sprÄk. DÀrför har vi introducerat ett plugin-API! Prettier-plugin kan bidra med parsers och/eller printers till Prettier-formateraren. De behandlas som förstklassiga medborgare och kan Àven bidra till inbÀddningsstöd (t.ex. formatering av ditt sprÄk inuti Markdown).
Att anvĂ€nda plugin Ă€r lika enkelt som att installera dem via npm/yarn och köra Prettier som vanligt â ingen ytterligare konfiguration behövs!
Det finns tre officiella plugin under utveckling:
Alla tre dessa plugin Àr fortfarande under aktiv utveckling och Àr inte redo för produktionskod, men hÄll ett öga pÄ dem eftersom de utvecklas!
Om du Àr intresserad av att hjÀlpa till att bygga dessa plugin, kolla deras repository-Àrenden eller kör dem mot din egen kod och börja rapportera buggar! LikasÄ, om du Àr intresserad av att bygga ett nytt sprÄk i Prettier och behöver hjÀlp att komma igÄng, skapa ett Àrende i prettier-repot sÄ hjÀlper vi dig.
Prettiers inbyggda sprÄk har omstrukturerats för att uttryckas via plugin-API:et, sÄ vi kan garantera att kÀrn-API:t förblir generiskt.
Se [dokumentationen][plugin api] för mer information.
Observera att eftersom detta Ă€r en ny och omfattande funktion slĂ€pper vi den med en beta-mĂ€rkning i dokumentationen. Ăven om vi inte förvĂ€ntar oss nĂ„gra större problem innebĂ€r det att vi kan göra bakĂ„tkompatibla Ă€ndringar i nĂ€sta version.
Andra Ă€ndringarâ
TypeScriptâ
Stöd för numeriska separatorer (#3580) av @azzâ
Numeriska separatorer Àr ett ECMAScript-förslag i stadium 3. Stöd har lagts till i TypeScript 2.7, och Prettier kommer nu att bevara dem.
// Before
SyntaxError: ',' expected. (1:10)
> 1 | var a = 1_000_000_000;
| ^
2 | var b = 0b1101_0101_1001;
3 | var c = 0xAE_FE_2F;
// After
var a = 1_000_000_000;
var b = 0b1101_0101_1001;
var c = 0xAE_FE_2F;
Flowâ
Skriv ut Flow-typkommentarer som kommentarer (#3449) av @duailibeâ
Flow typkommentarer Àr ett bra sÀtt att fÄ typkontroll utan att behöva transpilera dina filer. Innan denna release skulle Prettier, med Flow-parsern, inte skriva ut typkommentarerna som kommentarer, vilket gjorde det omöjligt att anvÀnda funktionen. Nu kommer Prettier korrekt upptÀcka om typkommentaren var en kommentar och skriva ut den pÄ rÀtt sÀtt för /*: ... */-kommentarer. Arbete pÄgÄr för /*:: ... */-kommentarer.
// Input
let foo: string = "a";
// Before
let foo: string = "a";
// After
let foo: string = "a";
Skriv ut kommentarer efter parametrar i arrow-funktioner (#3444) av @duailibeâ
Om du anvÀnder Babylon-parsern finns det olika problem med Flow-kommentarer dÀr kommentarer flyttas runt. Ett av dessa ÄtgÀrdades i denna release. Vi kommer nu nÀrmare stöd för denna funktion.
// Before
const run = (cmd /*: string */ /*: Promise<void> */) => {};
// After
const run = (cmd /*: string */) /*: Promise<void> */ => {};
Skriv ut parenteser i FunctionTypeAnnotation nĂ€r arrowParens Ă€r "always" (#3616) av @duailibeâ
I förra releasen lade vi till ett nytt arrowParens-alternativ. En plats dÀr det förbisÄgs var i Flow-funktionstypsannotationer. Nu nÀr arrowParens Àr instÀllt pÄ always kommer vi att sÀtta parenteser runt enskilda argument.
// --arrow-parens always
// Before
type SomeType = {
something: number => number
};
// After
type SomeType = {
something: (number) => number
};
JSXâ
Inline-do-uttryck inuti JSX (#3607) av @vjeuxâ
"Do expressions" Àr ett stage 1 ECMAScript-förslag som Àr sÀrskilt anvÀndbart i JSX. Eftersom extra indenteringsnivÄ inte krÀvs har vi nu integrerat dem direkt i uttryckscontainern.
// Before
{
do {
// ...
}
}
// After
{do {
// ...
}}
Förhindra tillĂ€gg av mjuk radbrytning efter pilattribut med kommentarer (#3641) av @duailibeâ
Detta ÄtgÀrdar ett mindre problem dÀr en extra radbrytning kunde dyka upp i JSX-attribut.
// --print-width 13 (for demonstration)
// Before
<span
attr={
// comment
() =>
true
}
/>;
// After
<span
attr={
// comment
() =>
true
}
/>;
Radbryt inte JSX-element som attribut i () (#3640) av @duailibeâ
JSX-specifikationen har en dold funktion som tillÄter att skicka ett element som attribut till ett annat element. Prettier lade tidigare till parenteser runt, vilket orsakade ett syntaxfel. Detta Àr nu ÄtgÀrdat. Observera att medan vissa parsers hanterar denna funktion, tillÄter inga JSX-transformeringar det Ànnu. Den första som kommer att stödja det Àr Babel 7 som för nÀrvarande Àr i betaversion.
// Before
<Foo
content=(
<div>
<div />
</div>
)
/>
// After
<Foo
content=<div>
<div />
</div>
/>
SCSSâ
Skriv ut kommentarer inuti selektorer som de Ă€r (#3649) av @vjeuxâ
TyvÀrr stöder CSS-parsern vi anvÀnder för selektorer inte kommentarer. Det fanns dÀrför ett fall dÀr kommentarer inom selektorer kunde flyttas till rader med kommentarer. Detta har nu ÄtgÀrdats.
/* Before */
// Foo
.foo,
// Bar .bar {
display: block;
}
/* After */
// Foo
.foo,
// Bar
.bar {
display: block;
}
GraphQLâ
Uppdatera GraphQL-parser (#3605) av @vjeuxâ
GraphQL-specifikationen utvecklas och Prettier stöder nu tre nya funktioner:
Möjligheten att annotera typer med strÀngbeskrivningar
"""
Type description
"""
type Foo {
"some description"
someProperty: String!
"""
some really
long description
"""
someOtherProperty: [String!]!
}
Att utelÀmna {} nÀr det inte finns nÄgot innehÄll
extend enum Site @onEnum
Möjlighet att utöka alla typer
extend input InputType {
other: Float = 1.23e4
}
Markdownâ
ErsĂ€tt radbrytningar med hĂ„rda radbrytningar i multiparser (#3611) av @ikatyangâ
NÀr JavaScript var inbÀddat i ett Markdown-citatblock (>) försvann citattecknet. Detta har nu korrigerats.
<!-- before -->
> ````md
> <!-- prettier-ignore -->
> ```js
ugly ( code ) ;
```
> ````
<!-- after -->
> ````md
> <!-- prettier-ignore -->
> ```js
> ugly ( code ) ;
> ```
> ````
Anpassa citattecken i Markdown-lĂ€nktitlar till singleQuote-alternativet (#3481) av @j-f1â
Tidigare anvÀndes " för alla lÀnktitlar, nu respekteras singleQuote-alternativet. Vi anvÀnder parenteser () om titeln innehÄller bÄde ' och ".
<!-- --single-quote -->
<!-- Before -->
[ref]: https://prettier.io "Prettier"
[other-ref]: https://example.com "Shakespeare's \"Romeo and Juliet\" is a famous play"
<!-- after -->
[ref]: https://prettier.io 'Prettier'
[other-ref]: https://example.com (Shakespeare's "Romeo and Juliet" is a famous play)
Skriv ut imageReference utan alt-text i Markdown (#3643) av @duailibeâ
Vi har fixat ett specialfall med bildreferenser utan alt-text som fick Prettier att krascha.
<!-- before -->
TypeError: doc is null
<!-- after -->
![][logo]
[logo]: https://github.com/prettier/prettier-logo/blob/master/images/prettier-logo-light.png?raw=true
Respektera tabWidth för listindrag (#3694) av @ikatyangâ
Vi anvÀnde tidigare tvÄngsvis 2 mellanslag för listindrag, nu tar vi hÀnsyn till tadWidth.
<!-- --tab-width 4 -->
<!-- before -->
* one
* two
<!-- after -->
* one
* two
APIâ
LĂ€gg till options-fĂ€lt i getSupportInfo() (#3433) av @ikatyangâ
prettier.getSupportInfo().options kommer nu att innehÄlla en array med de alternativ som Prettier stöder.
Sök endast efter .editorconfig upp till VCS-katalogen (#3559) av @josephfrazierâ
Det kan vara förvirrande att diagnostisera problem dÀr Prettier formaterar kod olika mellan tvÄ personer med samma repository. Eftersom Prettier stöder .editorconfig-filer och vi tidigare sökte hela vÀgen upp till ~/.editorconfig, kunde detta oavsiktligt Àndra kodformateringen. Vi tittar nu endast upp till projektets rotkatalog.
CLIâ
Se till att all CLI-loggning gĂ„r via en logger (#3515) av @azzâ
Alternativet --loglevel respekterades inte i vissa fall, nu respekteras det för all CLI-loggning.
# Before
$ prettier --loglevel silent --write test.js
test.js 91ms
# After
$ prettier --loglevel silent --write test.js
Skriv ut filer som de Ă€r om de ignoreras (#3618) av @duailibeâ
Vi har förbÀttrat hur CLI:n hanterar ignorerade filer. Tidigare nÀr en fil ignorerades via .prettierignore, gav CLI:n ingen utdata, vilket pÄverkade redigerarintegrationer. Nu fungerar det sÄ hÀr:
-
Med
--write: LĂ€s eller skriv inte till den ignorerade filen. -
Utan
--write: LÀs den ignorerade filen och skriv ut den oförÀndrad.
Redigerarintegrationerâ
LĂ€gg till PostCSS-tillĂ€gg i getSupportInfo() (#3454) av @ardevelopâ
Vissa redigerarintegrationer anvÀnder Prettiers getSupportInfo-funktion för att dynamiskt stödja alla sprÄk. Detta lÀgger till stöd för *.pcss-filer.
LĂ€gg till "JSON med kommentarer" i getSupportInfo() (#3496) av @thorn0â
PÄ samma sÀtt kommer "JSON med kommentarer" nu att identifieras.
