前言
通常webpack打包我们需要新建一个webpack.config.js文件去配置一些打包的处理,例如去定义打包的主入口文件和出口文件等等
新建webpack.config.js文件
module.exports = {
}
打包入口entry
module.exports = {
entry:'./src/a.js',
//多入口打包
entry:{
index:'./src/a.js',
other:'./src/other.js'
},
}
这里我们使用./src/a.js文件作为我们打包的主入口模块,而other为多入口打包
打包出口output
module.exports = {
entry:'./src/a.js'
output: {
filename: 'bundle.js',//打包的文件名
//当入口为多入口打包的时候,我们的打包文件名也要区分
filename:'[name].js', //其中name为入口的属性名
path: path.resolve(__dirname,'output')//打包的文件(注意这里需要使用绝对路径)
}
}
这样打包后的文件就存储在了output文件下了,当入口为多入口打包的时候,我们的打包文件名也要区分filename:'[name].js'
插件:plugin
插件(plugins):可以用于执行范围更广的任务。从打包优化和压缩,一直到重新定义环境中的变量等。通俗来说就是扩展webpack功能的.
例如html-webpack-plugin插件:他的作用就是根据模版产生一个打包后的html
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/sum.js',
output: {
filename: 'bundle.js',//打包的文件名
path: path.resolve(__dirname,'output')//打包的文件(注意这里需要使用绝对路径)
},
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html', //模版
filename:'bundle.html',//根据模版产生一个打包后的html的文件名
})
]
}
这样就自动打包就产生了一个bundle.html文件,它里面引入了bundle.js文件,可以在浏览器中运行
而对于多入口的插件,我们在产生打包后的html文件必然是多个html文件,这是我们就要new出多个HtmlWebpackPlugin事例
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
let { CleanWebpackPlugin } = require('clean-webpack-plugin');
let htmlPlugins = ['index', 'other'].map(chunkName => {
return new HtmlWebpackPlugin({
filename: `${chunkName}.html`,
chunks: [chunkName]
})
})
module.exports = {
entry: {
index: './src/index.js',
other: './src/other.js'
},
output: {
filename: '[name].js',//打包的文件名
path: path.resolve(__dirname,'output')//打包的文件(注意这里需要使用绝对路径)
},
plugins: [
...htmlPlugins,
]
}
如下是打包后的目录
又例如
clean-webpack-plugin插件:可以把上次打包的出口文件夹下的冗余文件名清空
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
let { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
entry: './src/sum.js',
output: {
filename: 'bundle.js',//打包的文件名
path: path.resolve(__dirname,'output')//打包的文件(注意这里需要使用绝对路径)
},
plugins: [
new CleanWebpackPlugin(), //可以把上次打包的出口文件夹下的冗余文件名清空(默认全部清空)
new HtmlWebpackPlugin({
template: './src/index.html', //模版
minify:{
removeAttributeQuotes: true,
collapseWhitespace:true
},
filename:'bundle.html',//根据模版产生一个打包后的html的文件名
}),
]
}
devServer
devServer是开发环境下配置的,为了在开发下方便打开浏览器
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
let { CleanWebpackPlugin } = require('clean-webpack-plugin');
let htmlPlugins = ['index', 'other'].map(chunkName => {
return new HtmlWebpackPlugin({
filename: `${chunkName}.html`,
chunks: [chunkName]
})
})
module.exports = {
entry: {
index: './src/index.js',
other: './src/other.js'
},
output: {
filename: '[name].js',//打包的文件名
path: path.resolve(__dirname,'output')//打包的文件(注意这里需要使用绝对路径)
},
// devServer(开发环境下配置):
devServer: {
// 运行代码的目录
contentBase: path.resolve(__dirname, "build"),
// 为每个静态文件开启gzip压缩
compress: true,
host: "localhost",
port: 5000,
open: true, // 自动打开浏览器
hot: true, //开启HMR功能
// 设置代理
proxy: {
// 一旦devServer(5000端口)接收到/api/xxx的请求,就会用devServer起的服务把请求转发到另外一个服务器(3000)
// 以此来解决开发中的跨域问题
api: {
target: "htttp://localhost:3000",
// 发送请求时,请求路径重写:将/api/xxx --> /xxx (去掉/api)
pathRewrite: {
"^api": "",
},
},
},
},
plugins: [
new CleanWebpackPlugin(), //可以把上次打包的出口文件夹下的冗余文件名清空(默认全部清空)
...htmlPlugins,
// new HtmlWebpackPlugin({
// template: './src/index.html', //模版
// minify:{
// removeAttributeQuotes: true,
// collapseWhitespace:true
// },
// filename:'bundle.html',//根据模版产生一个打包后的html的文件名
// }),
]
}
在package.json中设置启动服务的脚本。终端中运行npm run dev
"scripts": {
"build": "webpack",
"dev":"webpack serve" //启动服务
},
loader
loader主要是为了处理打包的非JS文件和json文件。
-
处理
CSS文件需要安装
style-loadercss-loader
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
let { CleanWebpackPlugin } = require('clean-webpack-plugin');
let htmlPlugins = ['index', 'other'].map(chunkName => {
return new HtmlWebpackPlugin({
filename: `${chunkName}.html`,
chunks: [chunkName]
})
})
module.exports = {
entry: {
index: './src/index.js',
other: './src/other.js'
},
output: {
filename: '[name].js',//打包的文件名
path: path.resolve(__dirname,'output')//打包的文件(注意这里需要使用绝对路径)
},
plugins: [
new CleanWebpackPlugin(), //可以把上次打包的出口文件夹下的冗余文件名清空(默认全部清空)
...htmlPlugins,
],
module: {
rules: [
{ test: /\.css$/i, use: ['style-loader','css-loader'] },
{ test: /\.css$/i,
use: ['style-loader',{
loader:'css-loader',
options:{
modules:true;//实现css模块化
},
//loader分为三类:前置loader(pre),后置loader(post),普通loader
enforce:'pre'
}] };
],
}
}
-
处理
css样式前缀需要安装
postcss-preset-envpostcss-loader
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
let { CleanWebpackPlugin } = require('clean-webpack-plugin');
let htmlPlugins = ['index', 'other'].map(chunkName => {
return new HtmlWebpackPlugin({
filename: `${chunkName}.html`,
chunks: [chunkName]
})
})
module.exports = {
entry: {
index: './src/index.js',
other: './src/other.js'
},
output: {
filename: '[name].js',//打包的文件名
path: path.resolve(__dirname,'output')//打包的文件(注意这里需要使用绝对路径)
},
plugins: [
new CleanWebpackPlugin(), //可以把上次打包的出口文件夹下的冗余文件名清空(默认全部清空)
...htmlPlugins,
],
module: {
rules: [
{ test: /\.css$/i, use: ['style-loader','css-loader'] },
{ test: /\.css$/i,
use: ['style-loader',{
loader:'css-loader',
options:{
modules:true;//实现css模块化
},
//loader分为三类:前置loader(pre),后置loader(post),普通loader
enforce:'pre'
},'postcss-loader'] };
],
}
}
这里还需要再配置postcss.config.js文件
module.exports = { plugins: [require('autoprefixer')] }
- 处理
less文件 需要安装lessless-loader
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
let { CleanWebpackPlugin } = require('clean-webpack-plugin');
let htmlPlugins = ['index', 'other'].map(chunkName => {
return new HtmlWebpackPlugin({
filename: `${chunkName}.html`,
chunks: [chunkName]
})
})
module.exports = {
entry: {
index: './src/index.js',
other: './src/other.js'
},
output: {
filename: '[name].js',//打包的文件名
path: path.resolve(__dirname,'output')//打包的文件(注意这里需要使用绝对路径)
},
plugins: [
new CleanWebpackPlugin(), //可以把上次打包的出口文件夹下的冗余文件名清空(默认全部清空)
...htmlPlugins,
],
module: {
rules: [
{ test: /\.less$/i, use: ['style-loader', {
loader:'css-loader',//处理import和url
options:{
importLoaders:3 //import导入之前需要经过几个处理
}
}, {
loader:'postcss-loader', //处理前缀
options:{
postcssOptions:{
plugins:['autoprefixer']
}
}
},{
loader:'px2rem-loader' //可以把px单位变成rem
options:{
remUnit:75,//1rem对应75px
remPrecesion:8 //计算后的小数精度8位
}
}, 'less-loader'] }
],
}
}
-
处理图片打包的
- 当图片过大时,使用
file-loader插件,需要安装filefile-loader
- 当图片过大时,使用
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
let { CleanWebpackPlugin } = require('clean-webpack-plugin');
let htmlPlugins = ['index', 'other'].map(chunkName => {
return new HtmlWebpackPlugin({
filename: `${chunkName}.html`,
chunks: [chunkName]
})
})
module.exports = {
entry: {
index: './src/index.js',
other: './src/other.js'
},
output: {
filename: '[name].js',//打包的文件名
path: path.resolve(__dirname, 'output')//打包的文件(注意这里需要使用绝对路径)
},
plugins: [
new CleanWebpackPlugin(), //可以把上次打包的出口文件夹下的冗余文件名清空(默认全部清空)
...htmlPlugins,
],
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader','less-loader','postcss-loader'
]
},
{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'postcss-loader','less-loader']
},
{
test: /\.(eot|svg|woff2|woff|ttf)/i, //一般像icon字体图标我们一般不把他们转换成base64
use: {
loader: 'file-loader',
}
}
]
}
}
2.当图片过小时,我们通常把其转换为base64形式。需要安装的插件url-loader
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
let { CleanWebpackPlugin } = require('clean-webpack-plugin');
let htmlPlugins = ['index', 'other'].map(chunkName => {
return new HtmlWebpackPlugin({
filename: `${chunkName}.html`,
chunks: [chunkName]
})
})
module.exports = {
entry: {
index: './src/index.js',
other: './src/other.js'
},
output: {
filename: '[name].js',//打包的文件名
path: path.resolve(__dirname, 'output')//打包的文件(注意这里需要使用绝对路径)
},
plugins: [
new CleanWebpackPlugin(), //可以把上次打包的出口文件夹下的冗余文件名清空(默认全部清空)
...htmlPlugins,
],
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader','less-loader','postcss-loader'
]
},
{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'postcss-loader','less-loader']
},
{
test: /\.(jpg|png|webp|jpeg|gif|ico)/i,
use: {
loader: 'url-loader',
options: {
limit: 2000000,//大小在此限制范围内会转换成base64
name: 'img/[name].[ext]',
outputPath: 'img',//输出到某个文件夹中
// publicPath: 'http://www.zhufeng'//增加访问前缀
}
}
}
]
}
}
- 处理
html文件带图片的情况 需要安装html-withimg-loader
module={
rules:[
{
test: /\.html/,
use:'html-withimg-loader'
},
]
}
- 处理
JS文件 需要安装babel-loader@babel/core@babel/preset-env@babel/runtime@babel/plugin-transform-runtime@babel/runtime-corejs2``@babel/plugin-proposal-decoratorscore-js@3
module={
rules:[
{
test: /\.js$/i,
use: {
loader: 'babel-loader',//.babelrc
options: {
//帮你转换高版本的api语法
//不使用这种方式 你可以在代码中引进@babel/pollyfill
//装饰器不支持(@babel/plugin-proposal-decorators)
presets: [['@babel/preset-env', {
useBuiltIns: 'usage',//只转换使用的api
corejs: { version: 3 } //`core-js@3`
}]],
plugins: [
['@babel/plugin-proposal-decorators', {
'legacy': true
}],
['import',{libraryName:'antd'},style:'css']
]//装饰器 类的属性
// plugins: ['@babel/plugin-transform-runtime']//将公共方法提到一起去
},
},
exclude: /node_modules/,
include: path.resolve(__dirname, './src'),
}
]
}
- 校验代码规范
eslint需要安装eslint-loaderts-loader
js处理
module={
rules:[
{
test:/\.js$/,
use:'eslint-loader',
enforce:pre//默认在编译之前校验
}
]
}
ts处理
module={
rules:[
{
test:/\.ts$/,
use:'ts-loader'
}
]
}
optimization
- 压缩
JS,CSS(适用于生产环境)
let path = require('path');
let HtmlWebpackPlugin = require('html-webpack-plugin');
let { CleanWebpackPlugin } = require('clean-webpack-plugin');
let htmlPlugins = ['index', 'other'].map(chunkName => {
return new HtmlWebpackPlugin({
filename: `${chunkName}.html`,
chunks: [chunkName]
})
})
module.exports = {
entry: {
index: './src/index.js',
other: './src/other.js'
},
output: {
filename: '[name].js',//打包的文件名
path: path.resolve(__dirname,'output')//打包的文件(注意这里需要使用绝对路径)
},
plugins: [
new CleanWebpackPlugin(), //可以把上次打包的出口文件夹下的冗余文件名清空(默认全部清空)
...htmlPlugins,
],
module: {
rules: []
},
<!-- 处理js -->
<!-- npm install terser-webpack-plugin --save-dev -->
<!-- 处理css -->
<!-- npm install css-minimizer-webpack-plugin --save-dev-->
optimization: {
minimizer: [
new TerserPlugin(),
new CssMinimizerPlugin()
],
},
}