Webpackを使用したvue.jsプロジェクトのat( '@')サインインパスを使用したES6インポート


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

これまでに@パスのアットマーク()を見たことがない。私はそれが相対パスを許可しているのではないかと思っています(たぶん?)。

オンラインで検索してみましたが、説明が見つかりませんでした( "アットマーク"を検索するか、リテラル文字を使用し@ても検索条件として役に立たないためです)。

@このパスでは何をしますか(ドキュメントへのリンクは素晴らしいでしょう)、これはes6のものですか?ウェブパックのこと?ビューローダーのこと?

更新

Felix Klingに、この同じ質問について別の重複したStackoverflow質問/回答を教えてくれてありがとう。

他のstackoverflowの投稿へのコメントはこの質問に対する正確な答えではありませんが(私の場合、それはbabelプラグインではありませんでした)、それが何であるかを見つけるために正しい方向に私を向けました。

vue-cliがクランクアウトする足場で、基本のwebpack構成の一部が.vueファイルのエイリアスを設定します。

プロジェクト内のエイリアスの場所

これますが、それはあなたのsrcファイルからの相対パスを与えるという事実の両方を感知し、それがの要件を削除.vueします(通常は必要)インポートパスの最後に。

助けてくれてありがとう!



1
@FelixKling質問全体に回答しないため、完全に重複しているわけではありません。これはes6のものですか?ウェブパックのこと?ビューローダーのこと?
Estus Flask 2017

ええ、私は質問が似ていたと思いますが、重複ではありません。それがどこから来ているのかを理解し、回答として追加できないため、質問を説明で更新しました。
Chris Schmitz 2017年

@estus:その答えは、それがES6の一部ではなく、webpack構成のことであることをかなり明確にしますね。ここでも同じですが、構成の性質が少し異なるだけです。
Felix Kling

@FelixKling私はそれがどのようなものであるかについての質問がまだあると私がまだアップデートを追加していなかったとエスタスが指摘したとき私は信じます(アップデートを入力しているときに彼のコメントが表示されるのを見ました)。私はすべて準備ができており、私の特定のインスタンスに関する詳細な説明があるので、私は行ってもいいです。みんなありがとう。
クリスシュミッツ2017年

回答:


243

これはWebpack resolve.alias構成オプションで行われ、Vueに固有のものではありません。

Vue Webpackテンプレートでは、Webpackはpathに置き換わるように構成されて@/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仕様がどこで終わり、ユーザーランドプラグイン/変換が始まるかを知ることを意図しています。本当に悲しいです、イモ。
ありがとう

3
@naomikこのようなトリックをセットアップに導入するかどうかは、ユーザー次第です。とにかくカスタムの.vueファイル形式に依存しているため、Vueにとって大した問題ではありません。
Estus Flask 2017

15
個人的には、必要に応じて柔軟性を追加できることは良いことだと思います。私はそれをフランケンシュタインではなく、ボルトロンのように見ています。ライオンのようなことをしたり、異なるライオンを組み合わせて大きなロボットを作ったりすることができます。ええ、時々あなたはこのような質問を受けるかもしれませんが、答えが見つからないというわけではありません。実際、フランケンシュタインまたはボルトロンのビューは、任意のサイズの任意のプロジェクトで使用できます。これは、「依存関係の使用と理解」にすぎません。
Chris Schmitz

1
@ChrisSchmitzそれはコンテキストと視点に依存します。このようなことを行うと、プロジェクトでWebpackの使用が制限されます。プロジェクトが到着時にネイティブES6モジュールを使用するつもりである場合、またはCommonJSをモジュールに使用できるノードである場合、これは良いことではありません。一方、相対パスが長いと、保守やリファクタリングが難しくなります。
Estus Flask 2017

3
使用するときはvue-cliV3を+あなたが使用する必要があり~@、参照するsrcフォルダ。例:$font-path: '~@/assets/fonts/';
Consta Gorgan

9

また、tsconfigで変数を作成することもできます。

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

これは、命名規則の目的で利用できます。

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

しかし、この種のエイリアスはソースJSにそのまま残され、実行時に、ラッパーを介してエイリアスを機能させる必要があります。たぶん、このTS構文をビルド時に変換する方法がbabelを介してあるのでしょうか?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」で無効なURIが発生します。

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

ビンゴ!


1

resolve( 'src') は機能しませんが、path.resolve( 'src')は機能します

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" />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.