Nhập ES6 bằng cách sử dụng đường dẫn đăng nhập tại ('@') trong dự án vue.js bằng Webpack


273

Tôi đang bắt đầu một dự án vue.js mới vì vậy tôi đã sử dụng công cụ vue-cli để dàn dựng một dự án webpack mới (tức là vue init webpack).

Khi tôi đang xem qua các tệp được tạo, tôi nhận thấy các lần nhập sau trong src/router/index.jstệp:

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

Tôi chưa thấy dấu hiệu ( @) trong một đường dẫn trước đây. Tôi nghi ngờ nó cho phép các đường dẫn tương đối (có thể?) Nhưng tôi muốn chắc chắn rằng tôi hiểu những gì nó thực sự làm.

Tôi đã thử tìm kiếm trên mạng nhưng không thể tìm thấy lời giải thích (thăm dò vì tìm kiếm "tại dấu hiệu" hoặc sử dụng ký tự chữ @không giúp làm tiêu chí tìm kiếm).

Những gì @làm trong đường dẫn này (liên kết đến tài liệu sẽ là tuyệt vời) và đây có phải là một điều es6? Một điều webpack? Một điều vue-loader?

CẬP NHẬT

Cảm ơn Felix Kling đã chỉ cho tôi một câu hỏi / câu trả lời stackoverflow trùng lặp khác về cùng câu hỏi này.

Mặc dù bình luận trên bài đăng stackoverflow khác không phải là câu trả lời chính xác cho câu hỏi này (nó không phải là một plugin babel trong trường hợp của tôi), nó đã chỉ cho tôi đi đúng hướng để tìm ra nó là gì.

Trong giàn giáo mà vue-cli tạo ra cho bạn, một phần của cấu hình webpack cơ sở thiết lập một bí danh cho các tệp .vue:

Vị trí bí danh trong dự án

Điều này có ý nghĩa cả trong thực tế là nó cung cấp cho bạn một đường dẫn tương đối từ tệp src nó loại bỏ yêu cầu .vueở cuối đường dẫn nhập (mà bạn thường cần).

Cảm ơn đã giúp đỡ!



1
@FelixKling Nó không phải là một bản sao chính xác bởi vì nó không trả lời toàn bộ câu hỏi, đây có phải là một điều es6 không? Một điều webpack? Một điều vue-loader?
Estus Flask

Vâng, tôi nghĩ rằng câu hỏi tương tự nhưng không phải là một bản sao. Bất kể tôi đã tìm ra nó đến từ đâu và cập nhật câu hỏi với lời giải thích vì tôi không thể thêm nó làm câu trả lời.
Chris Schmitz

@estus: câu trả lời cho thấy khá rõ rằng nó không phải là một phần của ES6 mà là một điều cấu hình webpack, bạn có nghĩ vậy không? Và đó chính xác là trường hợp ở đây, chỉ có điều là bản chất của cấu hình hơi khác một chút.
Felix Kling

@FelixKling Tôi tin rằng khi estus chỉ ra rằng vẫn còn một câu hỏi về loại sự việc mà tôi chưa thêm bản cập nhật (Tôi thấy bình luận của anh ấy xuất hiện khi tôi đang gõ cập nhật). Tôi đã sẵn sàng và có một lời giải thích chi tiết về trường hợp cụ thể của tôi vì vậy tôi rất tốt để đi. Cảm ơn các bạn.
Chris Schmitz

Câu trả lời:


243

Điều này được thực hiện với resolve.aliastùy chọn cấu hình Webpack và không dành riêng cho Vue.

Trong mẫu Vue Webpack , Webpack được cấu hình để thay thế @/bằng srcđường dẫn :

  const path = require('path');

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

Bí danh được sử dụng như:

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

171
JavaScript không còn là JavaScript nữa. Babel / webpack cung cấp cho chúng tôi ngôn ngữ Frankenstein này và bằng cách nào đó, các nhà phát triển mới có nghĩa là biết nơi kết thúc thông số ECMAScript và các plugin / biến đổi userland bắt đầu. Thật đáng buồn, imo.
Cảm ơn bạn

3
@naomik Tùy thuộc vào người dùng có giới thiệu các thủ thuật như vậy vào thiết lập hay không. Đó không phải là vấn đề lớn đối với Vue vì dù sao nó cũng dựa vào định dạng tệp .vue tùy chỉnh.
Estus Flask

15
Cá nhân tôi nghĩ rằng khả năng thêm linh hoạt nếu bạn muốn nó là một điều tốt. Tôi thấy nó ít như frankenstein và giống như voltron hơn; bạn có thể làm những thứ như một con sư tử hoặc kết hợp những con sư tử khác nhau lại với nhau để có một con robot lớn hơn. Vâng, đôi khi bạn nhận được câu hỏi như thế này, nhưng nó không giống như câu trả lời không thể tìm thấy. Thực sự, bạn có thể có chế độ xem frankenstein hoặc voltron với bất kỳ dự án nào ở mọi quy mô, đó chỉ là "sử dụng và hiểu các phụ thuộc".
Chris Schmitz

1
@ChrisSchmitz Nó phụ thuộc vào bối cảnh và quan điểm. Làm một cái gì đó như thế này sẽ hạn chế dự án sử dụng Webpack. Có thể không phải là một điều tốt nếu dự án có ý định sử dụng các mô-đun ES6 gốc khi chúng sẽ đến, hoặc đó là Node nơi CommonJS có thể được sử dụng cho các mô-đun. Mặt khác, các đường dẫn tương đối dài có thể khó bảo trì và tái cấu trúc hơn.
Estus Flask

3
Khi sử dụng vue-cliv3 + bạn nên sử dụng ~@vào srcthư mục tham khảo . Ví dụ:$font-path: '~@/assets/fonts/';
Consta Gorgan

9

Ngoài ra, hãy nhớ rằng bạn cũng có thể tạo các biến trong tsconfig:

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

Điều này có thể được sử dụng cho mục đích quy ước đặt tên:

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

Nhưng loại bí danh này sẽ bị bỏ trống trong mã nguồn và sau đó vào thời gian chạy, bạn sẽ cần phải có một trình bao bọc được can thiệp để làm cho bí danh hoạt động. Có lẽ có một cách thông qua babel cho cú pháp TS này để được chuyển đổi khi xây dựng? Với Typecript tscthì không và do đó bạn sẽ cần một cái gì đó như module-aliashoặc tsconfig-paths.
ken

3

Tôi kết thúc với sự kết hợp sau đây

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

IDE sẽ ngừng cảnh báo uri, nhưng điều này gây ra uri không hợp lệ khi biên dịch, trong "build \ webpack.base.conf.js"

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

Bingoo!


1

giải quyết ('src') không hoạt động đối với tôi nhưng path.resolve ('src') hoạt động

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

1

Có thể thử thêm vào webpack. mix.webpackConfig tham khảo hỗn hợp laravel .

mix.webpackConfig({

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

Và sau đó trong sử dụng vue.

<img src="@imgSrc/logo.png" />
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.