Sebagai contoh:
import Component from '@/components/component'
Dalam kode yang saya lihat itu berperilaku seperti ../
naik satu tingkat di direktori relatif terhadap jalur file, tetapi saya ingin tahu lebih umum apa yang dilakukannya. Sayangnya saya tidak dapat menemukan dokumentasi online karena masalah pencarian simbol.
javascript
Laser
sumber
sumber
Jawaban:
Arti dan struktur pengenal modul bergantung pada pemuat modul atau pemaket modul . Modul loader bukan bagian dari spesifikasi ECMAScript. Dari perspektif bahasa JavaScript, pengenal modul sepenuhnya buram. Jadi itu sangat tergantung pada pemuat / bundler modul yang Anda gunakan.
Kemungkinan besar Anda memiliki sesuatu seperti babel-plugin-root-import di konfigurasi webpack / babel Anda.
Pada dasarnya ini berarti dari root proyek .. itu menghindari harus menulis hal-hal seperti itu
import Component from '../../../../components/component'
Edit: Salah satu alasannya ada karena
import Component from 'components/component'
tidak melakukan itu tetapi mencari dinode_modules
foldersumber
Tahu itu tua, tapi saya tidak yakin bagaimana itu didefinisikan, jadi cari, datang, gali sedikit lebih dalam dan akhirnya temukan ini di konfigurasi Webpack yang dihasilkan Vue-CLI ( Vue.js ) saya
resolve: { extensions: ['.js', '.vue', '.json'], alias: { '@': path.join(__dirname, '..', dir) } },
jadi ini adalah alias yang dalam hal ini menunjuk ke root dari direktori src yang dihasilkan vue-cli dari proyek tersebut
sumber
'@*': ['client/src/*']
di mana hanya bagian setelah@
diambil, sehingga saya dapat melakukanimport X from '@components/x
dan mencoba mengakses dengan benarclient/src/components/x
? TS + VSCode telah mengizinkannya dalam bentuk yang tepat ini di tsconfig.json, namun kesalahan webpack denganCan't resolve '@components/x' in 'client/src/'
. Ketika saya mengubahnya ke solusi Anda dan jalur impor keimport X from '@/components/x'
sana segera mulai berfungsi, jadi jalurnya benar.Untuk membuat jawaban Ben lebih komprehensif:
Pertama Anda perlu menambahkan
babel-plugin-root-import
di AndadevDependencies
dipackage.json
(Jika menggunakanyarn
:yarn add babel-plugin-root-import --dev
). Kemudian di.babelrc
tambahkan baris berikut ke dalamplugins
kunci:"plugins": [ [ "babel-plugin-root-import", { "rootPathPrefix": "@" } ] ]
Sekarang, Anda bisa menggunakan
@
. Sebagai contoh:Dari pada
import xx from '../../utils/somefile'
Kamu bisa
import xx from '@/utils/somefile'
sumber
Seperti yang dikatakan di atas, fitur ini tidak ada di JS secara default. Anda harus menggunakan plugin babel untuk menikmatinya. Dan tugasnya sederhana. Ini memungkinkan Anda untuk menentukan sumber root default untuk file JS Anda dan membantu Anda memetakan impor file Anda ke sana. Untuk memulai instal melalui npm:
npm install babel-plugin-root-import --save-dev
atau
yarn add babel-plugin-root-import --dev
Buat
.babelrc
di root aplikasi Anda dan konfigurasikan pengaturan ini sesuai selera Anda:{ "plugins": [ ["babel-plugin-root-import", { "rootPathSuffix": "the-preferred/root/of-all-your/js/files", "rootPathPrefix": "@" }] ] }
Dengan konfigurasi di atas, Anda cukup mengimpor dari sumber itu seperti:
import Myfile from "@/Myfile"
tanpa melakukan semua hal yang funky ini:
"/../../../Myfile"
Perhatikan bahwa Anda juga dapat mengubah simbol menjadi apa pun seperti
"~"
jika itu membuat perahu Anda mengapung.sumber
Saya menggunakan kode VS untuk membangun Aplikasi asli bereaksi.
Yang Anda butuhkan adalah:
buat jsconfig.json di bawah jalur root Aplikasi Anda
di jsconfig.json Anda, tambahkan kode berikut:
{"compilerOptions": {"baseUrl": ".", "target": "ES6", "module": "commonjs", "paths": {"@ / ": ["src / "], "@components / ": [" src / components / "]," @ core / ": [" src / core / "]}}," exclude ": [" node_modules "]}
pada dasarnya seperti "shortcut": ["abs_path"]
sumber
Ini adalah cara untuk memetakan ulang jalur modul, bukan bagian dari ES itu sendiri, Anda harus menggunakan fitur impor babel.
sumber