Import ES6 za pomocą at ('@') Zaloguj się w projekcie vue.js za pomocą pakietu Webpack

273

Zaczynam nowy projekt vue.js, więc użyłem narzędzia vue-cli, aby stworzyć nowy projekt pakietu WWW (tj vue init webpack.).

Przechodząc przez wygenerowane pliki, zauważyłem następujący import do src/router/index.jspliku:

import Vue from 'vue'
import Router from 'vue-router'
import Hello from '@/components/Hello' // <- this one is what my qusestion is about

Vue.use(Router)

export default new Router({
    routes: [
        {
            path: '/',
            name: 'Hello',
            component: Hello
        }
    ]
})

Nie widziałem wcześniej znaku at ( @) na ścieżce. Podejrzewam, że pozwala na względne ścieżki (może?), Ale chciałem mieć pewność, że rozumiem, co naprawdę robi.

Próbowałem szukać w Internecie, ale nie byłem w stanie znaleźć wyjaśnienia (problem, ponieważ wyszukiwanie „przy znaku” lub użycie dosłownego znaku @nie pomaga jako kryterium wyszukiwania).

Co robi na @tej ścieżce (link do dokumentacji byłby fantastyczny) i czy jest to rzecz es6? Rzeczy z paczki internetowej? Vue-loader?

AKTUALIZACJA

Dziękuję Felixowi Klingowi za wskazanie mi kolejnego duplikatu pytania / odpowiedzi na temat przepełnienia stosu dotyczącego tego samego pytania.

Chociaż komentarz do drugiego postu przepełnienia stosu nie jest dokładną odpowiedzią na to pytanie (w moim przypadku nie była to wtyczka babel), wskazał mi właściwy kierunek, aby znaleźć to, co to było.

W rusztowaniu, które przygotowuje dla ciebie vue-cli, część podstawowej konfiguracji webpacka tworzy alias dla plików .vue:

Alias ​​lokalizacji w projekcie

Ma to sens zarówno dlatego, że daje względną ścieżkę z pliku src, jak i usuwa wymaganie .vuena końcu ścieżki importu (co zwykle jest potrzebne).

Dzięki za pomoc!

Chris Schmitz
źródło
3
Zobacz mój komentarz .
Felix Kling
1
@FelixKling To nie jest dokładny duplikat, ponieważ nie odpowiada na całe pytanie, czy to jest kwestia es6? Rzeczy z paczki internetowej? Vue-loader?
Estus Flask
Tak, myślę, że pytanie było podobne, ale nie duplikat. Niezależnie od tego, zorientowałem się, skąd pochodzi, i zaktualizowałem pytanie z wyjaśnieniem, ponieważ nie mogę dodać go jako odpowiedzi.
Chris Schmitz,
@estus: odpowiedź wyjaśnia, że ​​nie jest to część ES6, ale kwestia konfiguracji pakietu internetowego, nie sądzisz? I dokładnie tak jest w tym przypadku, tyle że natura konfiguracji jest nieco inna.
Felix Kling
@ FelixKling Wierzę, kiedy estus wskazał, że wciąż jest pytanie, co to za rzecz, że jeszcze nie dodałem aktualizacji (widziałem, jak pojawił się jego komentarz podczas pisania aktualizacji). Wszystko gotowe i jest szczegółowe wyjaśnienie mojej konkretnej instancji, więc mogę zacząć. Dzięki chłopaki.
Chris Schmitz,

Odpowiedzi:

243

Odbywa się to za pomocą resolve.aliasopcji konfiguracji pakietu Webpack i nie jest specyficzne dla Vue.

W Vue WebPACK szablonu , WebPACK jest skonfigurowany tak, aby zastąpić @/ze srcścieżki :

  const path = require('path');

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

Alias ​​jest używany jako:

import '@/<path inside src folder>';
Estus Flask
źródło
171
JavaScript po prostu nie jest już JavaScript. Babel / webpack daje nam ten język Frankensteina i jakoś nowi programiści powinni wiedzieć, gdzie kończy się specyfikacja ECMAScript, a zaczynają się wtyczki / transformacje użytkownika. To naprawdę smutne, imo.
Dziękuję
3
@ anomik Użytkownik może wprowadzić takie sztuczki do konfiguracji, czy nie. Dla Vue nie jest to wielka sprawa, ponieważ i tak opiera się na swoim niestandardowym formacie pliku .vue.
Estus Flask 13.03.17
15
Osobiście uważam, że możliwość dodania elastyczności, jeśli chcesz, jest dobrą rzeczą. Widzę to mniej jako frankenstein, a bardziej jak voltron; możesz robić rzeczy jak lew lub łączyć różne lwy, aby mieć większego robota. Tak, czasami masz takie pytania, ale to nie tak, że nie można znaleźć odpowiedzi. Naprawdę, możesz wziąć widok Frankensteina lub woltrona z dowolnym projektem dowolnej wielkości, to po prostu „używanie i rozumienie zależności”.
Chris Schmitz
1
@ChrisSchmitz To zależy od kontekstu i perspektywy. Wykonanie czegoś takiego ograniczy projektowi użycie Webpacka. Może nie być dobrą rzeczą, jeśli projekt zamierza używać natywnych modułów ES6, kiedy się pojawią, lub jest Węzłem, w którym można użyć CommonJS dla modułów. Z drugiej strony długie ścieżki względne mogą być trudniejsze w utrzymaniu i refaktoryzacji.
Estus Flask 13.03.17
3
Korzystając z vue-cliv3 +, powinieneś użyć ~@do odniesienia srcfolderu. Np .:$font-path: '~@/assets/fonts/';
Consta Gorgan
9

Pamiętaj również, że możesz również tworzyć zmienne w tsconfig:

"paths": {
  "@components": ["src/components"],
  "@scss": ["src/styles/scss"],
  "@img": ["src/assests/images"],
  "@": ["src"],
}

Można to wykorzystać do celów konwencji nazewnictwa:

import { componentHeader } from '@components/header';
Tyler Canton
źródło
Ale ten rodzaj aliasu pozostanie pusty w źródłowym JS, a następnie w czasie wykonywania będziesz musiał interweniować wrapper, aby alias działał. Może istnieje sposób za pośrednictwem babel, aby ta składnia TS została przekonwertowana podczas kompilacji? Z maszynopisu tscnie ma i dlatego będziesz potrzebować czegoś takiego jak module-aliaslub tsconfig-paths.
Ken
3

Przychodzę z następującą kombinacją

import HelloWorld from '@/components/HelloWorld'
=>
import HelloWorld from 'src/components/HelloWorld'

IDE przestanie ostrzegać o URI, ale powoduje to nieprawidłowe URI podczas kompilacji w „build \ webpack.base.conf.js”

resolve: {
  extensions: ['.js', '.vue', '.json'],
  alias: {
    'src': resolve('src'),
  }
},

Bingoo!

Luân Trương
źródło
1

resolve ( 'src') nie ma u mnie działa, ale path.resolve ( 'src') Roboty

resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': path.resolve('src')
    },
    extensions: ['*', '.js', '.vue', '.json']
  },
Marcelo Assis
źródło
1

Może spróbuj dodać w pakiecie internetowym. mix.webpackConfig odwołuje się do laravel mix .

mix.webpackConfig({

    resolve: {
        alias: {
            '@imgSrc': path.resolve('resources/assets/img')
        }
    }
});

A potem vue use.

<img src="@imgSrc/logo.png" />
Paweł
źródło