การสร้างเว็บไซต์ที่ทำงานได้ดีในเบราว์เซอร์หลักๆ ทั้งหมดถือเป็นหลักการสำคัญของ ระบบนิเวศเว็บแบบเปิด แต่นั่นหมายความถึงงานเพิ่มเติมเพื่อให้มั่นใจว่า โค้ดที่คุณเขียนรองรับในแต่ละเบราว์เซอร์ที่คุณวางแผนจะกำหนดเป้าหมาย หากคุณ หากต้องการใช้ฟีเจอร์ภาษา JavaScript ใหม่ คุณจะต้องเปลี่ยนรูปแบบ เข้ากับรูปแบบที่เข้ากันได้แบบย้อนหลังสำหรับเบราว์เซอร์ที่ยังไม่รองรับ ให้พวกเขา
Babel เป็นเครื่องมือที่ใช้กันอย่างแพร่หลายที่สุดในการคอมไพล์โค้ด
ที่มีไวยากรณ์ใหม่เป็นโค้ดซึ่งเบราว์เซอร์และสภาพแวดล้อมต่างๆ
(เช่น โหนด) ที่เข้าใจได้ คู่มือนี้จะถือว่าคุณกำลังใช้ Babel ดังนั้น คุณจึง
ต้องปฏิบัติตามวิธีการตั้งค่าเพื่อ
ให้รวมข้อมูลดังกล่าวลงในแอปพลิเคชันด้วย หากยังไม่ได้ทำ เลือกwebpack
ใน Build Systems
หากคุณใช้ Webpack เป็น Bundler ของโมดูลในแอป
หากต้องการใช้ Babel เพื่อถ่ายโอนเฉพาะ สิ่งที่จำเป็นสำหรับผู้ใช้ของคุณ คุณ ต้อง:
- ระบุเบราว์เซอร์ที่คุณต้องการกำหนดเป้าหมาย
- ใช้
@babel/preset-env
กับเป้าหมายเบราว์เซอร์ที่เหมาะสม - ใช้
<script type="module">
เพื่อหยุดส่งรหัสที่แปลงแล้วไปยังเบราว์เซอร์ที่ไม่ต้องการ
ระบุเบราว์เซอร์ที่คุณต้องการกำหนดเป้าหมาย
ก่อนที่คุณจะเริ่มปรับเปลี่ยนวิธีแปลงโค้ดในแอปพลิเคชันของคุณ คุณ ต้องระบุว่าเบราว์เซอร์ใดที่เข้าถึงแอปพลิเคชันของคุณ วิเคราะห์เบราว์เซอร์ ผู้ใช้ของคุณกำลังใช้อยู่ รวมถึงรายการที่คุณวางแผนจะกำหนดเป้าหมายในการสร้าง ข้อมูลประกอบการตัดสินใจ
ใช้ @babel/preset-env
การแปลงโค้ดมักจะทำให้ไฟล์มีขนาดใหญ่กว่า รูปแบบเดิม ด้วยการลดปริมาณ วิดีโอรวมคลิปที่คุณทำ ลดขนาดของแพ็กเกจเพื่อปรับปรุงประสิทธิภาพของหน้าเว็บได้
แทนที่จะรวมปลั๊กอินบางอย่างเพื่อเลือกคอมไพล์บางภาษา คุณลักษณะที่คุณกำลังใช้งาน Babel มีค่าที่กำหนดล่วงหน้าจำนวนหนึ่งที่รวมปลั๊กอินต่างๆ ใช้ @babel/preset-env เพื่อรวมเฉพาะการแปลงและโพลีฟิลล์ที่จำเป็นสำหรับเบราว์เซอร์ที่คุณวางแผนไว้ การกำหนดเป้าหมาย
รวม @babel/preset-env
ภายในอาร์เรย์ presets
ใน Babel
ไฟล์การกำหนดค่า .babelrc
:
{
"presets": [
[
"@babel/preset-env",
{
"targets": ">0.25%"
}
]
]
}
ใช้ช่อง targets
เพื่อระบุเวอร์ชันของเบราว์เซอร์ที่ต้องการรวมไว้
โดยเพิ่มข้อความค้นหาที่เหมาะสมลงในฟิลด์ browsers
@babel/preset-env
ผสานรวมกับรายการเบราว์เซอร์ ซึ่งเป็นการกำหนดค่าโอเพนซอร์สที่ใช้ร่วมกันระหว่าง
เครื่องมือสำหรับการกำหนดเป้าหมายเบราว์เซอร์ รายการคำค้นหาทั้งหมดที่เข้ากันได้จะอยู่ใน
เอกสารประกอบเกี่ยวกับรายการเบราว์เซอร์
อีกตัวเลือกหนึ่งคือการใช้ไฟล์ .browserslistrc
เพื่อแสดงรายการสภาพแวดล้อม
ที่ต้องการกำหนดเป้าหมาย
ค่า ">0.25%"
จะบอกให้ Babel รวมเฉพาะการเปลี่ยนรูปแบบ
จำเป็นต้องรองรับเบราว์เซอร์คิดเป็นมากกว่า 0.25% ของ
การดำเนินการนี้ช่วยให้มั่นใจได้ว่าไฟล์ของคุณไม่มีการถ่ายโอนโดยไม่จำเป็น
สำหรับเบราว์เซอร์ที่มีผู้ใช้งานจำนวนน้อยมาก
ในกรณีส่วนใหญ่ วิธีนี้เป็นวิธีที่ดีกว่าการใช้ การกำหนดค่า:
"targets": "last 2 versions"
ค่า "last 2 versions"
จะแปลงโค้ดสำหรับฟิลด์
สองเวอร์ชันล่าสุดของเบราว์เซอร์ทุกเบราว์เซอร์
ซึ่งหมายความว่ามีการสนับสนุนสำหรับเบราว์เซอร์ที่ปิดให้บริการแล้ว เช่น Internet Explorer
ซึ่งอาจเพิ่มขนาดของแพ็กเกจโดยไม่จำเป็นหากคุณคาดว่า
เบราว์เซอร์ที่จะใช้เข้าถึงแอปพลิเคชันของคุณ
สุดท้าย คุณควรเลือกชุดค่าผสมของข้อความค้นหาที่เหมาะสม กำหนดเป้าหมายเบราว์เซอร์ที่ตรงกับความต้องการของคุณ
เปิดใช้การแก้ไขข้อบกพร่องสมัยใหม่
@babel/preset-env
จัดกลุ่มฟีเจอร์ไวยากรณ์ JavaScript หลายรายการเป็นคอลเล็กชันและเปิด/ปิดใช้
ตามเบราว์เซอร์เป้าหมายที่ระบุ แม้ว่าวิธีนี้จะได้ผลดี แต่คอลเล็กชันของ
ฟีเจอร์ไวยากรณ์จะเปลี่ยนรูปแบบเมื่อเบราว์เซอร์เป้าหมายมีข้อบกพร่องที่มีเพียงฟีเจอร์เดียว
ซึ่งมักจะทำให้มีการเปลี่ยนรูปแบบของโค้ดเกินกว่าที่จำเป็น
เดิมทีการพัฒนาเป็นค่าที่กำหนดล่วงหน้าแยกต่างหาก
ตัวเลือกแก้ไขข้อบกพร่องใน @babel/preset-env
แก้ไขปัญหานี้โดยการแปลงไวยากรณ์สมัยใหม่ที่เสียหายในบางเบราว์เซอร์ให้ใกล้เคียงที่สุด
ไวยากรณ์ที่เทียบเท่าซึ่งไม่เสียหายในเบราว์เซอร์เหล่านั้น ผลที่ได้คือโค้ดสมัยใหม่เกือบเหมือนกัน
ด้วยการปรับเปลี่ยนไวยากรณ์เล็กน้อย เพื่อรับประกันความสามารถในการใช้งานร่วมกันในเบราว์เซอร์เป้าหมายทั้งหมด เพื่อใช้งาน
โปรดตรวจสอบว่าคุณได้ติดตั้ง @babel/preset-env
เวอร์ชัน 7.10 ขึ้นไปแล้ว จากนั้นตั้งค่า
พร็อพเพอร์ตี้ bugfixes
ไปยัง true
:
{
"presets": [
[
"@babel/preset-env",
{
"bugfixes": true
}
]
]
}
ใน Babel 8 ตัวเลือก bugfixes
จะเปิดใช้โดยค่าเริ่มต้น
ใช้ <script type="module">
โมดูล JavaScript หรือโมดูล ES เป็นฟีเจอร์ใหม่ที่ได้รับการสนับสนุนใน
เบราว์เซอร์หลักๆ ทั้งหมด คุณสามารถใช้โมดูล
เพื่อสร้างสคริปต์ที่สามารถนำเข้าและส่งออกจากโมดูลอื่นๆ แต่คุณสามารถ
ให้ใช้การกำหนดค่าดังกล่าวกับ @babel/preset-env
เพื่อกำหนดเป้าหมายเฉพาะเบราว์เซอร์ที่รองรับ
ให้พวกเขา
แทนที่จะค้นหาเวอร์ชันของเบราว์เซอร์หรือส่วนแบ่งการตลาดที่เจาะจง ให้พิจารณา
ระบุ "esmodules" : true
ภายในฟิลด์ targets
ของไฟล์ .babelrc
{
"presets":[
[
"@babel/preset-env",
{
"targets":{
"esmodules": true
}
}
]
]
}
ระบบรองรับฟีเจอร์ใหม่ๆ มากมายของ ECMAScript ที่คอมไพล์ด้วย Babel อยู่แล้ว ในสภาพแวดล้อมที่รองรับโมดูล JavaScript ดังนั้น ในการดำเนินการนี้ คุณ ลดความซับซ้อนของขั้นตอนเพื่อตรวจสอบว่ามีการใช้เฉพาะโค้ดที่เปลี่ยนรูปแบบแล้ว สำหรับเบราว์เซอร์ที่ต้องการใช้จริงๆ
เบราว์เซอร์ที่รองรับโมดูลจะไม่สนใจสคริปต์ที่มีแอตทริบิวต์ nomodule
ในทางกลับกัน เบราว์เซอร์ที่ไม่สนับสนุนโมดูลจะไม่สนใจองค์ประกอบของสคริปต์ที่มี
type="module"
ซึ่งหมายความว่าคุณสามารถรวมโมดูล และ วิดีโอสำรองที่คอมไพล์ แล้วได้
ตามหลักการแล้ว สคริปต์สองเวอร์ชันของแอปพลิเคชันจะรวมไว้ดังนี้
<script type="module" src="main.mjs"></script>
<script nomodule src="compiled.js" defer></script>
เบราว์เซอร์ที่รองรับโมดูลจะดึงข้อมูลและเรียกใช้ main.mjs
และละเว้น compiled.js
เบราว์เซอร์ที่ไม่รองรับโมดูลจะทำหน้าที่ตรงกันข้าม
หากใช้ Webpack คุณก็สามารถตั้งเป้าหมายที่แตกต่างกันในการกำหนดค่าสำหรับ เวอร์ชันแยกของแอปพลิเคชันของคุณ
- เวอร์ชันสำหรับเบราว์เซอร์ที่รองรับโมดูลเท่านั้น
- เวอร์ชันที่มีสคริปต์ที่คอมไพล์ซึ่งทำงานได้ในเบราว์เซอร์เดิมทุกชนิด ไฟล์มีขนาดไฟล์ใหญ่กว่า เนื่องจากการเปลี่ยนรูปแบบต้องรองรับเบราว์เซอร์ที่หลากหลายมากขึ้น
ขอขอบคุณ Connor Clark และ Jason Miller สำหรับรีวิว