webpack最佳入门实践系列(3)
6.使用图片
6.1.尝试在css中引入图片
在src目录下新建css文件夹,并且在css文件夹下创建app.css文件,在src目录下新建images文件夹,放入一张图片,在app.css中引入这张图片
body{
background: url('../images/nodeing.jpg')
}
在index.js文件中引入app.css这个模块
import module_1 from './module_1'
import module_2 from './module_2'
import module_3 from './module_3' document.write("hello world")
import "./index.css"
import "./css/app.css" module_1()
module_2()
module_3()
在命令行中通过 npm start运行,查看结果,命令行中会报以下错误
ERROR in ./src/images/nodeing.jpg
Module parse failed: Unexpected character '�' (1:0)
You may need an appropriate loader to handle this file type.
(Source code omitted for this binary file)
@ ./node_modules/css-loader!./src/css/app.css 6:57-89
@ ./src/css/app.css
@ ./src/index.js
@ multi (webpack)-dev-server/client?http://localhost:8080 ./src/index.js
通过报错信息,我们大体上知道了报错的原因,那就是webpack无法处理.jpg格式的文件,告诉我们可能需要另一个loader来处理它,我们用来处理图片的loader叫做 file-loader
6.2.使用file-loader
安装file-loader
npm install file-loader --save-dev
修改webpack.config.js配置文件,增加file-loader配置项目
const path = require("path") const HtmlWebpackPlugin = require("html-webpack-plugin") module.exports = {
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'app.js'
},
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html'
})
],
devServer: {
open: true,
contentBase: './dist'
},
module: {
rules: [
// 处理css文件的配置
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
// 处理jpg图片的配置
{
test: /\.jpg$/,
use: ['file-loader']
}
]
} }
再次通过npm start命令来运行,查看结果,我们的配置已经生效,现在webpack就已经拥有了处理jpg图片的能力了
6.3.file-loader做了哪些事情呢?
因为webpack-dev-server是打包在内存中运行的,并没有输出文件,所以,我们需要通过npm run dev命令来把文件打包出来,再去查看打包的结果,下图是打包后项目目录结构:
从图中可以看出dist目录下多了一个.jpg的文件,但是这个文件并不和我们原来的图片同名,原图为nodeing.jpg
从这里,我们知道了file-loader做了两件事情:
- 把图片复制到了输出目录(dist)中
- 自动处理url后面的文件路径,把图片重命名了,例如:9b822cdc77066b81bdde5c68936a0857.jpg,得到一个最终引用的路径
当我们试图在index.js中手动通过import引入一张图片的时候,返回的结果其实就是文件的路径:
import imgsrc from './images/nodeing.jpg'
console.log(imgsrc) //输出:9b822cdc77066b81bdde5c68936a0857.jpg
6.4.支持多种类型的图片
为了支持多种类型的图片,例如:png,gif等,我们还需要去修改一下配置文件,在file-loader配置项中增加图片类型
{
test: /\.(jpg|png|gif|bmp|webp)$/,
use: ['file-loader']
}
6.5.使用url-loader
url-loader是对file-loader的上层封装,你可以理解为是file-loader的增强版
安装url-loader
npm install url-loader --save-dev
上面我们说url-loader是对file-loader的上层封装,我们现在来测试一下,把我们配置好的file-loader项改成url-loader
{
test: /\.(jpg|png|gif|bmp|webp)$/,
use: ['url-loader']
}
然后我们通过npm start来启动服务器,通过chrome的调试工具,我们查看到,url和file-loader打包出来的不同了
body {
background: url(data:image/jpeg;base64,/9j/4Q
+6RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUA…/O
+auez6MoVJxBPMdi/hSIT9Yk8OVQ/wDLCO8OXhP0boZ5ZhE09mcN4H5A3bhxjd2/FP8Af//Z);
}
我们可以看到,url已经变成了base64编码的一串字符串,那么什么是base64编码呢?
base64编码是一种基于64个可打印字符来表示二进制数据的表示方法,图片的base64编码就是可以将一副图片编码成一串字符串,使用这个字符串来代替图片地址
那么,这样做有什么意义呢?
我们所看到的网页上的每一个图片,都需要消耗一个http请求下载而来,所以有时候我们会把很多小图标合在一张图片上使用,目的就是为了减少http请求,但是不管怎样,图片的下载都是需要向服务器发送http请求的,要是图片下载不需要向服务器下载请求那就太棒了,base64编码解决的就是这个问题
接下来,运行一下打包的命令,查看一下效果
npm run dev
我们再次去查看dist目录,发现下面并没有生成新的图片,这个是因为url-loader已经把图片转成base64的字符串了,我们打开浏览器控制台,查看我们输出的图片路径:
data:image/jpeg;base64,/9j/4Q+6RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAY
gEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAiAAAAcgEyAAIAAAAUAAAAlIdpAAQAAAABAAAAqAAAA
NQACvyAAAAnEAAK/IAAACcQQWRvYmUg
你会发现被编码过后的图片,会用非常长的字符串来表示,这会让你加载的文件变得非常的大,这样反而得不偿失达不到优化的效果,因此,我们需要一种方案,这种方案就是当图片非常大的时候,我们还是让它发送请求来下载,当图片比较小的时候,我们就把图片进行编码,这样就符合我们的预期了。这样的方案url-loader已经帮我们搞定了,我们需要去修改webpack.config.js中的配置
{
test: /\.jpg|.png|.gif|.bmp|.webp$/,
use: [{
loader: 'url-loader',
options: {
limit: 10240
}
}]
}
其中,我们为URL-loader增加了配置选项limit,limit给大值是一张图片是否被编码成base64的分界线,以我们配置的10240为例,这里的单位是字节,10240是10kb,当图片小于10kb的时候会被编码成base64,当图片大于10kb就会被打包输出,我们使用的nodeing.jpg大小为64kb,所以当前limit的设置,不会将nodeing.jpg这张图片打包,大家可以把limit更改一下来试试效果
webpack最佳入门实践系列(3)的更多相关文章
- webpack最佳入门实践系列(6)
10.css模块化 10.1.什么是css模块? CSS模块就是所有的类名都只有局部作用域的CSS文件,当你在一个JavaScript模块中导入一个CSS文件时,CSS模块将会定义一个对象,将文件中类 ...
- webpack最佳入门实践系列(5)
9.路径相关 原来我们打包的东西都存放到了dist目录下,并没有进行分类存储,乱成一团,这一节我们就要处理一下打包的路径,让打包后的目录看起来更加优雅 9.1.代码准备 我们先建立起这样一个目录结构 ...
- webpack最佳入门实践系列(4)
7.使用字体 7.1.安装字体库-font-awesome 我们通过npm来安装字体 npm install font-awesome --save 这个时候,我们的package.json配置文件变 ...
- webpack最佳入门实践系列(2)
3.插件 在前端迅速发展的今天,许多没有太多技术含量并且感觉是在浪费时间的事情,就可以交给构建工具来做,例如:我们去手动创建index.html,手动引入打包好的js文件等操作,都可以叫个webpac ...
- webpack最佳入门实践系列(1)
1.webpack简介 webpack 是一个现代 JavaScript 应用程序的模块打包器(module bundler).它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源 1 ...
- webpack的入门实践,看这篇就够了
webpack的入门实践 我会将所有的读者概括为初学者,即使你可能有基础,学习本节之前我希望你具有一定的JavaScript和node基础 文中的 ... ...代表省略掉部分代码,和上面的代码相同 ...
- 【Vuejs】301- Vue 3.0前的 TypeScript 最佳入门实践
前言 我个人对更严格类型限制没有积极的看法,毕竟各类转类型的骚写法写习惯了. 然鹅最近的一个项目中,是 TypeScript+ Vue,毛计喇,学之...-真香! 1. 使用官方脚手架构建 npm i ...
- python 最佳入门实践
勿在浮沙筑高台,无论什么技术,掌握核心精神和api,是很重要的. 但是入门过程也可能不是一帆风顺的,这里有八个入门任务,看看你完成了没有: http://code.tutsplus.com/artic ...
- es6+最佳入门实践(13)
13.模块化 13.1.什么是模块化 模块化是一种处理复杂系统分解为更好的可管理模块的方式.通俗的讲就是把一个复杂的功能拆分成多个小功能,并且以一种良好的机制管理起来,这样就可以认为是模块化.就像作家 ...
随机推荐
- python--Matplotlib(一)
基础知识薄弱的同学可以看看一下博客 https://www.cnblogs.com/dev-liu/p/pandas_plt_basic.html https://blog.csdn.net/Notz ...
- dts--tests(一)
cmdline.py """ DPDK Test suite. Test cmdline. """ import utils from te ...
- python文件操作练习之文件备份
文件备份 ## 文件备份 # 打开文件 def backup(file1, file2): with open(file1, 'rb') as f1,\ open(file2, 'wb') as f2 ...
- 设置默认以管理员运行的WinForm
右键工程名, 属性; 选择"安全性"; 勾选"启用ClickOnce安全设置"与"这是完全可信的应用程序"; 退出该页面, app.mani ...
- zookeeper: web ui工具的安装
zookeeper官方没有提供web用户界面,这使很多人在使用zookeeper(动物管理员)同时,并不是很容易的理解zookeeper的数据结构,还好淘宝有位大神用Nodejs写了一个web的ui工 ...
- 12,nginx+uWSGI+django+virtualenv+supervisor发布web服务器
导论 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求) 基于wsgi运行的框架 ...
- Android 做项目总结
1.base 2.跳转可以用uihelper 3.activity和处理逻辑分开 4.userhelper保存管理用户登录信息 5.验证输入框的时候,接受的参数不要是String ,而是Edittex ...
- 确保VDI顺利部署 试点项目是关键
[TechTarget中国原创] 由于管理员没有全面测试虚拟桌面的性能表现导致无数VDI项目的最终失败,因此需要借助于试点项目来保证VDI部署的最终成功实施. VDI试点项目是从物理桌面向虚拟桌面迁移 ...
- 剑指Offer - 九度1368 - 二叉树中和为某一值的路径
剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...
- python 学习分享-socketserver
SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端.即:每个客户端请求连接到服务器时,Socket服务端都会在服务器 ...