Apa yang dilakukan simbol @ dalam impor javascript?

154

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.

Laser
sumber
Kemungkinan duplikat Penggunaan simbol @ dalam nama modul Node
Bergi

Jawaban:

172

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 ituimport Component from '../../../../components/component'

Edit: Salah satu alasannya ada karena import Component from 'components/component'tidak melakukan itu tetapi mencari di node_modulesfolder

Ben
sumber
3
Terima kasih @ felix-kling untuk meningkatkan jawaban saya. Ini adalah penjelasan yang jauh lebih baik daripada "bukan hal yang standar" :)
Ben
93

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

Can Rau
sumber
1
Apakah mungkin menggunakan sesuatu seperti ini? '@*': ['client/src/*']di mana hanya bagian setelah @ diambil, sehingga saya dapat melakukan import X from '@components/xdan mencoba mengakses dengan benar client/src/components/x? TS + VSCode telah mengizinkannya dalam bentuk yang tepat ini di tsconfig.json, namun kesalahan webpack dengan Can't resolve '@components/x' in 'client/src/'. Ketika saya mengubahnya ke solusi Anda dan jalur impor ke import X from '@/components/x'sana segera mulai berfungsi, jadi jalurnya benar.
Qwerty
@Qwerty Tidak tahu, tidak tahu @ * hal tidak tahu itu ada di VSCode, jadi tidak bisa membantu
Can Rau
31

Untuk membuat jawaban Ben lebih komprehensif:

Pertama Anda perlu menambahkan babel-plugin-root-importdi Anda devDependenciesdi package.json(Jika menggunakan yarn: yarn add babel-plugin-root-import --dev). Kemudian di .babelrctambahkan baris berikut ke dalam pluginskunci:

"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'

Ali MasudianPour
sumber
Saya menambahkan plugin ke devdependency saya tetapi saya tidak punya .babelrc. Saya bahkan membuatnya di root, tetapi masih tidak berhasil? Saya baru saja memiliki babel.config.js
Kick Buttowski
11

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 .babelrcdi 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.

Wale
sumber
1

Saya menggunakan kode VS untuk membangun Aplikasi asli bereaksi.

Yang Anda butuhkan adalah:

  1. buat jsconfig.json di bawah jalur root Aplikasi Anda masukkan deskripsi gambar di sini

  2. 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"]

Daniel Hua
sumber
0

Ini adalah cara untuk memetakan ulang jalur modul, bukan bagian dari ES itu sendiri, Anda harus menggunakan fitur impor babel.

mabreu0
sumber