Jak odwoływać się do statycznych zasobów w vue javascript

90

Szukam odpowiedniego adresu URL do odwoływania się do statycznych zasobów, takich jak obrazy w javascript Vue.

Na przykład tworzę znacznik ulotki za pomocą niestandardowego obrazu ikony i próbowałem kilku adresów URL, ale wszystkie zwracają 404 (Not Found):

Main.vue:

var icon = L.icon({
    iconUrl: './assets/img.png',
    iconSize:     [25, 25],
    iconAnchor:   [12, 12]
});

Próbowałem umieścić obrazy w folderze zasobów i folderze statycznym bez powodzenia. Czy muszę w jakiś sposób mówić Vue, żeby załadował te obrazy?

JBaczuk
źródło
webpack? To zwykle chce wiedzieć, czy obraz jest dołączony, więc zostaje umieszczony w pakiecie. Kolejne systemy wiązane prawdopodobnie nie obchodzą, o ile obraz zostanie wdrożony na serwerze
akatakritos

Odpowiedzi:

158

Dla każdego, kto chce odsyłać obrazy z szablonu, możesz odsyłać obrazy bezpośrednio za pomocą „@”

Przykład:

<img src="@/assets/images/home.png"/>
azy777
źródło
2
... biorąc pod uwagę, że masz folder src / asset / images. Po wyjęciu z pudełka, vue-loader kopiuje zasoby z src / .. / ... do kompilacji /../ .. LUB automatycznie wstawia mniejsze obrazy jako data.image / png ...
Johanness
9
u mnie nie działa: This dependency was not found:* @/assets/more-ico.svg. To install it, you can run: npm install --save @/assets/more-ico.svg...
Jakub Strebeyko
2
Dla mnie też nie działa, ale ..... zobaczyłem wtedy, że użyłem złej nazwy pliku; p działa idealnie!
Larzan
6
Działa, ale template../../assets/bg/login.svg
włącz
5
Dziękuję Ci. Dokumentacja vue dotycząca statycznych zasobów jest niepotrzebnie rozwlekła i ukrywa ten podstawowy przypadek prawie na dole strony, w małym punkcie.
Our_Benefactors
65

W zwykłej konfiguracji Vue /assetsnie jest wyświetlany.

src="data:image/png;base64,iVBORw0K...YII="Zamiast tego obrazy stają się ciągami.


Korzystanie z JavaScript: require()

Aby pobrać obrazy z kodu JS, użyj require('../assets.myImage.png'). Ścieżka musi być względna (patrz poniżej).

Twój kod wyglądałby więc tak:

var icon = L.icon({
    iconUrl: require('./assets/img.png'),   // was iconUrl: './assets/img.png',
//  iconUrl: require('@/assets/img.png'), // use @ as alternative, depending on the path
    // ...
});

Użyj ścieżki względnej

Na przykład załóżmy, że masz następującą strukturę folderów:

- src
  +- assets
     - myImage.png
  +- components
     - MyComponent.vue

Jeśli chcesz odwołać się do obrazu w programie MyComponent.vue, ścieżka powinna być../assets/myImage.png


Oto DEMO CODESANDBOX pokazujący to w akcji.

acdcjunior
źródło
2
Po zbudowaniu mojej aplikacji za pomocą vue-cli ta technika zadziałała. Bardzo pomocna była piaskownica kodu. Odpowiedź nie jest tak jasna jak piaskownica kodu.
revdrjrr
require('./assets/img.png')nie działał dla mnie w opcjach mojego komponentu, musiałem wymienić. z @: require('@/assets/img.png').
Michael
22

Aby pakiet Webpack zwrócił prawidłowe ścieżki zasobów, musisz użyć require ('./relative / path / to / file.jpg'), który zostanie przetworzony przez program ładujący pliki i zwróci rozwiązany adres URL.

computed: {
  iconUrl () {
    return require('./assets/img.png')
    // The path could be '../assets/img.png', etc., which depends on where your vue file is
  }
}

Zobacz szablony VueJS - obsługa zasobów statycznych

Yuci
źródło
21

Lepszym rozwiązaniem byłoby

Dodanie dobrych praktyk i bezpieczeństwa do odpowiedzi @ acdcjunior, @zamiast używać./

W JavaScript

require("@/assets/images/user-img-placeholder.png")

W szablonie JSX

<img src="@/assets/images/user-img-placeholder.png"/>

używając @punktów do srckatalogu.

używanie ~punktów do katalogu głównego projektu, co ułatwia dostęp do node_modulesi innych zasobów poziomu głównego

Muhammad
źródło
A co, jeśli nie jest to obraz, ale plik tekstowy lub plik CSV? Chcesz tylko uzyskać ścieżkę / adres URL?
trainoasis
7

Zaraz po otwarciu tagu skryptu po prostu dodaj import someImage from '../assets/someImage.png' i użyj go jako adresu URL ikonyiconUrl: someImage

neberaa
źródło
Działało to dobrze w przypadku wstawiania znaku „@” do importu.
vab2048
2

Z jakiego systemu korzystasz? Webpack? Vue-loader?

Będę tylko robić burzę mózgów ...

Ponieważ .png nie jest plikiem JavaScript, musisz skonfigurować pakiet Webpack, aby używał programu ładującego pliki lub programu ładującego adresy URL do ich obsługi. Projekt rusztowania z vue-cli również skonfigurował to dla Ciebie.

Możesz rzucić okiem webpack.conf.js, aby sprawdzić, czy jest dobrze skonfigurowany, jak

...
    {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },
...

/assets dotyczy plików, które są obsługiwane przez pakiet WebPack podczas pakowania - w tym celu należy odwołać się do nich gdzieś w kodzie javascript.

Można w nim umieścić inne zasoby /static, zawartość tego folderu zostanie skopiowana do /distpóźniejszego stanu.

Polecam spróbować zmienić:

iconUrl: './assets/img.png'

do

iconUrl: './dist/img.png'

Możesz przeczytać oficjalną dokumentację tutaj: https://vue-loader.vuejs.org/en/configurations/asset-url.html

Mam nadzieję, że ci to pomoże!

JP. Aulet
źródło
Nie jestem pewien, jakiego systemu używam lub czy muszę dodać go ręcznie. Wypróbowałem URL-a ./dist i bez powodzenia
JBaczuk
0

Mając domyślną strukturę folderów generowanych przez Vue CLI, na przykład src/assetsmożesz umieścić tam swój obraz i odnieść się do niego z HTML w następujący sposób <img src="../src/assets/img/logo.png">(działa również automatycznie bez żadnych zmian podczas wdrażania).

Daniel Danielecki
źródło
0

Używam maszynopisu z vue, ale tak się do tego zabrałem

<template><div><img :src="MyImage" /></div></template>
<script lang="ts">
    import { Vue } from 'vue-property-decorator';
    export default class MyPage extends Vue {
            MyImage = "../assets/images/myImage.png";
        }
</script>
Michał
źródło
-3

Oczywiście src="@/assets/images/x.jpgdziała, ale lepszy sposób to: src="~assets/images/x.jpg

Farzad.Kamali
źródło
2
Czy możesz podać wyjaśnienie?
JBaczuk