webpack 打包后,路径错误导致图片和 CSS 无法正常访问

在使用 webpack 进行前端开发时,我们常常会遇到一个问题:打包后,图片和 CSS 文件的路径错误,导致无法正常访问。这个问题在刚开始使用 webpack 的时候很容易遇到,解决起来却不是那么简单。

问题分析

当我们在代码中引用图片或 CSS 文件时,通常使用相对路径,如下所示:

---- ----------------------- -----------
----- ---------------- -----------------------

然而,当 webpack 打包时,会将所有文件打包成一个文件,这个文件通常在项目根目录下,并没有原来的目录结构。因此,相对路径就会出现问题,无法正确地定位到我们需要的文件。

例如,假设我们有以下的项目结构:

--- ----
-   --- ---------
--- ---
-   --- ------
-   -   --- --------
-   --- ---
-   -   --- ---------
-   --- ----------
--- ------------
--- -----------------

当我们在 index.html 中引用图片和 CSS 文件时,使用了相对路径:

---- ----------------------- -----------
----- ---------------- -----------------------

但是,当我们使用 webpack 打包后,生成的文件如下所示:

------
  ------
    ----- ----------------
    -------------- -----------
    ----- --------------- -----------------
  -------
  ------
    ---- -------------- -----------
    ------- -------------------------
  -------
-------

可以看到,图片和 CSS 文件的路径已经发生了变化。这时候,index.html 就无法正确地定位到这些资源了,因此,浏览器也无法加载它们。

解决方案

为了解决这个问题,我们需要使用 webpack 提供的一些配置项。下面,我们来看一下具体的解决方案。

使用 publicPath 配置选项

webpack 提供了一个 publicPath 配置选项,可以用来设置 webpack 打包后模块的公共路径。publicPath 会在打包后的文件路径前面加上,并且会影响模块内部的相对路径。

我们可以在 webpack.config.js 中进行配置:

----- ---- - ----------------

-------------- - -
  ------- -
    --------- ------------
    ----- ----------------------- --------
    ----------- ----
  --
--

在这个配置中,我们将 publicPath 设置为 '/',表示所有资源的地址都以根目录为起点。这个配置项会影响到打包后的文件路径,如下所示:

------
  ------
    ----- ----------------
    -------------- -----------
    ----- ---------------- -----------------
  -------
  ------
    ---- --------------- -----------
    ------- --------------------------
  -------
-------

可以看到,图片和 CSS 文件的路径已经发生了变化,前面加上了 "/",这时候,浏览器就可以正确地加载这些资源了。

使用 file-loader 和 url-loader

除了使用 publicPath 配置选项外,我们还可以使用 file-loader 和 url-loader 进行配置,这两个 loader 可以帮助我们自动处理图片和 CSS 文件的路径,使其能够正确地被打包后的文件引用。

file-loader

file-loader 可以将静态资源输出到指定的目录,并返回资源对应的 URL。我们可以在 webpack.config.js 中进行如下的配置:

-------------- - -
  -- ---
  ------- -
    ------ -
      -
        ----- ----------------------
        ---- -
          -
            ------- --------------
            -------- -
              ----------- ---------
              ----- ---------------
            --
          --
        --
      --
    --
  --
--

这个配置表示,在遇到以 .png、.jpg、.jpeg 或 .gif 结尾的文件时,使用 file-loader 进行处理。输出目录为 images,文件名为原来的文件名和扩展名。

这样,我们在代码中引用图片时,使用的路径为相对路径,如下所示:

---- ----------------------- -----------

file-loader 会自动将图片输出到指定的目录并添加对应的哈希值,如下所示:

--- ----
-   --- ------
-   -   --- -----------------

url-loader

url-loader 可以将小于指定大小的图片转换为 Base64 编码的 DataURL,而不是将其输出到指定的目录。我们可以在 webpack.config.js 中进行如下的配置:

-------------- - -
  -- ---
  ------- -
    ------ -
      -
        ----- ----------------------
        ---- -
          -
            ------- -------------
            -------- -
              ------ -----
              ----------- ---------
              ----- ---------------
            --
          --
        --
      --
    --
  --
--

这个配置表示,在遇到小于 8KB 的以 .png、.jpg、.jpeg 或 .gif 结尾的文件时,使用 url-loader 进行处理。如果文件大小大于 8KB,则使用 file-loader 进行处理。输出目录为 images,文件名为原来的文件名和扩展名。

这样,我们在代码中引用图片时,使用的路径为相对路径,如下所示:

---- ----------------------- -----------

url-loader 会自动将小于 8KB 的图片转换为 DataURL,并且将其添加到打包后的文件中,如下所示:

------
  ------
    ----- ----------------
    -------------- -----------
    -------
      ----- -
        ----------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        ------ ------
        ------- ------
      -
    --------
  -------
  ------
    ---- -------------------
    ------- -------------------------
  -------
-------

可以看到,图片文件已经被转换为 DataURL,并且添加到了打包后的文件中,这样,浏览器就可以直接从下面的打包后的文件中加载图片了。

总结

以上就是关于使用 webpack 进行前端开发时,解决图片和 CSS 路径错误的问题的相关内容。可以看到,我们使用 publicPath 配置选项和 file-loader、url-loader 进行配置,可以很好地解决这个问题。当然,在实际开发中,我们可以根据具体的项目需要进行灵活的配置,以达到更好的效果。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/65356a897d4982a6ebc5c259


猜你喜欢

  • Serverless 的容错和错误处理机制

    随着云计算和容器技术的快速发展,Serverless 架构已经成为云计算领域中的一个新热点,它不仅可以节省开发成本,还能够提高系统的可扩展性和弹性。但是,Serverless 架构同样面临着一些容错和...

    1 年前
  • TypeScript 中的类型转换及使用方法

    什么是 TypeScript ? TypeScript 是由微软开发的一种静态类型语言,是 JavaScript 的超集。它通过添加类型注释来使程序的类型更加明确,以帮助开发人员在开发过程中检测错误,...

    1 年前
  • 如何使用 Babel 在 Node.js 中处理 ES6 代码?

    随着 ES6 的流行,前端开发人员越来越需要了解和掌握 ES6 的相关知识。然而,ES6 语法在旧版浏览器中并不被支持,这就需要通过工具将 ES6 代码转换成兼容性更好的 ES5 代码。

    1 年前
  • ECMAScript 2017 and Beyond: 步入 ES8

    随着前端技术的不断更新迭代,ECMAScript 作为前端开发的核心语言,也在不断升级。最新的版本是 ES8,下面我们一起来了解一下 ES8 的新特性。 Async/Await 在 ES8 中,实现异...

    1 年前
  • 使用 Node.js + Express + Mongoose 构建 RESTful API

    在现代 Web 应用开发中,RESTful API 成为了一种非常流行的接口设计方式。它的优点是简单易懂、易于扩展和重用,同时也符合 Web 标准。本文将介绍如何使用 Node.js + Expres...

    1 年前
  • 使用 Sequelize 操作 PostgreSQL 数据库出现 “SequelizeDatabaseError: column "createdAt" does not exist” 错误,如何解决?

    在使用 Sequelize 操作 PostgreSQL 数据库的过程中,有些开发者可能会遇到 “SequelizeDatabaseError: column "createdAt" does not ...

    1 年前
  • ECMAScript 2016 (ES7) 新特性之 Object.entries() 实现 Map 转为 Array

    简介 ECMAScript 2016 (ES7) 新特性之 Object.entries(),是 JavaScript 的一个新方法,用于将一个对象转换成一个数组。

    1 年前
  • 如何使用 Webpack 实现动态加载(懒加载)资源

    随着前端应用越来越庞大,前端代码的加载速度也成为了一个很重要的问题。为了优化用户体验,前端性能优化也就变得越来越重要。其中,懒加载技术是一种常用的技术,可以帮助我们优化应用的加载速度。

    1 年前
  • ES9 新增知识点解析(for-await、Promise.prototype.finally() 等等)

    ES9(也称为 ES2018)是 ECMAScript 标准的第 9 版本,于 2018 年 6 月发布。虽然它没有像 ES6 那样带来太多令人兴奋的新功能,但它仍然添加了一些有用的特性,为前端开发人...

    1 年前
  • 在 Fastify 框架中使用 Docker 部署应用程序的方法

    前言 在现代应用程序开发中,容器化技术已经成为一种非常流行的部署方式。Docker 作为最受欢迎的容器引擎之一,是一种方便、快速、可重复部署的方式,日益成为企业级应用程序部署的首选方式。

    1 年前
  • 在 Express.js 应用程序中使用 Redis 缓存数据

    前言 随着互联网技术的发展,越来越多的应用程序需要大量的数据进行支持,而这些数据的请求和访问会给服务器带来很大的压力。为了解决这个问题,我们可以使用缓存技术来减轻服务器的压力,提高应用程序的性能和效率...

    1 年前
  • 如何使用 LESS 优化网站性能和加载速度

    标题: 使用LESS进行样式优化 在设计任何网站时,样式设置都是关键的一环,因为它占据了大部分页面元素。CSS 已经越来越被采用,但是如果您更喜欢一种更强大的样式语言,那么 LESS 已经然是个不错的...

    1 年前
  • Javascript 性能优化的 12 个贴士

    Javascript 作为一种广泛应用于前端开发的编程语言,其性能是我们非常重视的一个方面。在本文中,我将会分享一些有关 Javascript 性能优化的实用技巧和贴士,来帮助您使您的应用在运行中表现...

    1 年前
  • 优雅的容器编排方式 Docker Compose

    Docker Compose 是一款 Docker 提供的优雅的容器编排工具,通过 Docker Compose 可以方便地定义、运行和管理多个容器应用。这篇文章将介绍 Docker Compose ...

    1 年前
  • React Native 开发中如何优雅处理 UI 组件?

    React Native 是一种非常流行的 JavaScript 框架,可以使开发人员将相同的代码同时部署到 iOS 和 Android 设备上。在 React Native 开发中,UI 组件是应用...

    1 年前
  • 响应式设计中利用 JavaScript 实现有趣的图片轮播效果

    响应式设计中利用 JavaScript 实现有趣的图片轮播效果 前端开发中,图片轮播效果是常见的需求,而响应式设计让轮播效果更加重要。本文将介绍如何利用 JavaScript 实现一个有趣的图片轮播效...

    1 年前
  • Angular 中使用 $http 服务实现分页查询的详细教程

    在现代的 Web 开发中,前端框架 Angular 已经成为了一种非常流行的选择。在 Angular 中,$http 服务可以帮助我们完成各种网络请求操作,包括分页查询。

    1 年前
  • Next.js 应用程序中使用 JWT 的最佳实践

    随着 Web 开发的发展,前后端分离架构逐渐流行,在这种架构下,JSON Web Token(JWT)被广泛用于身份验证。Next.js 作为一款流行的 React 框架,也提供了使用 JWT 进行身...

    1 年前
  • CSS Flexbox 布局实战技巧:如何实现百分比高度元素的垂直居中?

    在前端开发中,垂直居中是一个非常常见的需求。然而,当要实现一个百分比高度的元素的垂直居中时,情况就会变得有些棘手。在本文中,我们将介绍使用 CSS Flexbox 布局实现这一目标的技巧和方法。

    1 年前
  • AngularJS SPA 应用中基于路由的权限控制实践

    随着前端技术的不断发展,越来越多的应用采用了单页面应用(SPA)的架构,使得前端应用具有了更好的交互性和用户体验。但是在 SPA 应用中,安全和权限控制是必不可少的一环,因为前端代码基本都是公开的,攻...

    1 年前

相关推荐

    暂无文章