Webpack kullanarak bir vue.js projesinde ('@') oturum açma yolunu kullanarak ES6 içe aktarma


273

Yeni bir vue.js projesi başlatıyorum, bu yüzden yeni bir webpack proje (yani vue init webpack) iskele için vue-cli aracını kullandım .

Ben oluşturulan dosyaları yürürken src/router/index.jsdosyada aşağıdaki ithalat fark ettim :

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

Daha önce @bir yolda at işareti ( ) görmedim . Göreli yollara izin verdiğinden şüpheleniyorum (belki?) Ama gerçekten ne yaptığını anladığımdan emin olmak istedim.

Çevrimiçi arama yapmayı denedim ama bir açıklama bulamadım (çünkü "tabelaya" ya da değişmez karakteri kullanarak @arama kriteri olarak yardımcı olmuyor).

@Bu yolda ne yapmak (belgelere bağlantı harika olurdu) ve bu bir es6 şey mi? Web paketi bir şey mi? Vue-loader bir şey mi?

GÜNCELLEME

Felix Kling, beni aynı soru hakkında başka bir yinelenen yığın akışı sorusuna / cevabına yönlendirdiği için teşekkürler

Diğer stackoverflow yazıdaki yorum bu sorunun kesin cevabı olmasa da (benim durumumda bir babel eklentisi değildi) ne olduğunu bulmak için beni doğru yönde gösterdi.

Vue-cli'nin sizin için krank yaptığı iskelede, temel web paketi yapılandırmasının bir kısmı .vue dosyaları için bir takma ad oluşturur:

Proje içindeki takma ad konumu

Bu markaları size src dosyasından göreli bir yol kazandırdığı gerçeği hem algılayabilir ve bu gereksinimini ortadan kaldırır .vue(normalde gerekir) ithalat yolunun sonunda.

Yardım için teşekkürler!



1
@FelixKling Tam bir kopya değil çünkü tüm soruyu cevaplamıyor , bu bir es6 şey mi? Web paketi bir şey mi? Vue-loader bir şey mi?
Estus Flask

Evet, sanırım soru benzerdi ama tekrar değildi. Ne olursa olsun nereden geldiğini anladım ve cevap olarak ekleyemediğim için soruyu bir açıklama ile güncelledim.
Chris Schmitz

@estus: cevap, ES6'nın bir parçası değil, bir web paketi yapılandırma olayı olduğunu açıkça gösteriyor, değil mi? Ve burada da durum böyle, sadece konfigürasyonun doğası biraz farklı.
Felix Kling

@FelixKling Estus hala güncellemeyi henüz eklemediğim şey hakkında bir soru olduğunu belirttiğinde (güncellemeyi yazarken yorumunun geldiğini gördüm) inanıyorum. Hazırım ve özel durumum hakkında ayrıntılı bir açıklama var, bu yüzden gitmek için iyi biriyim. Teşekkürler beyler.
Chris Schmitz

Yanıtlar:


243

Bu, Webpack resolve.aliasyapılandırma seçeneğiyle yapılır ve Vue'ya özgü değildir.

Vue WebPack şablonunda , WebPack yerine yapılandırıldı @/ile srcyoluna :

  const path = require('path');

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

Takma ad şu şekilde kullanılır:

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

171
JavaScript artık JavaScript değil. Babel / webpack bize bu Frankenstein dilini veriyor ve bir şekilde yeni geliştiriciler ECMAScript spesifikasyonunun nerede sona erdiğini ve kullanıcı alanı eklentilerinin / dönüşümlerinin nerede başladığını bilmeyi amaçlıyor. Gerçekten üzücü, imo.
Teşekkürler

3
@naomik Bu tür püf noktalarını kurulumla tanıştırmak veya takmamak kullanıcıya kalmıştır. Yine de özel .vue dosya biçimine bağlı olduğu için Vue için büyük bir anlaşma değil.
Estus Flask

15
Şahsen ben isterseniz esneklik ekleme yeteneğinin iyi olduğunu düşünüyorum. Daha az frankenstein ve daha çok voltron gibi görüyorum; daha büyük bir robot için aslan gibi şeyler yapabilir veya farklı aslanları birleştirebilirsiniz. Evet, bazen bunun gibi sorular alırsınız, ancak cevapların bulunamaması gibi değildir. Gerçekten, herhangi bir boyuttaki herhangi bir proje ile frankenstein veya voltron görünümünü alabilir, sadece "bağımlılıkları kullanma ve anlama".
Chris Schmitz

1
@ChrisSchmitz Bağlama ve perspektife bağlıdır. Böyle bir şey yapmak projenin Webpack'i kullanmasını kısıtlar. Proje, geldikleri zaman yerel ES6 modüllerini kullanmayı planlıyorsa veya CommonJS'nin modüller için kullanılabileceği Düğümse iyi bir şey olmayabilir. Öte yandan, uzun göreli yolların bakımı ve yeniden düzenlenmesi daha zor olabilir.
Estus Flask

3
Kullanırken vue-cliv3 + kullanmanız gereken ~@referans için srcklasöre. Örneğin:$font-path: '~@/assets/fonts/';
Consta Gorgan

9

Ayrıca tsconfig'de de değişkenler oluşturabileceğinizi unutmayın:

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

Bu, konvansiyon amaçları için kullanılabilir:

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

Ancak bu tür bir takma ad, kaynak JS'de çıplak bırakılacak ve daha sonra çalışma zamanında takma adın çalışması için bir sarıcıya müdahale etmesi gerekecek. Belki bu TS sözdiziminin derleme sırasında dönüştürülmesinin bir yolu vardır? Typescript's tscis ile değildir ve bu nedenle module-aliasveya gibi bir şeye ihtiyacınız olacak tsconfig-paths.
ken

3

Aşağıdaki kombinasyonu geçiyorum

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

IDE, uri uyarısını durduracaktır, ancak bu derlendiğinde "build \ webpack.base.conf.js" dosyasında geçersiz uri'ye neden olur.

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

Bingoo!


1

çözmek ('src') benim için çalışmıyor ama path.resolve ('src') çalışmıyor

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

1

Belki web paketini eklemeyi deneyin. mix.webpackConfig referansları laravel mix .

mix.webpackConfig({

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

Ve sonra vue kullanımda.

<img src="@imgSrc/logo.png" />
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.