webpack可使用各类不一样loader来预处理不一样格式的资源。css
// src/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<title>Page Title</title>
<meta name='viewport' content='width=device-width, initial-scale=1'>
</head>
<body>
<div class="box"></div>
</body>
</html>
复制代码
// src/css/style.css
.box{
width:50px;
height: 50px;
background-color: pink;
}
复制代码
css-loader
和style-loader
css-loader
负责读取css文件,而后使用style-loader
将css内容注入到js里面去,最终是以style标签的形式嵌入到Html代码中npm i -D css-loader style-loader
module:
{
test: /\.css$/,
use: [
{
loader:'style-loader', //以style标签的形式嵌入到html中
options:{
insertAt:top //嵌入位置,top指顶部,不会覆盖掉html自带的style样式
}
}
'css-loader' //解析css文件
]
},
复制代码
module使用方法:html
rules
:一个数组,存放各类Loadertest
:正则表达式,用来匹配不一样的文件名后缀loader
:有多种使用方法{
test:/\.js$/,
loader:'babel-loader' //只有一个loader时
}
{
test:/\.css$/,
use:['style-loader','css-loader'] //多个loader,从右往左加载
}
{
test:/\.css$/,
use:[
'style-loader', //多个loader混合使用
{ //loader要设置相关参数时可使用对象
loader:'css-loader',
options:{
minimize:true
}
}
]
}
复制代码
使用css-loader
+style-loader
的方式是将样式打包进js
文件,而后以style
标签的形式嵌入页面。css
样式与js
文件混在一块儿可能致使一些样式混乱,因此使用插件将css
样式统一打包进一个cs
s文件,而后以link
标签的形式嵌入页面进行资源请求。
webpack3
一般使用的是ExtractWebpackPlugin
,但在webpack4中已再也不支持,官方推荐使用MiniCssExtractPlugin
进行替代。
首先安装 :
npm i -D mini-css-extract-plugin
修改配置文件webpack
const miniCssExtractPlugin=require('mini-css-extract-plugin');
module.exports = {
entry: path.join(__dirname, 'src/index.js'),
output: {
path: path.join(__dirname, 'dist'),
filename:'bundle.js',
},
module: {
rules:[
{
test: /\.css$/,
use: [
{
loader:miniCssExtractPlugin.loader
},
'css-loader'
]
}
]
},
plugins: [
new htmlWebpackPlugin({
template:'./src/index.html'
}),
new miniCssExtractPlugin({
filename:'[name].css' //输出的css文件名,放置在dist目录下
})
]
}
复制代码
打开dist/index.html,能够看到以link形式引入了css样式。es6
咱们但愿能够给css自动添加浏览器前缀,可使用插件autoprefixer
.web
npm i -D postcss-loader autoprefixer
postcss-loader
须要一个配置文件,在根目录下新建postcss.config.js
文件,写入:module.exports={
plugins:[require('autoprefixer')]
}
复制代码
// webpack.config.js
{
test: /\.css$/,
use: [
{
loader:miniCssExtractPlugin.loader //抽离成一个css文件
},
'css-loader', //解析css
'postcss-loader' //先添加前缀
]
}
复制代码
// src/css/style.css
.box{
width:50px;
height: 50px;
background-color: pink;
transform: rotateX(30deg);
}
复制代码
npm run build
后,打开dist/main.css
,能够看到tranform已经加上了webkit前缀。使用optimize-css-assets-webpack-plugin
插件来压缩css代码。正则表达式
npm i -D optimize-css-assets-webpack-plugin
// webpack.config.js
const opimizeCss=require('optimize-css-assets-webpack-plugin');
module.exports = {
optimization:{
minimizer:[
new opimizeCss()
]
},
mode:'production'
....
}
复制代码
uglifyjs-webpack-plugin
来压缩js代码。npm i -D uglifyjs-webpack-plugin
//webpack.config.js
const uglifyJsWebpackPlugin=require('uglifyjs-webpack-plugin')
module.exports = {
optimization:{
minimizer:[
new uglifyJsWebpackPlugin({
cache:true, //是否缓存
parallel:true, //是否并发打包,同时打包多个文件
sourceMap:true //打包后的代码与源码的映射,方便调试
})
...
]
...
}
复制代码
webpack里面使用了大量的es6语法,咱们须要转换为es5,使用babel来完成此功能。npm
npm i -D babel-loader @babel/core @babel/preset-env
{
test:/\.js$/,
use:[
{
loader:'babel-loader',
options:{
presets:[
`@babel/preset-env` //es6转es5
]
}
}
]
}
复制代码
(1)引入的图片须要在入口的js文件中import进去数组
// index.js
import img from './img/big.jpg'; //file-loader将该图片放入到dist下,同时返回图片的地址
var imgElement = document.createElement('img');
imgElement.src = img;
document.body.appendChild(imgElement);
复制代码
(2)安装file-loader
并配置 npm i -D file-loader
浏览器
// webpack.config.js
{
test: /\.(png|jpg|gif|svg|jpeg)$/,
loader: 'file-loader',
}
复制代码
与js引入图片用法相同,不过比起file-loader
,更经常使用的是url-loader
,能够将小图片直接base64编码,减小http请求。 (1)安装url-loader
并配置 npm i -D url-loader
缓存
// webpack.config.js
{
test: /\.(png|jpg|jpeg|gif|svg)$/,
loader: 'url-loader',
options: {
limit: 1024, //小于该值的图片会使用base64编码
name: '[name].[hash:8].[ext]' //打包后的图片名称 [ext]指图片格式
}
}
复制代码
// src/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<title>Page Title</title>
<meta name='viewport' content='width=device-width, initial-scale=1'>
</head>
<body>
<div class="box"></div>
<img src="./img/big.png">
</body>
</html>
复制代码
打包后发现该图片的地址是写死的,并不会相对于dist,致使没法找到该图片,使用html-withimg-loader
来处理html中的图片。
安装并配置 npm i -D html-withimg-loader
// webpack.config.js
{
test:/\.html$/,
loader:'html-withimg-loader'
}
复制代码
再次打包运行后发现能够正确加载图片了。
如今这种配置下,全部的资源都放置在dist目录下,看起来很混乱,咱们但愿js在js文件夹下,css在css文件夹下,图片在img文件夹下,修改相关配置。
//webpack.config.js
module.exports = {
entry: path.join(__dirname, 'src/index.js'),
output: {
path: path.join(__dirname, 'dist'),
filename:'js/bundle.js', //给打包输出的js添加一层目录
},
module: {
rules:[
{
test: /\.css$/,
use: [
{
loader:miniCssExtractPlugin.loader
},
'css-loader',
'postcss-loader'
]
},
{
test:/\.js$/, //最后会打包进输出的js的文件,因此不须要配置路径
use:[
{
loader:'babel-loader',
options:{
presets:[
`@babel/preset-env`
]
},
}
]
},
{
test: /\.(png|jpg)$/,
loader: 'url-loader',
options: {
limit: 10000,
name: '[name].[hash:8].[ext]',
//不能经过名字添加路径,由于背景图片还会被css处理一次,会再添加上css的路径
//最后就会变成 css/img/big.1763821.png
outputPath:'img/', //经过该属性设置,打包输出的路径多一层
publicPath:'http://cdn.com' //图片的访问路径为 http://cdn.com/img/big.561361.png
},
},
{
test:/\.html$/,
loader:'html-withimg-loader', //会加上url-loader里的outputPath
}
]
},
plugins: [
new htmlWebpackPlugin({
template:'./src/index.html'
}),
new miniCssExtractPlugin({
filename:'css/[name].css' //经过名字添加一层路径
}),
new cleanWebpackPlugin()
]
}
复制代码
最终npm run build后,就能够有不一样的文件夹,同时index.html也正确处理了路径。