Імпорт ES6 за допомогою входу ('@') у проекті vue.js за допомогою Webpack


273

Я запускаю новий проект vue.js, тому я використовував інструмент vue-cli для того, щоб накреслити новий проект webpack (тобто vue init webpack).

Під час проходження генерованих файлів я помітив у src/router/index.jsфайлі такий імпорт :

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
        }
    ]
})

@Раніше я не бачив знака at ( ). Я підозрюю, що це дозволяє відносні шляхи (можливо?), Але я хотів бути впевненим, що розумію, що це справді робить.

Я спробував здійснити пошук в Інтернеті, але не зміг знайти пояснення (проблема, оскільки пошук "за знаком" або використання буквеного символу @не допомагає як критерії пошуку).

Що @робити на цьому шляху (посилання на документацію було б фантастичним) і чи це справа es6? Веб-пакет? Річ з навантажувачем?

ОНОВЛЕННЯ

Дякую Фелікс Клінг, що вказав мені на ще один дублікат запитання / відповіді щодо цього ж запитання.

Хоча коментар до іншої публікації про stackoverflow не є точною відповіддю на це питання (у моєму випадку це не був дитячий плагін), він мене вказав у правильному напрямку, щоб знайти, що це було.

У ешафотів, які запускають vue-cli для вас, частина базового конфігурації веб-пакета встановлює псевдонім для файлів .vue:

Місце псевдоніму в рамках проекту

Це має сенс і в тому, що він дає вам відносний шлях до файлу src, і він видаляє вимогу .vueв кінці шляху імпорту (який вам зазвичай потрібен).

Дякую за допомогу!



1
@FelixKling Це не точний дублікат, тому що він не відповідає на все запитання, це річ es6? Веб-пакет? Річ з навантажувачем?
колба Естуса

Так, я думаю, що питання було подібним, але не дублюючим. Незалежно від того, я зрозумів, звідки воно походить, і оновив питання з поясненням, оскільки не можу додати його як відповідь.
Кріс Шмітц

@estus: з відповіді чітко видно, що це не частина ES6, а конфігурація веб-пакету, ви не думаєте? І саме так і тут, лише те, що характер конфігурації дещо інший.
Фелікс Клінг

@FelixKling Я вважаю, коли estus вказав, що все ще виникає питання про те, що це таке, я ще не додав оновлення (я побачив, що його коментар надходить, коли я друкував оновлення). Я все налаштований і є детальне пояснення щодо мого конкретного випадку, тому мені добре йти. Спасибі, хлопці.
Кріс Шмітц

Відповіді:


243

Це робиться за допомогою resolve.aliasпараметра налаштування Webpack і не є специфічним для Vue.

У шаблоні єт WebPack , Webpack налаштований для заміни @/з srcшляхом :

  const path = require('path');

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

Псевдонім використовується як:

import '@/<path inside src folder>';

171
JavaScript просто більше не є JavaScript. Babel / webpack дає нам цю мову Франкенштейна, і якимось чином нові розробники повинні знати, де закінчується специфікація ECMAScript і починаються плагіни / перетворення користувача. Це справді сумно, imo.
Дякую

3
@naomik Користувач повинен вводити такі хитрощі в налаштування чи ні. Для Vue це не велика справа, оскільки він так чи інакше покладається на власний формат файлу .vue.
колба Естуса

15
Особисто я вважаю, що можливість додати гнучкість, якщо ти хочеш, це хороша річ. Я вважаю це менш франкенштейном і більше схожим на вольтрон; ви можете робити речі як лев або комбінувати різні леви разом, щоб мати більший робот. Так, іноді виникають такі питання, але це не так, як відповіді не знайти. Дійсно, ви можете поглянути на франкенштейн чи вольтрон з будь-яким проектом будь-якого розміру, це просто "використання та розуміння залежностей".
Кріс Шмітц

1
@ChrisSchmitz Це залежить від контексту та перспективи. Виконання чогось подібного обмежить проект для використання Webpack. Можливо, це не дуже добре, якщо проект має намір використовувати вбудовані модулі ES6, коли вони надійдуть, або це Вузол, де CommonJS може використовуватися для модулів. Довгі відносні шляхи можуть бути складнішими для підтримання та рефакторації, з іншого боку.
колба Естуса

3
Під час використання vue-cliv3 + слід використовувати ~@для посилання на srcпапку. Напр .:$font-path: '~@/assets/fonts/';
Горган

9

Також пам’ятайте, що також можна створювати змінні в tsconfig:

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

Це можна використовувати для цілей конвенції щодо іменування:

import { componentHeader } from '@components/header';

Але цей псевдонім буде залишений голим у вихідному JS, і тоді під час запуску вам потрібно буде перехопити обгортку, щоб псевдонім працював. Можливо, є такий спосіб, щоб за допомогою синтаксису TS перетворитись під час збирання? З Typescript tscце не так, і тому вам знадобиться щось на зразок module-aliasабо tsconfig-paths.
кен

3

Я переживаю наступну комбінацію

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

IDE припинить попереджати uri, але це спричиняє недійсні урі під час компіляції у "build \ webpack.base.conf.js"

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

Бінго!


1

Рішучість ( «ЦСМ») не працює для мене , але path.resolve ( «ДКЗ») роботи

resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': path.resolve('src')
    },
    extensions: ['*', '.js', '.vue', '.json']
  },

1

Можливо, спробуйте додати в webpack. mix.webpackConfig посилання на laravel mix .

mix.webpackConfig({

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

А потім у використанні vue.

<img src="@imgSrc/logo.png" />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.