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!



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

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

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!


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']
  },

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" />
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.