config文件
webpack.config.js
const path = require('path'); // nodejs核心模块, 专门用来处理路劲问题
const ESLintPlugin = require('eslint-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { entry } = require('./webpack.dev');
// entry:{
// // 有多个入口文件,多入口
// app:"./src/app/js",
// main:"./src/main/js",
// }
module.exports = {
// 入口
entry: "./src/main.js", // 相对路径
// 输出
output: {
// 所有文件的输出路劲
// __dirname nodejs的变量, 代表当前文件的文件夹目录
path: path.resolve(__dirname, 'dist'), // 绝对路径
// 文件名
filename: "static/js/main.js",
// filename: "[name].js", // webpack命名方式,[name]以文件名自己命名
// clean: true, // 自动清空上次打包的内容 原理:在打包前,将path整个目录内容清空,在进行打包
},
// 加载器
module: {
rules: [
// loader的配置
{
test: /\.css$/, // 只检测 css 文件
use: [
// 执行顺序:从左到右(从下到上)
"style-loader", // 将 js 中 css 通过创建 style 标签添加到 html 文件中生效
"css-loader" // 将 css 资源编译成 commonjs 的模块到 js 中
],
},
{
test: /\.less$/,
// loader : "xxx" , // 只能使用一个 loader
use: [
// 使用多个 loader
'style-loader',
'css-loader',
'less-loader', // 将 less 编译成 css 文件
],
},
{
test: /\.s[ac]ss$/,
use: [
'style-loader',
'css-loader',
// 将 Sass 编译成 CSS
'sass-loader',
],
},
{
test: /\.styl$/,
use: ["style-loader", "css-loader", "stylus-loader"],
},
{
test: /\.(png|jpe?g|gif|webp|svg)$/,
type: 'asset',
parser: {
dataUrlCondition: {
// 小于 10kb 转 base64
// 优点:减少请求数量 缺点:会变大
maxSize: 10 * 1024 // 10kb
}
},
generator: {
// 输入图片的名称
// [hash: 10] hash值只取前10位 [hash]产生一个id 唯一
// [ext] 文件扩展名
// [query] 路径带的参数
filename: 'static/images/[hash:10][ext][query]'
}
},
{
test: /\.(ttf|woff2?|mp3|map4|avi)$/,
type: 'asset/resource',
generator: {
// 输入图片的名称
// [hash: 10] hash值只取前10位 [hash]产生一个id 唯一
// [ext] 文件扩展名
// [query] 路径带的参数
filename: 'static/media/[hash:10][ext][query]'
}
},
{
test: /\.js$/,
exclude: /node_modules/, // 排除 node_modules 中的js文件 文件不处理
use: {
loader: 'babel-loader',
// options: {
// presets: ['@babel/preset-env']
// }
}
}
]
},
// 插件
plugins: [
// plugin 的配置
new ESLintPlugin({
// 检查那些文件
context: path.resolve(__dirname, 'src')
}),
new HtmlWebpackPlugin({
// 模板: 以 public/index.html 文件创建新的 html 文件
// 新的 html 文件特点 : 1. 结构和原来一致,2.自动引入打包输出的资源
template: path.resolve(__dirname, 'public/index.html'),
}),
],
// 开发服务器:不会输出资源,在内存中编译打包的
devServer: {
host: "localhost", // 启动服务器域名
port: "3000", // 启动服务器端口号
open: true, // 是否自动打开浏览器
},
// 模式
mode: "development"
}
webpack.dev.js
const path = require('path'); // nodejs核心模块, 专门用来处理路劲问题
const ESLintPlugin = require('eslint-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
// nodejs核心模块,直接使用
const os = require("os");
// cpu核数
const threads = os.cpus().length;
const TerserWebpackPlugin = require("terser-webpack-plugin");
// 启动 npx webpack serve --config ./config/webpack.dev.js
module.exports = {
// 入口
entry: "./src/main.js", // 相对路径
// 输出
output: {
// 所有文件的输出路劲
// 开发模式没有输出
path: undefined,
// 文件名
filename: "static/js/main.js",
// clean: true, // 自动清空上次打包的内容 原理:在打包前,将path整个目录内容清空,在进行打包
},
// 加载器
module: {
rules: [
// loader的配置
{
// 每个文件只能被其中一个loader处理
oneOf: [
{
test: /\.css$/, // 只检测 css 文件
use: [
// 执行顺序:从左到右(从下到上)
"style-loader", // 将 js 中 css 通过创建 style 标签添加到 html 文件中生效
"css-loader" // 将 css 资源编译成 commonjs 的模块到 js 中
],
},
{
test: /\.less$/,
// loader : "xxx" , // 只能使用一个 loader
use: [
// 使用多个 loader
'style-loader',
'css-loader',
'less-loader', // 将 less 编译成 css 文件
],
},
{
test: /\.s[ac]ss$/,
use: [
'style-loader',
'css-loader',
// 将 Sass 编译成 CSS
'sass-loader',
],
},
{
test: /\.styl$/,
use: ["style-loader", "css-loader", "stylus-loader"],
},
{
test: /\.(png|jpe?g|gif|webp|svg)$/,
type: 'asset',
parser: {
dataUrlCondition: {
// 小于 10kb 转 base64
// 优点:减少请求数量 缺点:会变大
maxSize: 10 * 1024 // 10kb
}
},
generator: {
// 输入图片的名称
// [hash: 10] hash值只取前10位 [hash]产生一个id 唯一
// [ext] 文件扩展名
// [query] 路径带的参数
filename: 'static/images/[hash:10][ext][query]'
}
},
{
test: /\.(ttf|woff2?|mp3|map4|avi)$/,
type: 'asset/resource',
generator: {
// 输入图片的名称
// [hash: 10] hash值只取前10位 [hash]产生一个id 唯一
// [ext] 文件扩展名
// [query] 路径带的参数
filename: 'static/media/[hash:10][ext][query]'
}
},
{
test: /\.js$/,
// exclude: /node_modules/, // 排除 node_modules 中的js文件 文件不处理
include: path.resolve(__dirname, '../src'),
loader: 'babel-loader',
use: [
{
loader: "thread-loader", // 开启多线程
options: {
works: threads, // 进程数量
}
},
{
loader: 'babel-loader',
options: {
// presets: ['@babel/preset-env'],
cacheDirectory: true, // 开启 babel 缓存,
cacheCompression: false, // 关闭缓存文件压缩,
plugins: ["@babel/plugin-transform-runtime"], // 减少代码体积
}
}
]
// use: {
// options: {
// presets: ['@babel/preset-env']
// }
// }
},
]
}
]
},
// 插件
plugins: [
// plugin 的配置
new ESLintPlugin({
// 检查那些文件
context: path.resolve(__dirname, '../src'),
exclude: "node_modules",
cache: true, // 开启缓存
cacheLocation: path.resolve(__dirname, "../node_modules/.cache/eslintcache"),
// threads, // 开启多线程和设置线程数量
}),
new HtmlWebpackPlugin({
// 模板: 以 public/index.html 文件创建新的 html 文件
// 新的 html 文件特点 : 1. 结构和原来一致,2.自动引入打包输出的资源
template: path.resolve(__dirname, '../public/index.html'),
}),
new HtmlWebpackPlugin({
// 模板: 以 public/index.html 文件创建新的 html 文件
// 新的 html 文件特点 : 1. 结构和原来一致,2.自动引入打包输出的资源
template: path.resolve(__dirname, '../public/index.html'),
}),
],
// 开发服务器:不会输出资源,在内存中编译打包的
devServer: {
host: "localhost", // 启动服务器域名
port: "3000", // 启动服务器端口号
open: true, // 是否自动打开浏览器
hot: false, // false 关闭 HMR true 开启 HMR
},
// 模式
mode: "development",
devtool: "cheap-module-source-map",
}
webpack.prod.js
const path = require('path'); // nodejs核心模块, 专门用来处理路劲问题
const ESLintPlugin = require('eslint-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
// nodejs核心模块,直接使用
const os = require("os");
// cpu核数
const threads = os.cpus().length;
const TerserWebpackPlugin = require("terser-webpack-plugin");
const ImageMinimizerPlugin = require("image-minimizer-webpack-plugin");
// 启动 npx webpack serve --config ./config/webpack.prod.js
function getStyleLoader(pre) {
return [
// 执行顺序:从左到右(从下到上)
MiniCssExtractPlugin.loader, // 将 js 中 css 通过创建 style 标签添加到 html 文件中生效
"css-loader", // 将 css 资源编译成 commonjs 的模块到 js 中
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [
"postcss-preset-env", // 能解决大多数样式兼容性问题
],
},
},
},
pre,
].filter(Boolean)
}
module.exports = {
// 入口
entry: "./src/main.js", // 相对路径
// 输出
output: {
// 所有文件的输出路劲
// __dirname nodejs的变量, 代表当前文件的文件夹目录
path: path.resolve(__dirname, '../dist'), // 绝对路径
// 文件名
filename: "static/js/main.js",
clean: true, // 自动清空上次打包的内容 原理:在打包前,将path整个目录内容清空,在进行打包
},
// 加载器
module: {
rules: [
// loader的配置
{
oneOf: [
{
test: /\.css$/, // 只检测 css 文件
use: getStyleLoader()
},
{
test: /\.less$/,
// loader : "xxx" , // 只能使用一个 loader
use: getStyleLoader("less-loader")
},
{
test: /\.s[ac]ss$/,
use: getStyleLoader("sass-loader")
},
{
test: /\.styl$/,
use: getStyleLoader("stylus-loader"),
},
{
test: /\.(png|jpe?g|gif|webp|svg)$/,
type: 'asset',
parser: {
dataUrlCondition: {
// 小于 10kb 转 base64
// 优点:减少请求数量 缺点:会变大
maxSize: 10 * 1024 // 10kb
}
},
generator: {
// 输入图片的名称
// [hash: 10] hash值只取前10位 [hash]产生一个id 唯一
// [ext] 文件扩展名
// [query] 路径带的参数
filename: 'static/images/[hash:10][ext][query]'
}
},
{
test: /\.(ttf|woff2?|mp3|map4|avi)$/,
type: 'asset/resource',
generator: {
filename: 'static/media/[hash:10][ext][query]'
}
},
{
test: /\.js$/,
// exclude: /node_modules/, // 排除 node_modules 中的js文件 文件不处理
include: path.resolve(__dirname, '../src'),
use: [
{
loader: "thread-loader", // 开启多线程
options: {
works: threads, // 进程数量
}
},
{
loader: 'babel-loader',
options: {
// presets: ['@babel/preset-env'],
cacheDirectory: true, // 开启 babel 缓存,
cacheCompression: false, // 关闭缓存文件压缩
plugins: ["@babel/plugin-transform-runtime"], // 减少代码体积
}
}
]
}
]
}
]
},
// 插件
plugins: [
// plugin 的配置
new ESLintPlugin({
// 检查那些文件
context: path.resolve(__dirname, '../src'),
exclude: "node_modules", // 默认值
cache: true, // 开启缓存
cacheLocation: path.resolve(__dirname, "../node_modules/.cache/eslintcache")
}),
new HtmlWebpackPlugin({
// 模板: 以 public/index.html 文件创建新的 html 文件
// 新的 html 文件特点 : 1. 结构和原来一致,2.自动引入打包输出的资源
template: path.resolve(__dirname, '../public/index.html'),
}),
// 提取css成单独文件
new MiniCssExtractPlugin({
// 定义输出文件名和目录
filename: "static/css/main.css",
}),
new CssMinimizerPlugin(),
new TerserWebpackPlugin({
parallel: threads, // 开启多线程和设置线程数量
}),
],
optimization: {
// 压缩的操作
minimizer: [
// 压缩 css
new CssMinimizerPlugin(),
// 压缩 js
new TerserWebpackPlugin({
parallel: threads, // 开启多线程和设置线程数量
}),
// 压缩图片
new ImageMinimizerPlugin({
minimizer: {
implementation: ImageMinimizerPlugin.imageminGenerate,
options: {
plugins: [
["gifsicle", { interlaced: true }],
["jpegtran", { progressive: true }],
["optipng", { optimizationLevel: 5 }],
[
"svgo",
{
plugins: [
"preset-default",
"prefixIds",
{
name: "sortAttrs",
params: {
xmlnsOrder: "alphabetical",
},
},
],
},
],
],
},
},
}),
]
},
// 模式
mode: "production",
devtool: "source-map",
}