目录
1.1.1 webpack.dev.js(开发模式配置文件)
1.1.2 webpack.prod.js(生产模式配置文件)
一、生产模式
模式下需要对代码进行优化,让其运行性能更好
优化主要从两个角度出发:
- 优化代码运行性能
- 优化代码打包速度
1.1 配置文件
一般可以创建一个专门存放Webpack配置文件的目录,里面存放开发模式的配置文件以及生产模式的配置文件
以webpack.dev.js(开发模式配置文件)和webpack.prod.js(生产模式配置文件)为例
1.1.1 webpack.dev.js(开发模式配置文件)
// Node.js的核心模块,专门用来处理路径问题
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
// 入口
entry: "./src/main.js", // 相对路径和绝对路径都行
// 输出
output: {
path: undefined, // 开发模式没有输出,不需要指定输出目录
// 文件名
filename: "static/js/main.js", // 将 js 文件输出到 static/js 目录中
},
// 加载器
module: {
rules: [
// loader的配置
{
test: /\.css$/,
// 执行顺序从右到左(从下到上)
use: [
"style-loader", // 将js中css通过创建style标签添加到html文件中生效
"css-loader", // 将css资源编译成commonjs的模块到js中
],
},
{
test: /\.less$/,
use: ["style-loader", "css-loader", "less-loader"],
},
{
test: /\.s[ac]ss$/,
use: ["style-loader", "css-loader", "sass-loader"],
},
{
test: /\.styl$/,
use: ["style-loader", "css-loader", "stylus-loader"],
},
{
test: /\.(png|jpe?g|gif|svg|webp|JPG)$/,
type: "asset",
parser: {
dataUrlCondition: {
maxSize: 10 * 1024,
},
},
generator: {
filename: "static/images/[hash:10][ext][query]",
},
},
{
test: /\.(ttf|woff2?)$/,
type: "asset/resource",
generator: {
filename: "static/fonts/[hash:8][ext][query]",
},
},
{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/, // 排除node_modules 和 bower_components文件不处理
use: {
loader: "babel-loader",
},
},
],
},
// 插件
plugins: [
// plugins的配置
new HtmlWebpackPlugin({
// 模板,自动引入打包输出资源
template: path.resolve(__dirname, "../public/index.html"),
}),
],
// 开发服务器
devServer: {
host: "localhost", // 启动服务器域名
port: "3000", // 启动服务器端口号
open: true, // 是否自动打开浏览器
},
// 模式
mode: "development",
};
运行开发模式指令:
npx webpack serve --config ./config/webpack.dev.js
1.1.2 webpack.prod.js(生产模式配置文件)
// Node.js的核心模块,专门用来处理路径问题
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
// 入口
entry: "./src/main.js", // 相对路径和绝对路径都行
// 输出
output: {
path: path.resolve(__dirname, "../dist"), // 绝对路径
// 文件名
filename: "static/js/main.js", // 将 js 文件输出到 static/js 目录中
// 自动清空上次打包结果
clean: true,
},
// 加载器
module: {
rules: [
// loader的配置
{
test: /\.css$/,
// 执行顺序从右到左(从下到上)
use: [
"style-loader", // 将js中css通过创建style标签添加到html文件中生效
"css-loader", // 将css资源编译成commonjs的模块到js中
],
},
{
test: /\.less$/,
use: ["style-loader", "css-loader", "less-loader"],
},
{
test: /\.s[ac]ss$/,
use: ["style-loader", "css-loader", "sass-loader"],
},
{
test: /\.styl$/,
use: ["style-loader", "css-loader", "stylus-loader"],
},
{
test: /\.(png|jpe?g|gif|svg|webp|JPG)$/,
type: "asset",
parser: {
dataUrlCondition: {
maxSize: 10 * 1024,
},
},
generator: {
filename: "static/images/[hash:10][ext][query]",
},
},
{
test: /\.(ttf|woff2?)$/,
type: "asset/resource",
generator: {
filename: "static/fonts/[hash:8][ext][query]",
},
},
{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/, // 排除node_modules 和 bower_components文件不处理
use: {
loader: "babel-loader",
},
},
],
},
// 插件
plugins: [
// plugins的配置
new HtmlWebpackPlugin({
// 模板,自动引入打包输出资源
template: path.resolve(__dirname, "../public/index.html"),
}),
],
// 模式
mode: "production",
};
运行生产模式指令:
npx webpack --config ./config/webpack.prod.js
1.2 配置运行指令
可将指令定义在 package.json 中 scripts 中,这样能够更方便运行不同模式的指令
"scripts": {
"dev": "npx webpack --config ./config/webpack.dev.js",
"build": "npx webpack --config ./config/webpack.prod.js"
},
配置完成后只需运行以下指令便可开启对应模式
#开发模式
npm run dev
#生产模式
npm run build
二、css处理
2.1 提取css为单独文件
2.1.1 下载包
npm i mini-css-extract-plugin -D
或
npm install --save-dev mini-css-extract-plugin
2.1.2 webpack.prod.js配置文件
建议 mini-css-extract-plugin 与 css-loader 一起使用。
之后将 loader 与 plugin 添加到你的 webpack.prod.js配置文件中。
// Node.js的核心模块,专门用来处理路径问题
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
entry: "./src/main.js",
output: {
path: path.resolve(__dirname, "../dist"),
filename: "static/js/main.js",
clean: true,
},
module: {
rules: [
// loader的配置
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
{
test: /\.less$/,
use: [MiniCssExtractPlugin.loader, "css-loader", "less-loader"],
},
{
test: /\.s[ac]ss$/,
use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"],
},
{
test: /\.styl$/,
use: [MiniCssExtractPlugin.loader, "css-loader", "stylus-loader"],
},
{
test: /\.(png|jpe?g|gif|svg|webp|JPG)$/,
type: "asset",
parser: {
dataUrlCondition: {
maxSize: 10 * 1024,
},
},
generator: {
filename: "static/images/[hash:10][ext][query]",
},
},
{
test: /\.(ttf|woff2?)$/,
type: "asset/resource",
generator: {
filename: "static/fonts/[hash:8][ext][query]",
},
},
{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: "babel-loader",
},
},
],
},
// 插件
plugins: [
// plugins的配置
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "../public/index.html"),
}),
new MiniCssExtractPlugin(),
],
// 模式
mode: "production",
};
运行指令后,可以在dist目录下看到生成main.css文件
2.2 css兼容性处理
2.2.1 下载包
npm i postcss-loader postcss postcss-preset-env -D
2.2.2 配置文件
module.exports = {
module: {
rules: [
{
test: /\.css$/i,
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: [
[
'postcss-preset-env',
{
// 其他选项
},
],
],
},
},
},
],
},
],
},
};
但是在样式多时,重复的代码也更多,可以选择封装样式loader函数
webpack.prod.js配置文件处理css兼容性并封装
// Node.js的核心模块,专门用来处理路径问题
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
// 获取处理样式loader
function getStyleLoader(pre) {
return [
MiniCssExtractPlugin.loader,
"css-loader",
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [["postcss-preset-env"]],
},
},
},
pre,
].filter(Boolean);
}
module.exports = {
entry: "./src/main.js",
output: {
path: path.resolve(__dirname, "../dist"),
filename: "static/js/main.js",
clean: true,
},
module: {
rules: [
// loader的配置
{
test: /\.css$/,
use: getStyleLoader(),
},
{
test: /\.less$/,
use: getStyleLoader("less-loader"),
},
{
test: /\.s[ac]ss$/,
use: getStyleLoader("sass-loader"),
},
{
test: /\.styl$/,
use: getStyleLoader("stylus-loader"),
},
{
test: /\.(png|jpe?g|gif|svg|webp|JPG)$/,
type: "asset",
parser: {
dataUrlCondition: {
maxSize: 10 * 1024,
},
},
generator: {
filename: "static/images/[hash:10][ext][query]",
},
},
{
test: /\.(ttf|woff2?)$/,
type: "asset/resource",
generator: {
filename: "static/fonts/[hash:8][ext][query]",
},
},
{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: "babel-loader",
},
},
],
},
// 插件
plugins: [
// plugins的配置
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "../public/index.html"),
}),
new MiniCssExtractPlugin(),
],
// 模式
mode: "production",
};
2.2.3 控制兼容性
可以在 package.json 文件中添加 browserslist 来控制样式的兼容性
"browserslist": [
"last 2 version",
"> 1%",
"not dead"
]
2.3 css压缩
2.3.1 下载包
npm i css-minimizer-webpack-plugin -D
或
npm install css-minimizer-webpack-plugin --save-dev
2.3.2 配置
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
module.exports = {
module: {
rules: [
{
test: /.s?css$/,
use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"],
},
],
},
optimization: {
minimizer: [
// 在 webpack@5 中,你可以使用 `...` 语法来扩展现有的 minimizer(即 `terser-webpack-plugin`),将下一行取消注释
// `...`,
new CssMinimizerPlugin(),
],
},
plugins: [new MiniCssExtractPlugin()],
};
以webpack.prod.js作为案例
// Node.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");
// 获取处理样式loader
function getStyleLoader(pre) {
return [
MiniCssExtractPlugin.loader,
"css-loader",
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [["postcss-preset-env"]],
},
},
},
pre,
].filter(Boolean);
}
module.exports = {
entry: "./src/main.js",
output: {
path: path.resolve(__dirname, "../dist"),
filename: "static/js/main.js",
clean: true,
},
module: {
rules: [
// loader的配置
{
test: /\.css$/,
use: getStyleLoader(),
},
{
test: /\.less$/,
use: getStyleLoader("less-loader"),
},
{
test: /\.s[ac]ss$/,
use: getStyleLoader("sass-loader"),
},
{
test: /\.styl$/,
use: getStyleLoader("stylus-loader"),
},
{
test: /\.(png|jpe?g|gif|svg|webp|JPG)$/,
type: "asset",
parser: {
dataUrlCondition: {
maxSize: 10 * 1024,
},
},
generator: {
filename: "static/images/[hash:10][ext][query]",
},
},
{
test: /\.(ttf|woff2?)$/,
type: "asset/resource",
generator: {
filename: "static/fonts/[hash:8][ext][query]",
},
},
{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: "babel-loader",
},
},
],
},
// 插件
plugins: [
// plugins的配置
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "../public/index.html"),
}),
new MiniCssExtractPlugin(),
// css压缩
new CssMinimizerPlugin(),
],
// 模式
mode: "production",
};
运行打包指令后,可看到打包后的css文件被压缩了