视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
webpack-url-loader 解决项目中图片打包路径问题
2020-11-27 22:01:00 责编:小采
文档


刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不能打包进我们的目标文件夹里。

下面我们就来分析下在webpack项目中图片的应用场景。

1.CSS文件中的背景图等设置

项目目录图:

以下以我项目中的test.css为例

.test{
 color: red;
 width: 150px;
 height: 100px;
 overflow: hidden;
 background: url("../img/box@2x.png") no-repeat;
 background-size: 150px auto;
}
.img-base{
 color: red;
 width: 150px;
 height: 100px;
 overflow: hidden;
 background: url("../img/media1.png") no-repeat;
 background-size: 100px auto;
}
#img-e {
 width:100px;
}

2.html文件中引入图片,下面为模板文件index.html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>webpack-img</title>
</head>
<body>
1.css背景图 图片格式
<div class="test"></div>
2.css背景图 转化为base
<div class="img-base"></div>
3.html里引入图片
<div><img src="img/media4.png" "></div>
4.js里引入图片
</body>
</html>

3.js中引入图片

require('../css/test.css');
var imgSrc = require('../img/do.gif');

var img = new Image();
img.id = 'img-e';
img.src = imgSrc;
document.body.appendChild(img);

url-loader

在 webpack 中引入图片需要依赖 url-loader 这个加载器。

在 webpack.config.js 文件中配置如下:

{
 test:/\.(jpg|png|gif|bmp|jpeg)$/,
 loader: 'url-loader?limit=8192&name=img/[hash:8].[name].[ext]'
 }

test 属性代表可以匹配的图片类型,除了 png、jpg 之外也可以添加 gif 等,以竖线隔开即开。

loader 后面 limit 字段代表图片打包,这个并不是说超过了就不能打包,而是指当图片大小小于时会自动转成 base 码引用。上例中大于8192字节的图片正常打包,小于8192字节的图片以 base 的方式引用。

url-loader 后面除了 limit 字段,还可以通过 name 字段来指定图片打包的目录与文件名

而使用extractTextPlugin插件时,需要配置publicPath: "../", 不配置时css文件中背景图默认地址会在css文件夹下查找图片资源,导致项目图片路径不正确

webpack.config.js 配置文件如下:

const webpack = require("webpack")
const HtmlWebpackPlugin = require('html-webpack-plugin')
const extractTextPlugin = require("extract-text-webpack-plugin")

const path = require('path')
const extractCSS = new extractTextPlugin("css/[name].[hash:6].css")//
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');//压缩css插件
module.exports = {
 //注意这里是exports不是
 entry: './src/js/main.js',
 output: {
 publicPath:"./",
 path: path.resolve(__dirname + "/dist"),
 //打包后的js文件存放的地方
 filename: "js/[name].[hash:6].js" //打包后的js文件名
 },
 plugins: [
 extractCSS,
 new OptimizeCssAssetsPlugin(),//压缩css
 new webpack.optimize.UglifyJsPlugin(),//new uglify(),//压缩js
 new HtmlWebpackPlugin({
 filename: 'index.html',
 template:'src/index.html'
 })
 ],
 module: {
 rules: [ //1.0的是loaders
 //处理js中的loader
 {
 test: /\.js$/,
 loader: 'babel-loader',
 include: path.resolve(__dirname, '/src'),
 //指定打包的文件
 exclude: path.resolve(__dirname, '/node_modules') //排除打包的文件,加速打包时间
 },
 //处理css中的loader
 {
 test: /\.css$/,
 use: extractTextPlugin.extract({
 fallback: "style-loader",
 publicPath: "../",
 use: [
 {
 loader: 'css-loader',
 options:{
 minimize: true //css压缩
 }
 }
 ]
 })
 },
 //处理html模板中的loader
 {
 test: /\.html$/,
 loader: 'html-loader'
 },
 //处理ejs模板中的loader,以.tpl后缀结尾的
 {
 test: /\.tpl$/,
 loader: 'ejs-loader'
 },
 //处理图片中的loader,file-loader,url-loader,image-webpack-loader相互配合(图片格式转换base 图片压缩)
 {
 test:/\.(jpg|png|gif|bmp|jpeg)$/,
 loader: 'url-loader?limit=8192&name=img/[hash:8].[name].[ext]'
 }
 ]
 }
};

下载本文
显示全文
专题