公共路径
output:{
// 可以指定为前端域名,也可以指定为cdn域名
publickPath:"http://localhost:8080/"
}
环境变量
const path = require("path")
const HtmlWebpackPlugin = require("html-webpack-plugin")
// 将导出的对象换成一个函数
// env 为编译时输入的信息
module.export = (env) => {
return {
// 配置多入口
entry:{
index:"./src/index.js",
another:"./src/another-module.js"
},
output:{
filename:"[name].[contenthash].js",
path:path.resolve(__dirname,"./dist"),
clean:true,
assetModuleFilename:"images/[contenthash][ext]"
},
// 因为现在是一个函数了,并且有一个env对象传入
// 通过env对象动态调整mode(环境变量)的值
mode:env.production ? "production" : "development",
// devtool:"inline-source-map",
// plugins: [
// new HtmlWebpackPlugin({
// template:"./index.html",
// filename:"app.html",
// inject:"body"
// })
// ],
// 定义哪些资源文件需要打包
module:{
rules:[
// ...
]
},
// 优化插件
optimization:{
// 压缩代码
minimizer:{
new CssMinimizerPlugin(),
new TerserPlugin()
},
// 分离代码
// 配置后,将会自动把公共的代码抽离到单独的文件中
// splitChunks:{
// chunks:"all"
// }
}
}
}
打包:npx webpack —env production —env goal=local
编译的结果中有编译是输入的信息,通过这些信息确定使用那个环境
这时的文件并没有压缩(但我们可以使用terser进行压缩),这里没有起作用是因为配置了css代码压缩,如下:
如果这时还想要别的代码页压缩,就需要配置terser了,如下:
npm i terser-webpack-plugin -D
安装好后引入对应的插件
然后配置裁:
这时通过命令,在生产环境下打包:npx webpack —env production
打包后的文件将都会被压缩,
但如果通过开发模式打包:npx webpack —env development
打包后的文件是不会被压缩的
这就是配置环境变量的作用
拆分配置文件
开发环境配置文件
const path = require("path")
const HtmlWebpackPlugin = require("html-webpack-plugin")
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
const toml = require("toml")
const yoml = require("yoml")
const json5 = require("json5")
// 将导出的对象换成一个函数
// env 为编译时输入的信息
module.export =
{
// 配置多入口
entry:{
index:"./src/index.js",
another:"./src/another-module.js"
},
output:{
filename:"[name].js",
path:path.resolve(__dirname,"../dist"),
clean:true,
assetModuleFilename:"images/[contenthash][ext]"
},
mode:"development",
// 调试代码
devtool:"inline-source-map",
plugins: [
new HtmlWebpackPlugin({
template:"./index.html",
filename:"app.html",
inject:"body"
}),
new MiniCssExtractPlugin({
filename:"styles/[contenthash].css"
})
],
// 用于启动服务
devServer:{
static:"./dist"
},
// 定义哪些资源文件需要打包
module:{
rules:[
{
test:/\.png$/,
type:"asset/resource",
generator:{
filename:"images/[contenthash][ext]"
}
},
{
test:/\.svg$/,
type:"asset/inline",
},
{
test:/\.txt$/,
type:"asset/source",
},
{
test:/\.jpg$/,
type:"asset",
// 解析器
parser:{
// 定义是否生成URL的临界值,当文件大于时创建,反之生成URL
dataUrlCondition:{
maxSize:4*1024*1024
}
}
},
{
test:/\.(css|less)$/,
// 这时需要将css文件抽离,所以将不需要style-loader,替换为MiniCssExtractPlugin-loader
// 这个loader是由MiniCssExtractPlugin插件自带的
//use:[MiniCssExtractPlugin-loader,"css-loader","less-loader"]
use:[MiniCssExtractPlugin.loader,"css-loader","less-loader"]
},
{
test:/\.(woff|woff2|eot|ttf|otf)$/,
type:"asset/resource"
},
{
test:/\.(csv|tsv)$/,
type:"csv-loader"
},
{
test:/\.xml$/,
type:"xml-loader"
},
{
// 需要转换的文件
test:/\.toml$/,
// 转换后的类型
type:"json",
// 使用什么转换
parser:{
parse:toml.parse
}
},
{
// 需要转换的文件
test:/\.yoml$/,
// 转换后的类型
type:"json",
// 使用什么转换
parser:{
parse:yoml.parse
}
},
{
// 需要转换的文件
test:/\.json5$/,
// 转换后的类型
type:"json",
// 使用什么转换
parser:{
parse:json5.parse
}
},
{
test:/\.js$/,
exclude:/node_modules/,
use: {
loader:"babel-loader",
options:{
presets:["@abel/preset-env"],
// 用于定义插件的插件,及@babel/plugin-transform-runtime是属于"babel-loader"的插件
plugins:[
[
"@babel/plugin-transform-runtime"
]
]
}
}
}
]
},
// 优化插件
optimization:{
// 分离代码
// 配置后,将会自动把公共的代码抽离到单独的文件中
splitChunks:{
// 缓存组
// 一般用于定义需要缓存的第三方库
cacheFGroups:{
// 第三方库一般都是在node_modules中的
vendor:{
// 这样配置,是为了确保能获取到node_modules中的文件
test:/[\\/]node_modules[\\/]/,
// 起个名字
name:"vendors",
// all 对所有chunks(模块)做处理
chunks:"all"
}
}
}
}
}
打包,并指定运行那个配置文件,当前是开发环境:
npx webpack -c ./com\nfig/webpack.config.dev.js 或
npx webpack —config ./config/webpack.config.dev.js
打包后会生成一个dist文件夹(在项目根目录下)
生产环境配置文件
在config文件夹下创建webpack.config.prod.js开发环境配置文件
const path = require("path")
const HtmlWebpackPlugin = require("html-webpack-plugin")
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
const TerserPlugin = require("terser-webpack-plugin")
const toml = require("toml")
const yoml = require("yoml")
const json5 = require("json5")
// 将导出的对象换成一个函数
// env 为编译时输入的信息
module.export =
{
// 配置多入口
entry:{
index:"./src/index.js",
another:"./src/another-module.js"
},
output:{
// 用于缓存
filename:"[name].[contenthash].js",
path:path.resolve(__dirname,"../dist"),
clean:true,
assetModuleFilename:"images/[contenthash][ext]",
pulicPath:"http://localhost:8080"
},
mode:"production",
// 调试代码
// devtool:"inline-source-map",
plugins: [
new HtmlWebpackPlugin({
template:"./index.html",
filename:"app.html",
inject:"body"
}),
new MiniCssExtractPlugin({
filename:"styles/[contenthash].css"
})
],
// 用于启动服务
// devServer:{
// static:"./dist"
// },
// 定义哪些资源文件需要打包
module:{
rules:[
{
test:/\.png$/,
type:"asset/resource",
generator:{
filename:"images/[contenthash][ext]"
}
},
{
test:/\.svg$/,
type:"asset/inline",
},
{
test:/\.txt$/,
type:"asset/source",
},
{
test:/\.jpg$/,
type:"asset",
// 解析器
parser:{
// 定义是否生成URL的临界值,当文件大于时创建,反之生成URL
dataUrlCondition:{
maxSize:4*1024*1024
}
}
},
{
test:/\.(css|less)$/,
// 这时需要将css文件抽离,所以将不需要style-loader,替换为MiniCssExtractPlugin-loader
// 这个loader是由MiniCssExtractPlugin插件自带的
//use:[MiniCssExtractPlugin-loader,"css-loader","less-loader"]
use:[MiniCssExtractPlugin.loader,"css-loader","less-loader"]
},
{
test:/\.(woff|woff2|eot|ttf|otf)$/,
type:"asset/resource"
},
{
test:/\.(csv|tsv)$/,
type:"csv-loader"
},
{
test:/\.xml$/,
type:"xml-loader"
},
{
// 需要转换的文件
test:/\.toml$/,
// 转换后的类型
type:"json",
// 使用什么转换
parser:{
parse:toml.parse
}
},
{
// 需要转换的文件
test:/\.yoml$/,
// 转换后的类型
type:"json",
// 使用什么转换
parser:{
parse:yoml.parse
}
},
{
// 需要转换的文件
test:/\.json5$/,
// 转换后的类型
type:"json",
// 使用什么转换
parser:{
parse:json5.parse
}
},
{
test:/\.js$/,
exclude:/node_modules/,
use: {
loader:"babel-loader",
options:{
presets:["@abel/preset-env"],
// 用于定义插件的插件,及@babel/plugin-transform-runtime是属于"babel-loader"的插件
plugins:[
[
"@babel/plugin-transform-runtime"
]
]
}
}
}
]
},
// 优化插件
optimization:{
minimizer:[
new CssMinimizerPlugin(),
new TerserPlugin()
]
// 分离代码
// 配置后,将会自动把公共的代码抽离到单独的文件中
splitChunks:{
// 缓存组
// 一般用于定义需要缓存的第三方库
cacheFGroups:{
// 第三方库一般都是在node_modules中的
vendor:{
// 这样配置,是为了确保能获取到node_modules中的文件
test:/[\\/]node_modules[\\/]/,
// 起个名字
name:"vendors",
// all 对所有chunks(模块)做处理
chunks:"all"
}
}
}
},
// 与性能有关的配置
performance: {
hints:false
}
}
打包,并指定运行那个配置文件,当前是开发环境:
npx webpack -c ./comfig/webpack.config.prod.js 或
npx webpack —config ./config/webpack.config.prod.js
打包后会生成一个dist文件夹(在项目根目录下)
通过npx 启动一个服务:npx webpack serve -c ./comfig/webpack.config.dev.js
情动服务后可在浏览器查看效果
npm脚本
在package.json文件中新建脚本
通过 npm run xxx 例如: npm run start ,或 npm run build 运行上面的两个脚本
在脚本中使用webpack可以补添加npx 前缀,如下:
提取公共配置
在config项目的文件夹下,创建一个公共配置文件(用于配置生产环境和开发环境中相同的配置)webpack.config.common.js
下面没有注释的就是通用配置
const path = require("path")
const HtmlWebpackPlugin = require("html-webpack-plugin")
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
const TerserPlugin = require("terser-webpack-plugin")
const toml = require("toml")
const yoml = require("yoml")
const json5 = require("json5")
module.export =
{
// 配置多入口
entry:{
index:"./src/index.js",
another:"./src/another-module.js"
},
output:{
// 用于缓存
// filename:"[name].[contenthash].js",
path:path.resolve(__dirname,"../dist"),
clean:true,
assetModuleFilename:"images/[contenthash][ext]",
// pulicPath:"http://localhost:8080"
},
// mode:"production",
// 调试代码
// devtool:"inline-source-map",
plugins: [
new HtmlWebpackPlugin({
template:"./index.html",
filename:"app.html",
inject:"body"
}),
new MiniCssExtractPlugin({
filename:"styles/[contenthash].css"
})
],
// 用于启动服务
// devServer:{
// static:"./dist"
// },
// 定义哪些资源文件需要打包
module:{
rules:[
{
test:/\.png$/,
type:"asset/resource",
generator:{
filename:"images/[contenthash][ext]"
}
},
{
test:/\.svg$/,
type:"asset/inline",
},
{
test:/\.txt$/,
type:"asset/source",
},
{
test:/\.jpg$/,
type:"asset",
// 解析器
parser:{
// 定义是否生成URL的临界值,当文件大于时创建,反之生成URL
dataUrlCondition:{
maxSize:4*1024*1024
}
}
},
{
test:/\.(css|less)$/,
// 这时需要将css文件抽离,所以将不需要style-loader,替换为MiniCssExtractPlugin-loader
// 这个loader是由MiniCssExtractPlugin插件自带的
//use:[MiniCssExtractPlugin-loader,"css-loader","less-loader"]
use:[MiniCssExtractPlugin.loader,"css-loader","less-loader"]
},
{
test:/\.(woff|woff2|eot|ttf|otf)$/,
type:"asset/resource"
},
{
test:/\.(csv|tsv)$/,
type:"csv-loader"
},
{
test:/\.xml$/,
type:"xml-loader"
},
{
// 需要转换的文件
test:/\.toml$/,
// 转换后的类型
type:"json",
// 使用什么转换
parser:{
parse:toml.parse
}
},
{
// 需要转换的文件
test:/\.yoml$/,
// 转换后的类型
type:"json",
// 使用什么转换
parser:{
parse:yoml.parse
}
},
{
// 需要转换的文件
test:/\.json5$/,
// 转换后的类型
type:"json",
// 使用什么转换
parser:{
parse:json5.parse
}
},
{
test:/\.js$/,
exclude:/node_modules/,
use: {
loader:"babel-loader",
options:{
presets:["@abel/preset-env"],
// 用于定义插件的插件,及@babel/plugin-transform-runtime是属于"babel-loader"的插件
plugins:[
[
"@babel/plugin-transform-runtime"
]
]
}
}
}
]
},
// 优化插件
optimization:{
// minimizer:[
// new CssMinimizerPlugin(),
// new TerserPlugin()
// ]
// 分离代码
// 配置后,将会自动把公共的代码抽离到单独的文件中
splitChunks:{
// 缓存组
// 一般用于定义需要缓存的第三方库
cacheFGroups:{
// 第三方库一般都是在node_modules中的
vendor:{
// 这样配置,是为了确保能获取到node_modules中的文件
test:/[\\/]node_modules[\\/]/,
// 起个名字
name:"vendors",
// all 对所有chunks(模块)做处理
chunks:"all"
}
}
}
},
// 与性能有关的配置
performance: {
hints:false
}
}
开发环境
module.export = {
output:{
// 用于缓存
filename:"script/[name].js",
},
mode:"development",
// 调试代码
devtool:"inline-source-map",
// 用于启动服务
devServer:{
static:"./dist"
}
}
生产环境
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
const TerserPlugin = require("terser-webpack-plugin")
module.export = {
output:{
// 用于缓存
filename:"script/[name].[contenthash].js",
pulicPath:"http://localhost:8080"
},
mode:"production",
optimization:{
minimizer:[
new CssMinimizerPlugin(),
new TerserPlugin()
]
},
// 与性能有关的配置
performance: {
hints:false
}
}
合并上面的三个配置文件
通过使用webpack-merge合并配置文件
安装:npm i webpack-merge -D
在项目下的config文件下创建文件 webpack.config.js:
通过webpack.config.js将上面三个配置文件合并到一起
const {merge} = require("webpack-merge")
// 导入配置文件
const commonConfig = require("./webpack.config.common")
const productionConfig = require("./webpack.config.prod")
const developmentConfig = require("./webpack.config.dev")
// 导出
module.exports = (env) => {
switch(true) {
// 通过判断env.development是否为true,是否执行合并
case env.development :
// 合并配置开发配置文件
return merge(commonConfig,developmentConfig)
case env.production:
return merge(commonCofig,productionConfig)
// defult在这里可以不用添加
defult:
return new Error("No matching configuration was found")
}
}
提取后的脚本
提取完公共配置文件后的运行脚本:(需要在运行时传递当前的环境变量)