Mengapa Magento 2 menggunakan RequireJS `map` alih-alih` path`

17

Dalam implementasi Magento 2 yang diperlukan, banyak modul inti menggunakan konfigurasi seperti ini

map: {
    '*': {
        editTrigger:   'mage/edit-trigger',
        addClass:      'Magento_Translation/add-class'
    }
}

Di RequireJS, maparahan konfigurasi memungkinkan pengembang untuk memberi tahu RequireJS

Saat Anda memuat modul X, dan menggunakan modul Y, ganti modul Y dengan modul Z - tetapi hanya untuk Modul X

Atau, dalam kode

map: {
    'modulex':{
        'moduley':'modulez'
    }
}

The mapfitur pada dasarnya memungkinkan Anda untuk swap keluar definisi modul melalui konfigurasi - di Magento berbicara, itu adalah fitur modul rewrite untuk javascript.

Apa yang tidak jelas bagi saya adalah penggunaan Magento *sebagai kunci untuk mapproperti.

map: {
    '*': {
        editTrigger:   'mage/edit-trigger',
        addClass:      'Magento_Translation/add-class'
    }
}

Pada *dasarnya mengatakan * lakukan pemetaan ini untuk semua modul, dan kasus penggunaan yang dimaksudkan adalah menyediakan modul dasar alias yang dapat diubah untuk modul yang lebih spesifik.

Namun, Magento tampaknya menggunakannya sebagai pengganti properti RequireJSpaths . yaitu sepertinya Magento bisa mencapai hal yang sama dengan yang berikut ini

paths: {
    'editTrigger': 'mage/edit-trigger',
    'addClass':    'Magento_Translation/add-class',
}

dan kemudian secara selektif melakukan pemetaan spesifik bila diperlukan.

Adakah yang tahu mengapa Magento memilih map:*sebagai metode untuk path alias? yaitu - adalah pemahaman saya tentang perbedaan antara mapdan pathtidak lengkap - atau satu ini dari mereka "Enam dari satu, setengah lusin yang lain" hal. Atau ada beberapa perilaku tambahan yang didapatkan Magento dengan melakukannya dengan cara ini.

Tidak meminta untuk memecahkan masalah tertentu, meminta untuk mengklarifikasi kesalahpahaman apa pun tentang implementasi RequireJS dan Magento sebelum saya mulai menulis banyak tentang hal ini :)

Alan Storm
sumber

Jawaban:

22

Setelah meneliti ini sedikit lebih, saya telah menemukan satu perbedaan utama antara mapdan path. Saya tidak yakin apakah tim inti Magento sengaja menggunakan ini, tetapi per Stack Overflow ini menjawab ketika Anda mendefinisikan mapkonfigurasi, Anda sebenarnya mendefinisikan awalan untuk pemetaan. yaitu Tidak hanya akan ini

map: {
    '*': {
        editTrigger:   'mage/edit-trigger',
    }
}

pastikan memuat editTriggermodul benar-benar memuat mage/edit-triggermodul, tetapi juga yang editTrigger/fooakan memuat mage/edit-trigger/foomodul.

The pathsdirektif tidak pemetaan awalan. Ini pemetaan satu-ke-satu yang sederhana.

Alan Storm
sumber
1
Juga, jika saya mengingat kembali dengan benar, path: {foo: 'bar'}akan memblokir Anda dari meminta barsecara eksplisit dan hanya akan memungkinkan untuk mengaksesnya dengan fooalias.
mms27