1、babel-loader: es6 转es5。 需要安装 babel-loader 和 @babel/core和 babel-preset-latest
2、css-loader:使得webpack可以处理css文件,style-loader 将处理好的css文件新建一个<style>标签插入<head>中,less-loader或者sass-loader等处理预处理文件。postcss-loader处理浏览器兼容。
3、html-loader、vue-loader等处理模板文件
4、file-loader、url-loader、image-loader 处理图片,其中image-loader可以压缩图片。
安装image-webpack-loader:
https://www.npmjs.com/package/image-webpack-loader
npm install image-webpack-loader --save-dev
webpack.config.js
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); module.exports = { entry: './src/app.js', output: { filename: 'js/[name].bundle.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.js$/, loader: 'babel-loader', // 排除 exclude: /node_modules/, query: { presets: ["@babel/preset-env"] } }, { test: /\.html$/, loader: 'html-loader' }, { test: /\.tpl$/, loader: 'ejs-loader' }, { test: /\.css$/, use: [ 'style-loader', // 用来处理css中引入的css { loader: 'css-loader', options: { importLoaders: 1 } }, { loader: 'postcss-loader', options: { ident: 'postcss', plugins: [ require('autoprefixer')({ broswers: ['last 5 versions'] }), ] } } ] }, { test: /\.less$/, use: [ 'style-loader', // 用来处理css中引入的css 'css-loader', { loader: 'postcss-loader', options: { ident: 'postcss', plugins: [ require('autoprefixer')({ broswers: ['last 5 versions'] }), ] } }, { loader: 'less-loader'} ] }, { test: /\.scss$/, use: [ 'style-loader', // 用来处理css中引入的css 'css-loader', { loader: 'postcss-loader', options: { ident: 'postcss', plugins: [ require('autoprefixer')({ broswers: ['last 5 versions'] }), ] } }, { loader: 'sass-loader'} ] }, { test: /\.(png|jpg|gif|svg)$/i, use: [ { loader: 'url-loader', options: { limit: 200000, name: 'assets/[name]-[hash:5].[ext]' } }, { loader: 'image-webpack-loader', options: { disable: true } } ], } ] }, plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ filename: 'index.html', // html 标题 title: 'this is a.html', // 使用模板 template: 'index.html', // script标签插入位置 inject: 'body' }), ], };
安装url-loader:
npm install url-loader --save-dev
webpack.config.js
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); module.exports = { entry: './src/app.js', output: { filename: 'js/[name].bundle.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.js$/, loader: 'babel-loader', // 排除 exclude: /node_modules/, query: { presets: ["@babel/preset-env"] } }, { test: /\.html$/, loader: 'html-loader' }, { test: /\.tpl$/, loader: 'ejs-loader' }, { test: /\.css$/, use: [ 'style-loader', // 用来处理css中引入的css { loader: 'css-loader', options: { importLoaders: 1 } }, { loader: 'postcss-loader', options: { ident: 'postcss', plugins: [ require('autoprefixer')({ broswers: ['last 5 versions'] }), ] } } ] }, { test: /\.less$/, use: [ 'style-loader', // 用来处理css中引入的css 'css-loader', { loader: 'postcss-loader', options: { ident: 'postcss', plugins: [ require('autoprefixer')({ broswers: ['last 5 versions'] }), ] } }, { loader: 'less-loader'} ] }, { test: /\.scss$/, use: [ 'style-loader', // 用来处理css中引入的css 'css-loader', { loader: 'postcss-loader', options: { ident: 'postcss', plugins: [ require('autoprefixer')({ broswers: ['last 5 versions'] }), ] } }, { loader: 'sass-loader'} ] }, { test: /\.(png|jpg|gif|svg)$/i, loader: 'url-loader', query: { limit: 300000, name: 'assets/[name]-[hash:5].[ext]' } } ] }, plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ filename: 'index.html', // html 标题 title: 'this is a.html', // 使用模板 template: 'index.html', // script标签插入位置 inject: 'body' }), ], };
处理图片文件:
npm install file-loader --save-dev
layer.less:
@import "modal.less"; .layer { width: 600px; height: 200px; background-color: green; div { width: 400px; height: 100px; background: url('../../assets/bg.png'); } }
webpack.config.js:
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); module.exports = { entry: './src/app.js', output: { filename: 'js/[name].bundle.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.js$/, loader: 'babel-loader', // 排除 exclude: /node_modules/, query: { presets: ["@babel/preset-env"] } }, { test: /\.html$/, loader: 'html-loader' }, { test: /\.tpl$/, loader: 'ejs-loader' }, { test: /\.css$/, use: [ 'style-loader', // 用来处理css中引入的css { loader: 'css-loader', options: { importLoaders: 1 } }, { loader: 'postcss-loader', options: { ident: 'postcss', plugins: [ require('autoprefixer')({ broswers: ['last 5 versions'] }), ] } } ] }, { test: /\.less$/, use: [ 'style-loader', // 用来处理css中引入的css 'css-loader', { loader: 'postcss-loader', options: { ident: 'postcss', plugins: [ require('autoprefixer')({ broswers: ['last 5 versions'] }), ] } }, { loader: 'less-loader'} ] }, { test: /\.scss$/, use: [ 'style-loader', // 用来处理css中引入的css 'css-loader', { loader: 'postcss-loader', options: { ident: 'postcss', plugins: [ require('autoprefixer')({ broswers: ['last 5 versions'] }), ] } }, { loader: 'sass-loader'} ] }, { test: /\.(png|jpg|gif|svg)$/i, loader: 'file-loader', query: { name: 'assets/[name]-[hash:5].[ext]' } } ] }, plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ filename: 'index.html', // html 标题 title: 'this is a.html', // 使用模板 template: 'index.html', // script标签插入位置 inject: 'body' }), ], };
image-webpack处理图片压缩。多个loaders可以使用数组混合使用,也是从右边至左边,就是数组最后一个开始。也可以使用!连接
url-loader设定20k限制,小于就转化base64
模板中使用相对路径图片的写法
file-loader处理图片文件
使用webpack@3.x的配置如下:
const config ={}
config.module.rules.push({
/\.(gif|jpg|jpeg|png|svg)$/i,
use: [
{
loader: 'url-loader',
options: {
limit: 2000,
name: '[name].[ext]'
}
},
{
loader: 'image-webpack-loader',
options: {
// bypassOnDebug:true,//webpack@1.x
disable: true
}
}
]
})
问题:安装image-webpack-loader成功,为何压缩图片不成功?
对css样式中引入的图片文件(如设置背景的图片)或在根目录下的index.html中通过img标签引入的图片进行打包:
图片路径设置为相对路径如:./../img.jpg
安装file-loader:npm install file-loader --save-dev
添加loader:
最后再打包
在模板中引用图片:除了安装和配置loader方法一样时,注意在模板中引用图片的路径要进行特殊的设置,如下:
打包后图片输出的其他设置:
url-loader的使用:
使用场景:当文件大小大于了设置的限制大小,则图片就交由file-loader进行处理;当图片大小低于限制大小,就会将图片转为base64编码,不再是一个url(不再是一个http请求),图片会被打包进html,css,js
如何使用:
首先安装:npm install url-loader --save-dev
引用:
两种打包方式的比较:
通过http请求load进来。浏览器会有缓存,比较适用于重复性较高的图片。
打包成base64。任何地方要用时,都会有base64编码存在那里,会造成代码的冗余,增加代码的体积。
图片压缩 image-webpack-loader:将图片进行压缩之后在进行url或file-loader的处理
安装:npm install image-webpack-loader --save-dev
使用:
此外:image-webpack-loader还有很多关于png.jpg等图片文件优化处理的设置,具体可以查看github上的image-webpack-loader官网可以看到
url-loader会在小于limit设置的大小时,生成base64
在模板中应用相对路径打包处理