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.


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


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


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'


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.


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


0

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.