Webpack - loader

Loader

处理顺序从下往上

css-loader

使用方式
1. 内联方式
import "css-loader!../css/index.css"
// 直接在引入时使用,使用!分开
2. CLI方式(Webpack5中不再使用)
// package.json
"scripts":{
	"build": "webpack --module-bind 'css=style-loader'!css-loader'"
}
3. 配置方式
// webpack.config.js
module: {
	// 规则使用正则表达式定义规则
	// 
	rules:[
		{
			test: /\.css$/, // 匹配规则
			use:[
				{ loader: "css-loader", options: {} }
				// 简写 => 传入字符串
				// "css-loader"
			],
			// 只使用一个loader, 不使用use  => 简写
			// loader: "css-loader"
		}
	]
}

less-loader

// webpack.config.js
module: {
	// 规则使用正则表达式定义规则
	// 
	rules:[
		{
			test: /\.less$/, // 匹配规则
			use:[
				"style-loader"
				"css-loader",
				"less-loader"
			]
		}
	]
}

多次加载

// webpack.config.js
module: {
	rules:[
		{
			test: /\.css$/,
			use:[
				"style-loader",
				{
					loader: "css-loader",
					options: {
						importLoaders: 1 // 调用前面的loader次数
					}
				}
			]
		}
	]
}

静态资源

图片

file-loader
  • 处理通过import / require 引入的文件
  • 将图片重命名并放在打包目录下
img.src = require('./image/01.jpg')
// 或
import img01 from './image/01.jpg'
img.src = img01 

自定义名称

// package.json
{
	test: /\/(png|je?pg)$/,
	use:[
		{
			loader: file-loader,
			options: {
				name: "img/[name].[hash:6].[ext]"
				// placeholder
				// [ext] [name] [hash] [contentHash]
				// [hash<length>]
			}
		}
	]
}
url-loader
  • 类似于 file-loader
  • 可以将较小的文件转为base64
// package.json
{
	test: /\/(png|je?pg)$/,
	use:[
		{
			loader: url-loader,
			options: {
				name: "img/[name].[hash:6].[ext]",
				limit: 100 * 1024 // 单位 Bit
			}
		}
	]
}

文本

raw-loader
file-loader

webpack5

asset module type
  • webpack5之前需要 loader加载指定资源
  • webpack5 开始,可以使用资源模块类型代替loader
  • asset/resource
    file-loader
  • asset/inline
    url-loader
  • asset/source
    row-loader
  • asset
    自动选择是否转换 base64
asset/resource
// package.json

// asset/resource类型 -- file-loader的效果
{
	test: /\/(png|je?pg)$/,
	type: "asset/resource",
	generator : { //设置输出路径
		filename:"img/[name].[hash:6][ext]"
	}
}

// 设置输出路径和名称
// 最外层
output: {
	assetModuleFileName: "img/[name].[hash:6][ext]"  // 静态文件都使用
}
asset/inline
// package.json

// asset/inline类型 -- url-loader的效果
{
	test: /\/(png|je?pg)$/,
	type: "asset/inline"
}
asset
// package.json

// asset类型 -- url-loader的效果
// 限制文件大小,打包为文件或dataUrl
{
	test: /\/(png|je?pg)$/,
	type: "asset",
	generator : { //设置输出路径
		filename:"img/[name].[hash:6][ext]"
	},
	parser: {
		dataUrlCondation: {
			maxSize: 100*1024
		}
	}
}
asset/resource

字体文件

{
   test: /\.ttf|eot|woff2?$/i,
   type: "asset/resource",
   generator: {
     filename: "font/[name].[hash:6][ext]"
   }
}

示例

const path = require('path');

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    // 必须是一个绝对路径
    path: path.resolve(__dirname, "./build"),
    // assetModuleFilename: "img/[name].[hash:6][ext]"
  },
  module: {
    rules: [
      {
        // 规则使用正则表达式
        test: /\.css$/, // 匹配资源
        use: [
          // { loader: "css-loader" },
          // 注意: 编写顺序(从下往上, 从右往做, 从后往前)
          "style-loader", 
          {
            loader: "css-loader",
            options: {
              importLoaders: 1
            }
          },
          "postcss-loader"
        ],
        // loader: "css-loader"
      },
      {
        test: /\.less$/,
        use: [
          "style-loader",
          {
            loader: "css-loader",
            options: {
              importLoaders: 2
            }
          },
          "postcss-loader",
          "less-loader"
        ]
      },
      {
        test: /\.(png|jpe?g|gif|svg)$/,
        // type: "asset/resource", file-loader的效果
        // type: "asset/inline", url-loader
        type: "asset",
        generator: {
          filename: "img/[name].[hash:6][ext]"
        },
        parser: {
          dataUrlCondition: {
            maxSize: 100 * 1024
          }
        }
      },
      {
        test: /\.ttf|eot|woff2?$/i,
        type: "asset/resource",
        generator: {
          filename: "font/[name].[hash:6][ext]"
        }
      }
    ]
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值