package.json 文件
以下依赖包我是跟着视频一一学习下载的,并不是在项目中所需要,不一定全部下载。
{
"name": "webpack_code",
"version": "1.0.0",
"description": "",
"main": "./src/main.js",
"scripts": {
"start": "npm run dev",
"dev": "webpack serve --config ./config/webpack.dev.js",
"build": "webpack --config ./config/webpack.prod.js"
},
"repository": {
"type": "git",
"url": "git@gitee.com:king-cui/webpack_code.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/cli": "^7.21.0",
"@babel/core": "^7.21.0",
"@babel/plugin-transform-runtime": "^7.21.0",
"@babel/preset-env": "^7.20.2",
"@vue/cli-plugin-babel": "^5.0.8",
"babel-loader": "^9.1.2",
"core-js": "^3.29.1",
"css-loader": "^6.7.3",
"css-minimizer-webpack-plugin": "^4.2.2",
"eslint": "^8.36.0",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-vue": "^9.10.0",
"eslint-webpack-plugin": "^4.0.0",
"html-webpack-plugin": "^5.5.0",
"image-minimizer-webpack-plugin": "^3.8.2",
"imagemin": "^8.0.1",
"imagemin-gifsicle": "^7.0.0",
"imagemin-jpegtran": "^7.0.0",
"imagemin-optipng": "^8.0.0",
"imagemin-svgo": "^10.0.1",
"less": "^4.1.3",
"less-loader": "^11.1.0",
"mini-css-extract-plugin": "^2.7.5",
"sass": "^1.58.3",
"sass-loader": "^13.2.0",
"style-loader": "^3.3.1",
"stylus": "^0.59.0",
"stylus-loader": "^7.1.0",
"thread-loader": "^3.0.4",
"vue-loader": "^17.0.1",
"vue-style-loader": "^4.1.3",
"vue-template-compiler": "^2.7.14",
"webpack": "^5.76.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.11.1",
"workbox-webpack-plugin": "^6.5.4"
},
"dependencies": {
"@vue/preload-webpack-plugin": "^2.0.0",
"vue": "^3.2.47"
}
}
webpack.dev.js 文件
这个文件是我们进行开发环境的配置。
const os = require("os")
const path = require("path")
const Eslint = require('eslint-webpack-plugin')
const { DefinePlugin } = require("webpack")
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { VueLoaderPlugin } = require('vue-loader')
const threads = os.cpus().length
module.exports = {
entry: './src/main.js',
output: {
path: undefined ,
filename: 'js/[name].js',
chunkFilename: "js/chunk-[name].js",
assetModuleFilename: 'media/[hash:10][ext][query]',
},
devtool:"cheap-module-source-map",
devServer: {
host: "localhost",
port: "8083",
open: true,
hot: true
},
module: {
rules: [
{
test: /\.css$/i,
use: ["vue-style-loader", "css-loader"],
},
{
test: /\.less$/i,
use: ["vue-style-loader", "css-loader", "less-loader"],
},
{
test: /\.s[ac]ss$/i,
use: ["vue-style-loader", "css-loader", "sass-loader"],
},
{
test: /\.styl$/,
use: ["vue-style-loader", "css-loader", "stylus-loader"],
},
{
test: /\.(png|jpg|gif)$/i,
type: "asset",
parser: {
dataUrlCondition: {
maxSize: 10 * 1024
}
}
},
{
test: /\.(ttf|woff2?)$/i,
type: "asset/resource",
},
{
test: /\.m?js$/,
include: path.resolve(__dirname,'../src'),
use: [
{
loader: 'thread-loader',
options: {
workers: threads
},
},
{
loader: 'babel-loader',
options: {
cacheDirectory: true,
cacheCompression: false,
plugins: ['@babel/plugin-transform-runtime']
},
},
]
},
{
test: /\.vue$/,
loader: "vue-loader"
}
]
},
plugins: [
new Eslint({
context: path.resolve(__dirname, "../src"),
exclude: 'node_modules',
cache: true,
cacheLocation: path.resolve(__dirname, "../node_modules/.cache/eslintcache"),
threads: true,
}),
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "../public/index.html")
}),
new VueLoaderPlugin(),
new DefinePlugin({
__VUE_OPTIONS_API__: true,
__VUE_PROD_DEVTOOLS__: false
})
],
optimization: {
splitChunks: {
chunks: "all"
},
runtimeChunk: {
name: (entrypoint) => `runtime~${entrypoint.name}`,
},
},
resolve: {
extensions:[".vue", ".js", ".json"]
},
mode: 'development'
}
webpack.prod.js 文件
这个文件就是我们生产打包的配置。
const os = require("os")
const path = require("path")
const Eslint = require('eslint-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const TerserPlugin = require("terser-webpack-plugin")
const ImageMinimizerPlugin = require("image-minimizer-webpack-plugin");
const PreloadWebpackPlugin = require("@vue/preload-webpack-plugin")
const { DefinePlugin } = require("webpack")
const { VueLoaderPlugin } = require('vue-loader')
const WorkboxPlugin = require('workbox-webpack-plugin');
const threads = os.cpus().length
module.exports = {
entry: './src/main.js',
output: {
path:path.resolve(__dirname, "../dist") ,
filename: 'js/[name].[contenthash:10].js',
chunkFilename: "js/chunk-[name].[contenthash:10].js",
assetModuleFilename: 'media/[hash:10][ext][query]',
clean: true,
},
devtool:"source-map",
module: {
rules: [
{
oneOf: [
{
test: /\.css$/i,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
{
test: /\.less$/i,
use: [MiniCssExtractPlugin.loader, "css-loader", "less-loader"],
},
{
test: /\.s[ac]ss$/i,
use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"],
},
{
test: /\.styl$/,
use: [MiniCssExtractPlugin.loader, "css-loader", "stylus-loader"],
},
{
test: /\.(png|jpg|gif)$/i,
type: "asset",
parser: {
dataUrlCondition: {
maxSize: 10 * 1024
}
}
},
{
test: /\.(ttf|woff2?)$/i,
type: "asset/resource",
},
{
test: /\.m?js$/,
include: path.resolve(__dirname,'../src'),
use: [
{
loader: 'thread-loader',
options: {
workers: threads
},
},
{
loader: 'babel-loader',
options: {
cacheDirectory: true,
cacheCompression: false,
plugins: ['@babel/plugin-transform-runtime']
},
},
]
},
]
},
{
test: /\.vue$/,
loader: "vue-loader"
}
]
},
plugins: [
new Eslint({
context: path.resolve(__dirname, "../src"),
exclude: 'node_modules',
cache: true,
cacheLocation: path.resolve(__dirname, "../node_modules/.cache/eslintcache"),
threads: true,
}),
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "../public/index.html")
}),
new MiniCssExtractPlugin({
filename: 'css/[name].[contenthash:10].css',
chunkFilename: "css/chunk-[name].[contenthash:10].css",
}),
new WorkboxPlugin.GenerateSW({
clientsClaim: true,
skipWaiting: true,
}),
new PreloadWebpackPlugin({
rel: "prefetch"
}),
new VueLoaderPlugin(),
new DefinePlugin({
__VUE_OPTIONS_API__: true,
__VUE_PROD_DEVTOOLS__: false
})
],
optimization: {
minimizer: [
new CssMinimizerPlugin(),
new TerserPlugin({
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",
}
}
]
}]
]
}
}
}),
],
splitChunks: {
chunks: "all"
},
runtimeChunk: {
name: (entrypoint) => `runtime~${entrypoint.name}`,
},
},
resolve: {
extensions:[".vue", ".js", ".json"]
},
mode: 'production'
}
Babel.config.js文件
项目的辅助配置,和项目的package.json同级。
module.exports = {
presets: [
[
'@babel/preset-env',
{
useBuiltIns: "usage",
corejs: 3
}
],
"@vue/cli-plugin-babel/preset"
]
};
.eslintrc.js 文件
项目的辅助配置,和项目的package.json同级。
module.exports = {
extends: ["plugin:vue/vue3-essential","eslint:recommended"],
env: {
node: true,
browser: true,
},
parserOptions: {
ecmaVersion: 6,
sourceType: "module",
},
rules: {
"no-var": 2
},
plugins: ['import'],
}