singleQuote — ความชอบที่ Prettier จะข้ามให้เองเมื่อการ escape จะแย่ลง
ตัวเลือก Single Quote ของ Prettier
singleQuote บอกว่าคุณชอบใช้อัญประกาศตัวไหนกับสตริงใน JavaScript มันเป็นความชอบมากกว่ากฎ เพราะ Prettier จะเลือกอัญประกาศที่ทำให้ต้องใส่ escape น้อยกว่าเสมอ สตริงที่มีเครื่องหมาย apostrophe อยู่ข้างในจึงยังคงใช้อัญประกาศคู่ แม้จะตั้ง singleQuote: true ไว้ก็ตาม
Use single quotes instead of double quotes.- ค่าเริ่มต้น
false- ชนิด
boolean- แฟล็ก CLI
--single-quote
ออปชันนี้ทำอะไร
ค่าเริ่มต้นคือ false หมายถึงอัญประกาศคู่ ตั้งเป็น true แล้ว Prettier จะชอบอัญประกาศเดี่ยว แต่ใช้เป็นเพียงตัวตัดสินเมื่อเสมอกันเท่านั้น
กฎที่ Prettier ใช้จริงคือการทำให้ escape น้อยที่สุด อัญประกาศตัวไหนต้องใช้แบ็กสแลชน้อยกว่าจะชนะ และความชอบของคุณจะมีผลก็ต่อเมื่อจำนวนเท่ากัน นี่คือเหตุผลที่โค้ดเบสซึ่งตั้ง singleQuote: true ยังมีสตริงที่ใช้อัญประกาศคู่อยู่ และนั่นถูกต้องแล้ว ไม่ใช่บั๊ก
const plain = 'ไม่มีอัญประกาศข้างใน';
const apostrophe = "it's got one";singleQuote: trueถ้าจะคงอัญประกาศเดี่ยวไว้ในบรรทัดที่สอง จะต้อง escape เครื่องหมาย apostrophe ด้วยแบ็กสแลช ซึ่งยาวขึ้นหนึ่งตัวอักษรและอ่านยากขึ้นอย่างเห็นได้ชัด Prettier จึงปฏิเสธ
สิ่งที่มันไม่แตะ
- ไฟล์ JSON และรูปแบบที่คล้าย JSON รูปแบบนี้อนุญาตเฉพาะอัญประกาศคู่ ออปชันจึงถูกเพิกเฉยที่นั่น รวมถึงคีย์
prettierในpackage.jsonด้วย - แอตทริบิวต์ JSX มีออปชันของตัวเองชื่อ
jsxSingleQuoteเพราะธรรมเนียมที่ใช้กันในมาร์กอัป JSX ต่างจากใน JavaScript รอบข้าง - เทมเพลตลิเทอรัล สตริงแบ็กทิกจะไม่ถูกเขียนใหม่เป็นอัญประกาศ เพราะอาจเปลี่ยนพฤติกรรม
- คีย์ของอ็อบเจกต์ การตัดสินว่าคีย์จะถูกใส่อัญประกาศหรือไม่คือ
quotePropsออปชันนี้เลือกแค่ว่าจะใช้อักขระตัวไหนเมื่อจะใส่อัญประกาศแล้ว
ทำไมค่าเริ่มต้นถึงเป็นอัญประกาศคู่
อัญประกาศคู่เป็นค่าเริ่มต้นส่วนใหญ่เพราะปลอดภัยกว่าในเนื้อหาภาษาอังกฤษ เครื่องหมาย apostrophe พบได้ทั่วไปในร้อยแก้ว และสตริงที่ผู้ใช้เห็นก็มักเป็นร้อยแก้วเสียมากกว่า อัญประกาศคู่จึงลดการ escape ทั่วทั้งโค้ดเบสโดยไม่ต้องมีใครมาคิด
มันยังตรงกับ JSON ด้วย ซึ่งแปลว่าสตริงที่คัดลอกไปมาระหว่างไฟล์ JavaScript กับไฟล์ JSON ไม่ต้องปรับอะไร เมื่อพิจารณาว่ามีการตั้งค่าจำนวนมากที่ย้ายไปมาระหว่างสองรูปแบบนี้ ความสะดวกเล็ก ๆ นั้นก็มีค่าจริง
ข้อโต้แย้งฝั่งตรงข้ามเป็นเรื่องความเคยชินมากกว่าตรรกะ ระบบนิเวศ JavaScript ส่วนใหญ่เขียนด้วยอัญประกาศเดี่ยว การทำตามจึงทำให้โค้ดของคุณดูปกติในสายตาผู้ร่วมพัฒนาที่มาจากที่อื่น ไม่มีฝ่ายไหนผิด ซึ่งก็คือเหตุผลที่มันเป็นออปชัน
ข้อแลกเปลี่ยนและข้อตกลงของทีม
นี่คือออปชันที่เปลี่ยนได้ถูกที่สุดใน Prettier และเป็นออปชันที่คุ้มค่าแก่การถกเถียงน้อยที่สุด มันไม่มีผลต่อความถูกต้อง ไม่มีผลต่อประสิทธิภาพ และไม่มีผลต่อเครื่องมืออื่น เลือกสักค่าในสัปดาห์แรกของโปรเจกต์แล้วอย่ากลับมารื้ออีก
- ถ้าโปรเจกต์เน้น TypeScript และค่อนข้างใหม่
singleQuote: trueจะตรงกับสิ่งที่ผู้ร่วมพัฒนาส่วนใหญ่เคยเห็นมา - ถ้าโปรเจกต์มีข้อความภาษาอังกฤษที่ผู้ใช้เห็นเยอะ ค่าเริ่มต้นจะช่วยประหยัดการ escape
- ไม่ว่าจะเลือกอะไร ให้คาดหวังว่าจะมีข้อยกเว้นในผลลัพธ์ ผู้รีวิวที่ทักสตริงอัญประกาศคู่ในโค้ดเบสอัญประกาศเดี่ยวคือคนที่เข้าใจออปชันผิด ไม่ใช่คนที่เจอข้อบกพร่อง
ESLint และเอดิเตอร์
กฎ quotes ของ ESLint ทับซ้อนกับออปชันนี้โดยตรงและจะขัดกัน โดยเห็นชัดที่สุดในกรณีการลด escape ข้างต้น eslint-config-prettier จะปิด quotes พร้อมกับกฎเชิงรูปแบบที่เหลือ ให้วางไว้ท้ายสุดในคอนฟิก
{
"singleQuote": true,
"jsxSingleQuote": false
}คู่นี้ คืออัญประกาศเดี่ยวใน JavaScript และอัญประกาศคู่ใน JSX เป็นการตั้งค่าที่พบบ่อยที่สุดในโค้ดเบส React เพราะแอตทริบิวต์ JSX อ่านเหมือน HTML และแอตทริบิวต์ HTML ตามธรรมเนียมใช้อัญประกาศคู่
ข้อผิดพลาดที่พบบ่อย
- รายงานพฤติกรรมลด escape ว่าเป็นบั๊ก มันคือกฎที่ตั้งใจและมีเอกสารกำกับ
- คาดหวังว่ามันจะเปลี่ยนแอตทริบิวต์ JSX นั่นคือ
jsxSingleQuote - คาดหวังว่ามันจะเปลี่ยน JSON รูปแบบนั้นห้ามใช้อัญประกาศเดี่ยว
- เปิดกฎ
quotesของ ESLint ทิ้งไว้ ซึ่งจะทำให้เกิด lint error ที่ Prettier จะสร้างขึ้นใหม่ทันทีในการจัดรูปแบบครั้งถัดไป
ใช้ใน .prettierrc
ใส่ singleQuote ลงในไฟล์ตั้งค่า Prettier ของคุณ:
{
"singleQuote": false
}ลองใช้ในตัวสร้างตัวอย่างจริง
โค้ดเดียวกันที่จัดรูปแบบด้วยแต่ละค่าของ singleQuote
singleQuote: true
const user = {
name: 'Ada',
'user-id': 7,
roles: ['admin', 'editor'],
active: true,
};
const greet = (name) => `Hello ${name}`;
const label = user.active
? 'active member of the team'
: 'inactive member of the team';
export function summarize(items) {
return items
.filter((i) => i.active)
.map((i) => i.name)
.join(', ');
}singleQuote: false
const user = {
name: "Ada",
"user-id": 7,
roles: ["admin", "editor"],
active: true,
};
const greet = (name) => `Hello ${name}`;
const label = user.active
? "active member of the team"
: "inactive member of the team";
export function summarize(items) {
return items
.filter((i) => i.active)
.map((i) => i.name)
.join(", ");
}คำถามที่พบบ่อย
- ทำไมสตริงนี้ยังเป็นอัญประกาศคู่ทั้งที่เปิด singleQuote แล้ว
- เพราะมันมี apostrophe หรืออัญประกาศเดี่ยวอยู่ข้างใน Prettier เลือกอัญประกาศที่ต้อง escape น้อยกว่า และจะย้อนกลับมาใช้ความชอบของคุณเมื่อเสมอกันเท่านั้น
- singleQuote มีผลกับ JSX ไหม
- ไม่ การใส่อัญประกาศให้แอตทริบิวต์ JSX ควบคุมด้วย
jsxSingleQuoteซึ่งมีค่าเริ่มต้นเป็นfalseเพื่อให้ JSX คงอัญประกาศคู่ตามธรรมเนียมของ HTML - มีผลกับ JSON หรือ package.json ไหม
- ไม่ JSON อนุญาตเฉพาะอัญประกาศคู่ Prettier จึงปล่อยไว้ตามเดิมไม่ว่าจะตั้งค่าอย่างไร
ตัวเลือก Common อื่น ๆ
สร้างจาก Prettier 3.9.6