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 ( @) ในเส้นทางก่อน ฉันสงสัยว่ามันจะช่วยให้เส้นทางญาติ (อาจ?) แต่ฉันต้องการให้แน่ใจว่าฉันเข้าใจสิ่งที่มันทำอย่างแท้จริง

ฉันพยายามค้นหาทางออนไลน์ แต่ไม่สามารถหาคำอธิบายได้ (อาจเป็นเพราะการค้นหา "at sign" หรือการใช้ตัวอักษร@ไม่ได้ช่วยในการค้นหาตามเกณฑ์)

สิ่งที่@ต้องทำในเส้นทางนี้ (ลิงก์ไปยังเอกสารประกอบจะยอดเยี่ยม) และนี่คือสิ่งที่ es6? สิ่งที่ webpack? สิ่ง vue-loader?

UPDATE

ขอบคุณ Felix Kling ที่ชี้ให้ฉันไปยังคำถาม / คำตอบสแต็คโอเวอร์โฟลว์ที่ซ้ำกันเกี่ยวกับคำถามเดียวกัน

ในขณะที่ความคิดเห็นในโพสต์สแต็คโอเวอร์โฟลว์อื่น ๆ ไม่ใช่คำตอบที่แน่นอนสำหรับคำถามนี้ (ไม่ใช่ปลั๊กอินของ Babel ในกรณีของฉัน) แต่มันชี้ให้ฉันในทิศทางที่ถูกต้องเพื่อค้นหาว่ามันคืออะไร

ในนั่งร้านที่ vue-cli หาคุณส่วนหนึ่งของการกำหนดค่า webpack พื้นฐานตั้งค่านามแฝงสำหรับไฟล์. vue:

ตำแหน่งนามแฝงภายในโครงการ

สิ่งนี้สมเหตุสมผลทั้งในความจริงที่ว่ามันให้พา ธ สัมพัทธ์กับคุณจากไฟล์ src และจะลบข้อกำหนดของ.vueที่ส่วนท้ายของพา ธ การนำเข้า (ซึ่งปกติคุณต้องการ)

ขอบคุณสำหรับความช่วยเหลือ!


3
ดูความคิดเห็นของฉัน
เฟลิกซ์คลิง

1
@ FelixKling มันไม่ได้ซ้ำกันแน่นอนเพราะมันไม่ได้ตอบคำถามทั้งหมดนี่คือสิ่งที่ es6? สิ่งที่ webpack? สิ่ง vue-loader?
Estus Flask

ใช่ฉันคิดว่าคำถามนั้นคล้ายกัน แต่ไม่ซ้ำกัน ไม่ว่าฉันจะทราบว่ามาจากที่ใดและอัปเดตคำถามพร้อมคำอธิบายเนื่องจากฉันไม่สามารถเพิ่มเป็นคำตอบได้
Chris Schmitz

@estus: คำตอบทำให้เห็นได้ชัดว่าไม่ใช่ส่วนหนึ่งของ ES6 แต่เป็นสิ่งกำหนดค่า webpack คุณไม่คิดเหรอ? และในกรณีนี้ก็เช่นกันเฉพาะลักษณะของการกำหนดค่าที่แตกต่างกันเล็กน้อย
เฟลิกซ์คลิง

@ FelixKling ฉันเชื่อว่าเมื่อ estus ชี้ให้เห็นว่ายังมีคำถามเกี่ยวกับสิ่งที่เป็นฉันยังไม่ได้เพิ่มการอัปเดต (ฉันเห็นความคิดเห็นของเขาเข้ามาในขณะที่ฉันกำลังพิมพ์อัปเดต) ฉันพร้อมแล้วและมีคำอธิบายโดยละเอียดเกี่ยวกับอินสแตนซ์เฉพาะของฉันดังนั้นฉันยินดีที่จะไป ขอบคุณเพื่อน.
Chris Schmitz

คำตอบ:


243

สิ่งนี้ทำกับresolve.aliasตัวเลือกการกำหนดค่าWebpack และไม่เฉพาะเจาะจงกับ Vue

ในเท็มเพลต 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 ให้ภาษาของ Frankenstein แก่เราและผู้พัฒนารายใหม่ ๆ จะต้องรู้ว่า ECMAScript นั้นสิ้นสุดลงที่ใดและผู้ใช้งานปลั๊กอิน / แปลงเริ่มต้น มันช่างน่าเศร้าจริงๆ
ขอบคุณ

3
@naomik มันขึ้นอยู่กับผู้ใช้ที่จะแนะนำเทคนิคดังกล่าวในการตั้งค่าหรือไม่ ไม่ใช่เรื่องใหญ่สำหรับ Vue เนื่องจากต้องอาศัยรูปแบบไฟล์. vue ที่กำหนดเองอยู่ดี
Estus Flask

15
ส่วนตัวผมคิดว่าความสามารถในการเพิ่มความยืดหยุ่นถ้าคุณต้องการมันเป็นสิ่งที่ดี ฉันเห็นว่ามันน้อยกว่าแฟรงเกนสไตน์และเหมือนโวลตรอน คุณสามารถทำสิ่งต่างๆเช่นสิงโตหรือรวมสิงโตต่างๆเข้าด้วยกันเพื่อให้มีหุ่นยนต์ที่ใหญ่กว่า ใช่บางครั้งคุณได้รับคำถามเช่นนี้ แต่มันไม่เหมือนคำตอบที่ไม่สามารถหาได้ จริง ๆ แล้วคุณสามารถใช้มุมมองแฟรงเกนสไตน์หรือโวลตรอนกับโครงการทุกขนาดไม่ว่าจะเป็น "การใช้และการทำความเข้าใจการพึ่งพา"
Chris Schmitz

1
@ChrisSchmitz มันขึ้นอยู่กับบริบทและมุมมอง การทำสิ่งนี้จะ จำกัด โครงการให้ใช้ Webpack อาจไม่ใช่เรื่องดีถ้าโครงการตั้งใจจะใช้โมดูล ES6 ดั้งเดิมเมื่อพวกเขาจะมาถึงหรือเป็น Node ที่สามารถใช้ CommonJS สำหรับโมดูลได้ เส้นทางสัมพัทธ์ที่ยาวนานอาจยากต่อการบำรุงรักษาและการสร้างใหม่ในทางกลับกัน
Estus Flask

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 และเมื่อรันไทม์คุณจะต้องใช้กระดาษห่อหุ้มเพื่อขอให้นามแฝงทำงาน อาจมีวิธีผ่าน babel สำหรับไวยากรณ์ TS นี้เพื่อรับการแปลงเมื่อสร้างหรือไม่ ด้วย typescript ของtscเป็นไม่ได้และดังนั้นคุณจะต้องสิ่งที่ต้องการหรือmodule-aliastsconfig-paths
เคน

3

ฉันได้รับมากกว่าด้วยการรวมกันดังต่อไปนี้

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

IDE จะหยุดเตือน uri แต่สิ่งนี้ทำให้ uri ไม่ถูกต้องเมื่อคอมไพล์ใน "build \ webpack.base.conf.js"

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

Bingoo!


1

แก้ไข ('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.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.