Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Including Images from a Vue Library

I am trying to publish a Vue library to npmjs and the library has a few images in it.

I publish the app to NPM, Import it into my main app and everything seems to function as expected, but the path to the images of the library are wrong and I can't seem to fix the link to them (I can see that the images are located in the node_modules folder of my library. Shouldn't my main vue app extract the images from the library when I run npm run serve?)

I tried to make a simplified demo of this problem to try to understand it.

In my Library, I created a really basic component

<div class="hello">
  <h1>{{ msg }}</h1>
  <img alt="Vue logo" src="@/assets/xlogo.png" />
  <img alt="Vue logo" :src="require('../assets/xlogo.png')" />
  <p>This is a paragraph.</p>
</div>

I then build the library with the following node command. (the command is in the package.json and I run it via npm run build:lib)

vue-cli-service build --target lib --name tmp ./src/components/index.vue

Then I try to import that library into my main vue app

import HelloWorld from '../../tmp/dist/tmp.umd.js' 

<template>
  <HelloWorld msg="Welcome to Your Vue.js App.."/>
</template>

I created a git repo to demonstrate this. So How would I go about changing it so the images are included in the library? Any pointers would be much appreciated as I have spent hours trying to figure this out on my own already :(

like image 852
user2835033 Avatar asked Jun 03 '26 07:06

user2835033


1 Answers

Sigh... this took waay longer to figure out than I would have liked.

I had to configure webpack to convert the images to base64. I guess the downside of this is that the package is larger because the images are packaged in the app code now, which is ok in my case as I only have a couple images anyway.

Steps to fix:

1: Install Url Loader

npm install --save-dev url-loader

2: Create a vue.config.js file and configure it so images are handled by the url loader

module.exports = {
      chainWebpack: (config) => {
        config.module
          .rule("images")
          .test(/\.(png|jpg|svg)$/i)
          .use("url-loader")
          .loader("url-loader")
          .tap(options => Object.assign(options, { limit: 10240 }));
      },
    }

Thats it. Also worth noting is that require did not work in the vue template itself.

<template>
  <div class="hello">
    <div><img src="~@/assets/logo.png" /></div> <!-- Working -->
    <div><img src="@/assets/logo.png" /></div> <!-- Working -->
    <div><img :src="imgPath" /></div> <!-- Working -->
    <div><img :src="require('../assets/logo.png')" /></div> <!-- Not Working -->
    <div><img :src="require('../assets/logo.png')" /></div> <!-- Not Working -->
  </div>
</template>

<script>
import imgPath from "@/assets/logo.png";

export default {
  setup() {
    return {
      imgPath,
    };
  },
};
</script>
like image 98
user2835033 Avatar answered Jun 05 '26 21:06

user2835033



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!