ตั้งแต่ปี 2016 ได้ผ่านไปมากมายในโลก JavaScript ดังนั้นฉันเชื่อว่าถึงเวลาที่จะนำเสนอข้อมูลล่าสุดในหัวข้อนี้ ปัจจุบันการนำเข้าแบบไดนามิกเป็นจริงทั้งบนโหนดและบนเบราว์เซอร์ (โดยปกติถ้าคุณไม่สนใจ IE หรือด้วย@ babel / plugin-syntax-dynamic-importหากคุณสนใจ)
ดังนั้นให้พิจารณาโมดูลตัวอย่างที่something.js
มีการส่งออกที่มีชื่อสองรายการและการส่งออกเริ่มต้นหนึ่งรายการ:
export const hi = (name) => console.log(`Hi, ${name}!`)
export const bye = (name) => console.log(`Bye, ${name}!`)
export default () => console.log('Hello World!')
เราสามารถใช้import()
ไวยากรณ์เพื่อโหลดตามเงื่อนไขได้อย่างง่ายดายและหมดจด:
if (somethingIsTrue) {
import('./something.js').then((module) => {
module.hi('Erick')
module.bye('Erick')
module.default()
})
}
แต่เนื่องจากผลตอบแทนเป็นPromise
ที่async
/ await
น้ำตาลประโยคยังเป็นไปได้:
async imAsyncFunction () {
if (somethingIsTrue) {
const module = await import('./something.js')
module.hi('Erick')
}
}
ลองคิดถึงความเป็นไปได้พร้อมกับObject Destructuring Assignment ! ตัวอย่างเช่นเราสามารถใส่การส่งออกที่มีชื่อเพียงรายการเดียวในหน่วยความจำเพื่อใช้ในภายหลังได้อย่างง่ายดาย:
const { bye } = await import('./something.js')
bye('Erick')
หรืออาจคว้าหนึ่งในการส่งออกที่มีชื่อและเปลี่ยนชื่อเป็นสิ่งอื่นที่เราต้องการ:
const { hi: hello } = await import('./something.js')
hello('Erick')
หรือแม้กระทั่งเปลี่ยนชื่อฟังก์ชันที่ส่งออกเริ่มต้นเป็นสิ่งที่เหมาะสมกว่า:
const { default: helloWorld } = await import('./something.js')
helloWorld()
หมายเหตุสุดท้าย (แต่ไม่ท้ายสุด): import()
อาจดูเหมือนการเรียกใช้ฟังก์ชัน แต่ไม่ใช่ไฟล์Function
. เป็นไวยากรณ์พิเศษที่ใช้วงเล็บ (คล้ายกับสิ่งที่เกิดขึ้นกับsuper()
) ดังนั้นจึงเป็นไปไม่ได้ที่จะกำหนดimport
ให้กับตัวแปรหรือการใช้สิ่งที่ของFunction
ต้นแบบเช่น/call
apply
super
โทรเฉพาะ