公共路径

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的临界值,当文件大于时创建,反之生成URLdataUrlCondition:{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的临界值,当文件大于时创建,反之生成URLdataUrlCondition:{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的临界值,当文件大于时创建,反之生成URLdataUrlCondition:{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")}}
提取后的脚本
提取完公共配置文件后的运行脚本:(需要在运行时传递当前的环境变量)


