详解vue静态资源打包中的坑与解决方案

yizhihongxing

接下来我将详细讲解“详解vue静态资源打包中的坑与解决方案”的完整攻略。

一、问题描述

Vue开发中,经常需要使用一些静态资源,如图片、字体等。但是,当我们将Vue项目打包后,这些静态资源文件在文件系统中的路径就会变化,这就会导致引用不到这些资源从而导致网页无法正确显示。

二、原因分析

静态资源路径问题通常由Webpack打包机制引起的。Webpack 在将代码打包压缩时,会基于“依赖图谱”来决定每个依赖项在 bundle 中的位置,因此在处理静态资源路径时也会遵循这一机制。具体来说,当Webpack在处理代码中的静态资源引用时,会将资源从源代码路径中复制到打包文件夹中,并在HTML文件中自动插入相应的路径,但是默认情况下它并不支持在index.html指定contextRoot,需要手动配置。

三、解决方案

我们可以通过以下两种方式来解决这个问题。

方案一:使用vue.config.js中的publicPath属性

Vue Cli 3.x默认把静态资源存放在public文件夹中,因此我们可以通过设定publicPath来更好地处理静态资源路径。publicPath是一个在 index.html中引入的公共路径,它也会在构建之前被插入到所有(URL)里面。具体操作方式如下:

  1. 在Vue工程目录下新建vue.config.js文件,内容如下:
module.exports = {
  publicPath: './',
}
  1. 使用正斜杠代替相对路径

一旦设定了publicPath为./,在 HTML、CSS、JS 文件中的相对路径(../../xxx.css)都会被解析为(./../../xxx.css)。因此,我们在引用静态资源时只需使用正斜杠代替相对路径即可:

<img src="/assets/logo.png" alt="logo">

方案二:将所有静态资源放入assets文件夹中

这是另一种推荐的做法,我们可以将所有静态资源都放在assets文件夹下,通过assets/js、assets/css、assets/images这样的目录结构来管理这些资源,同时在构建时加入对应的Webpck loader来编译、压缩这些资源。这种方法的好处是可以方便地统一管理静态资源文件,并且可以更好地避免资源路径问题。

具体操作如下:

  1. 在 Vue 工程目录下,创建assets文件夹

  2. 在assets/js、assets/css、assets/images目录下分别添加js、css和图片文件

  3. 在vue.config.js中添加loader配置,这里以压缩图片的loader为例

let path = require('path')

module.exports = {
  configureWebpack: {
    module: {
      rules: [
        {
          test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
          use: [
            {
              loader: 'image-webpack-loader',
              options: {
                bypassOnDebug: true,
                disable: true,
                mozjpeg: {
                  progressive: true,
                  quality: 75
                },
                optipng: {
                  enabled: false,
                },
                pngquant: {
                  quality: [0.75, 0.9],
                  speed: 4
                },
                gifsicle: {
                  interlaced: false,
                },
                webp: {
                  quality: 75
                }
              }
            }
          ]
        }
      ]
    }
  }
}

四、总结

通过以上两种方法,我们可以很好的解决Vue静态资源路径打包问题。但是需要注意的是,如果我们使用了相对路径,那么在部署时,我们需要确保部署到的目录与路径是一致的。因此,在使用Vue进行开发时,我们应该尽量避免使用相对路径。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解vue静态资源打包中的坑与解决方案 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • npm install安装报错的几种常见情况

    以下是关于npm install安装报错的几种常见情况的攻略。 1. 版本兼容问题 当我们使用 npm install 安装依赖时,npm 会尝试找到最新或符合版本约束的依赖版本,并自动安装。但是,有时候我们会遇到版本兼容问题而导致安装报错。比如: ERROR: Failed to download Chromium r818858! Set "P…

    Vue 2023年5月28日
    00
  • vue 解决数组赋值无法渲染在页面的问题

    当 Vue 绑定的数据是一个数组时,使用原生的赋值方式(例如 array[0] = newValue)并不会触发组件的重新渲染,因为 Vue 无法识别这种方式的数据变动。为了解决这种问题,需要使用 Vue 提供的特殊方法,或在代码层面做出一些调整。 下面是解决数组赋值无法渲染在页面的问题的完整攻略: 1. 使用特殊方法进行数组数据更新 Vue 提供了一些特殊…

    Vue 2023年5月28日
    00
  • Vue3的7种种组件通信详情

    下面将详细讲解Vue3的7种组件通信方式的完整攻略。 1. 父子组件通信 父子组件通信是指从父组件向子组件传递数据或者事件。在Vue3中我们可以使用props属性向子组件传递变量,或使用$emit方法接收子组件的事件通知。 以下是一个简单的示例: <!– 父组件 –> <template> <div> <!– …

    Vue 2023年5月28日
    00
  • 手把手教你用VUE封装一个文本滚动组件

    让我们逐步介绍如何用Vue封装文本滚动组件。 1. 创建Vue组件 首先,我们需要创建一个Vue组件,在这个组件中实现文本滚动的功能。 <template> <div class="scroll-container"> <div class="scroll-content" ref=&qu…

    Vue 2023年5月29日
    00
  • 深入理解vue中的$set

    下面是关于“深入理解Vue中的$set”的完整攻略。 什么是$set 在 Vue.js 中,我们经常需要在已有的数据对象中添加新的属性,但是这样做是响应式的吗?答案是否定的。因为 Vue.js 在初始化实例时将属性转化为 getter/setter,所以属性必须在初始化时存在才能让 Vue.js 转化它为响应式的数据。但是,Vue提供了一种方法来帮助我们完成…

    Vue 2023年5月29日
    00
  • Vue自定义指令介绍(2)

    下面为你详细讲解Vue自定义指令介绍(2)的完整攻略。 什么是自定义指令 自定义指令是 Vue 框架中的一种扩展,允许开发者在模板中以 v-xxx 的格式自定义指令,指令的定义和实现可以是全局的或局部的,并且可以带有参数和修饰符。 自定义指令主要有两种用途: 增强已有的 DOM 元素; 提供组件的行为和样式。 自定义指令的定义 自定义指令的定义通过 Vue.…

    Vue 2023年5月27日
    00
  • Vue this.$router.push(参数)实现页面跳转操作

    当我们使用Vue.js构建单页面应用时,有时需要在不同的页面之间进行路由跳转。Vue Router提供了一些方法来实现这一功能,其中之一是$this.$router.push()方法。以下是关于如何使用$this.$router.push()方法实现页面跳转操作的完整攻略。 前置准备 要使用Vue Router,需先安装Vue Router模块并配置路由。 …

    Vue 2023年5月27日
    00
  • vue项目里面引用svg文件并给svg里面的元素赋值

    下面是关于Vue项目中使用SVG文件的详细攻略: 使用Vue-Awesome模块 Vue-Awesome是一个使用font Awesome图标的Vue.js组件库,此库已经有了内置的SVG图标,可以让你很方便地调用SVG图标: 首先安装vue-awesome npm install vue-awesome 引入需要使用的组件。在需要使用SVG图标的组件中,可…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部