美文网首页
Webpack 5(八)加载资源

Webpack 5(八)加载资源

作者: _于曼丽_ | 来源:发表于2023-10-19 09:11 被阅读0次

资源的存放路径与访问路径

资源文件

打包之前,一个文件就是一个模块。模块可以是任何类型的文件(js 模块,css 文件,图像文件),模块之间存在依赖关系。这些文件作为源代码,一般存放在项目目录下的 src 目录中。

打包之后,一个文件就是一个资源。通过 webpack 生成 chunk 文件 (js 文件),通过 HtmlWebpackPlugin 生成 html 文件,通过 MiniCssExtractPlugin 生成 css 文件,通过 asset/resource 生成图像文件。这些文件统称为资源文件,存放在 output.path 定义的目录下。

资源文件的存放路径与访问路径

通过 output.path 定义资源文件的存放路径:

js 文件:output.path + output.filename
css 文件:output.path + MiniCssExtractPlugin 插件的 options.filename
图像文件:output.path + {图片资源 rule}.generator.filename

通过 output.publicPath 定义资源文件的访问路径:

js 文件:output.publicPath + output.filename
css 文件:output.publicPath + MiniCssExtractPlugin 插件的 options.filename
图像文件:output.publicPath + {图片资源 rule}.generator.filename

访问资源

在浏览器地址栏:

  • 输入资源文件的访问路径,可以访问资源

在 html 文件里:

  • 通过 <script src="js 文件访问路径"> 访问 js 资源
  • 通过 <link href="css 文件访问路径"> 访问 css 资源
  • 通过 <img src="图像文件访问路径"> 访问图像资源

在 css 文件里:

  • 通过 url(图像文件访问路径) 访问图像资源

通过 HtmlWebpackPlugin 生成的 html 文件,通过 MiniCssExtractPlugin 生成的 css 文件,会按照 output.publicPath 自动添加资源访问路径。具体能不能根据资源路径访问到相应的资源,还得正确的部署 output.path 目录到服务器。

加载 CSS

css-loader
style-loader
MiniCssExtractPlugin
CssMinimizerWebpackPlugin

开发模式下,通过 css-loader 将 css 模块转为 javascript 模块,通过 style-loader 用内嵌的 <style></style> 标签在 html 文档中动态插入 css 代码。

/* webpack.config.js */

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  ...
  mode: 'development',
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin()
  ],
  ...
}
/* index.js */

// 会动态生成两个 <style></style> 标签
import './base.css';
import './style.css';

console.log('Hello world'!);

生产模式下,通过 css-loader 将 css 模块转为 javascript 模块,通过 MiniCssExtractPlugin 将 css 代码分离出来,通过 CssMinimizerPlugin 来压缩 css 代码,通过 HtmlWebpackPlugin 生成的 html 文档会使用 <link> 标签自动引入分离出的 css 文件。

/* webpack.config.js */

const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");

module.exports = {
  ...
  mode: 'production',
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, 'css-loader']
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin(),
    new MiniCssExtractPlugin()
  ],
  optimization: {
    minimizer: [
      '...',
      new CssMinimizerPlugin()
    ],
  }
  ...
}
/* index.js */

// 将依赖的所有 css 模块都打包到一个 js 文件分离出去,通过一个 <link> 标签引入到 html 文档中
import './base.css';
import './style.css';

console.log('Hello world'!);

默认情况下:

  • css 文件的存放路径为:output.path/[name].css
  • css 文件的访问路径为:output.publicPath/[name].css

可以通过 MiniCssExtractPlugin 插件的 options.filename 自定义 css 文件路径。

module.exports = {
  plugins: [
    new MiniCssExtractPlugin({
      filename: 'css/[name].css'
    })
}

通过以上配置:

  • css 文件的存放路径为:output.path/css/[name].css
  • css 文件的访问路径为:output.publicPath/css/[name].css

加载图像

通过以下三种方式都可以表明模块对图像模块的依赖关系:

  • 在 js 模块中 import MyImage from './my-image.png'
  • 在 css 模块中 url('./my-image.png')
  • 在 html 模块中 <img src="./my-image.png" />

在 webpack 5 中通过 asset module 来处理图像等资源模块

/* webpack.config.js */

module.exports = {
  module: {
    rules: [
      {
        test: /\.(jpg|jpeg|png|gif)$/i,
        type: 'asset/resource'
      }
    ]
  },
}

type: 'asset/resource':会将依赖的图像以 [hash][ext][query] 文件名导出到 output.path 指定的输出目录。

默认情况下:

  • 导出的图像文件的存放路径为:output.path/[hash][ext][query]
  • 导出的图像文件的访问路径为:output.publicPath/[hash][ext][query]

通过 Rule.generator.filename 可以自定义导出的图像路径。

module.exports = {
  module: {
    rules: [
      {
        test: /\.(jpg|jpeg|png|gif)$/i,
        type: 'asset/resource',
        generator: {
          filename: 'images/[hash][ext][query]',
        },
      }
    ]
  },
}

通过以上配置:

  • 导出的图像文件的存放路径为:output.path/images/[hash][ext][query]
  • 导出的图像文件的访问路径为:output.publicPath/images/[hash][ext][query]

type 可以取以下四种值:

  • asset/resource 发送一个单独的文件并导出 URL。之前通过使用 file-loader 实现。
  • asset/inline 导出一个资源的 data URI。之前通过使用 url-loader 实现。
  • asset/source 导出资源的源代码。之前通过使用 raw-loader 实现。
  • asset 在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用 url-loader,并且配置资源体积限制实现。

相关文章

  • Webpack 入门教程

    Webpack 是一个前端资源加载/打包工具。 安装 Webpack 使用 cnpm 安装 webpack: 创建...

  • vue-cli 优化

    1.分析影响加载速度的原因 查看资源加载时间,分析是哪些资源加载缓慢 2.利用webpack-bundle-ana...

  • webpack打包

    Webpack入门指南 一、什么是 webpack? webpack是一款模块加载器兼打包工具,它能把各种资源,例...

  • 20-webpack 加载字体优化

    在 08-webpack加载字体 中,使用 file-loader 可以加载字体资源。 通过 url-loader...

  • webpack 源码-资源加载

    准备编译的代码资源 一共四个文件资源 webpack 资源加载 - 主流程 1.Compiler.js - run...

  • webpack

    一.webpack的一些理解 1.什么是webpack webpack是一款模块加载器兼打包工具,它把各种资源,例...

  • Webpack笔记一

    webpack webpack是模块加载器兼打包工具,它可以把各种资源,如js、less/sass、图片等做为模块...

  • webpack

    loader 是webpack的核心工作原理,通过这些资源加载器,完成webpack的打包工作plugin相当于挂...

  • 初识webpack

    webpack初识 webpack是什么? 前端资源加载/打包工具。根据模块的依赖关系进行静态分析,将模块按照指定...

  • 19-webpack 加载图片优化

    在 07-webpack加载图片 中,有2中方式可以加载图片资源 通过 JavaScript ,使用 file-l...

网友评论

      本文标题:Webpack 5(八)加载资源

      本文链接:https://www.haomeiwen.com/subject/cexcidtx.html