Що робить символ @ у імпорті JavaScript?


141

Наприклад:

import Component from '@/components/component'

У коді, на який я дивлюся, він поводиться так, ../що піднімається на один рівень в каталозі відносно шляху файлу, але я хотів би дізнатися більш загально, що він робить. На жаль, я не можу знайти будь-яку документацію в Інтернеті через проблему пошуку символів.


Відповіді:


158

Значення та структура ідентифікатора модуля залежить від завантажувача модуля або пакета модуля . Навантажувач модулів не входить до специфікації ECMAScript. З точки зору мови JavaScript, ідентифікатор модуля є абсолютно непрозорим. Тож насправді залежить від того, який завантажувач / постачальник модулів ви використовуєте.

Ви, швидше за все, у своєму webpack / babel config мають щось на зразок babel-plugin-root-import .

В основному це означає з кореня проекту .. Уникає необхідності писати такі речіimport Component from '../../../../components/component'

Редагувати. Одна з причин існування - це те, що import Component from 'components/component'він не робить цього, а замість цього шукає в node_modulesпапці


2
Дякую @ felix-kling за покращення моєї відповіді. Це набагато краще пояснення, ніж "не стандартна річ" :)
Бен

84

Знайте, що він старий, але я не був точно впевнений, як це визначено, тому подивився, пройшов, прокопав трохи глибше і, нарешті, знайшов це у моєму створеному Vue-CLI ( Vue.js ) конфігурації Webpack

resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
    '@': path.join(__dirname, '..', dir)
    }
},

тож це псевдонім, який у цьому випадку вказує на корінь src каталогу проекту, створеного vue-cli


Чи можна використовувати щось подібне? '@*': ['client/src/*']де береться лише частина після @ , щоб я міг це зробити, import X from '@components/xі вона правильно намагається отримати доступ client/src/components/x? TS + VSCode вже дозволяє в такому точному вигляді в tsconfig.json, однак помилки веб-пакета з Can't resolve '@components/x' in 'client/src/'. Коли я зміню його на ваше рішення і шляхи імпорту до import X from '@/components/x'нього негайно починають працювати, тому шляхи в іншому випадку є правильними.
Qwerty

@Qwerty Не маю ідеї, не знаю, що річ @ * не знала, що вона існує у VSCode, тому не можу допомогти
Може Рау

29

Щоб відповісти Бену більш вичерпним:

Перш за все , необхідно додати babel-plugin-root-importв вашому devDependenciesдюймі package.json(При використанні yarn: yarn add babel-plugin-root-import --dev). Потім у вашому ключі .babelrcдодайте наступні рядки plugins:

"plugins": [
[
  "babel-plugin-root-import",
  {
    "rootPathPrefix": "@"
  }
]
]

Тепер ви можете використовувати @. Наприклад:

Замість

import xx from '../../utils/somefile'

Ти можеш

import xx from '@/utils/somefile'


Я додав плагін до моєї розробки, але у мене немає .babelrc. Я навіть створив це в корені, але все одно не працює? У мене просто babel.config.js
Kick

8

Як було сказано вище, ця функція за замовчуванням відсутня в JS. Ви повинні використовувати плагін Babel, щоб насолоджуватися ним. А його робота проста. Це дозволяє вказати джерело кореня за замовчуванням для своїх файлів JS і допоможе вам зіставити імпорт файлу до нього. Для початку встановлення через npm:

npm install babel-plugin-root-import --save-dev

або

yarn add babel-plugin-root-import --dev

Створіть .babelrcу корені програми та налаштуйте ці налаштування на свій смак:

{
  "plugins": [
    ["babel-plugin-root-import", {
      "rootPathSuffix": "the-preferred/root/of-all-your/js/files",
      "rootPathPrefix": "@"
    }]
  ]
}

За допомогою конфігурації, наведеної вище, ви можете просто імпортувати з цього джерела такі:

import Myfile from "@/Myfile" 

не роблячи все це прикольні речі:

"/../../../Myfile"

Зауважте, що ви також можете змінити символ на що-небудь подібне, "~"якщо це пливе ваш човен.


0

Я використовую код VS для створення реактивних програм.

Що вам потрібно:

  1. створити jsconfig.json під кореневим шляхом у вашій програмі введіть тут опис зображення

  2. у свій jsconfig.json додайте такий код:

    {"compilerOptions": {"baseUrl": ".", "target": "ES6", "module": "commonjs", "paths": {"@ / ": ["src / "], "@components / ": [" src / компоненти / "]," @ core / ": [" src / core / "]}}," виключити ": [" node_modules "]}

в основному, як "ярлик": ["abs_path"]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.