1. webpack概念
//# 概念
webpack是自动化构建工具(静态模块打包器)
//# 打包文本
a. 默认打包js文件, 如果要打包其他资源,需要配置对应loader(加载器)
//# 打包方式
需要一个打包入口(将所有依赖项一起打包),打包后生成一个静态资源文件(打包出口)
2. webpack 5大核心 - 记住
//# entry ( 入口 )
一定是js文件
//# output ( 出口 )
打包后的文件一般存放在dist目录下
//# loader ( 加载器 )
webpack打包js文件,要想打包其他资源,必须配置loader
//# plugins ( 插件 )
一些复杂的配置需要插件,高大上配置
//# mode ( 模式 )
development 开发模式 - 代码本地调试使用 production -生产模式 线上环境使用
3.使用webpack步骤
//# 创建项目fitness
//# 初始化包描述文件
yarn init -y
//# 创建项目目录src
//# 本地安装webpack 和 webpack-cli === 安装webpack命令
yarn add webpack@5.73.0 webpack-cli@4.10.0 -D
【打包js文件】
//# 在项目根目录 创建webpack配置文件
webpack.config.js
//# 在配置文件中webpack.config.js 配置webpack
//引入node内置模块,无需下载,直接引入
const path = require('path')
//暴露webpack对象
module.exports = {
//入口entry
entry: './src/js/index.js',
//出口output
output: {
path: path.resolve(__dirname, 'dist'), //出口路径
filename: 'bundle.js'//输出文件名字
},
//加载器loader
//插件plugins
//模式mode
mode: 'development'
}
//# 配置package.json文件
{
"scripts": {
"build": "webpack"
},
}
4. 打包css
//# 下载模块
yarn add css-loader@6.7.1 style-loader@3.3.1 -D
//# 配置loader
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader'] //顺序不能换
}
]
}
5. 打包less
//# 下载模块
yarn add less-loader@11.0.0 less@4.1.3 -D
//# 配置loader
rules: [
{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'less-loader']
}
]
6. 打包背景图
//# 下载模块
yarn add url-loader@4.1.1 file-loader@6.2.0 -D
//# 配置loader
rules: [
{
test: /\.(jpg|png|gif|jpeg)$/,
loader: "url-loader",
options: {
name: "[hash:16].[ext]", // 图片输出的名字hash长度16位 默认32位
limit: 50 * 1024, // 小于10kb base64处理
outputPath: "imgs", //输出路径
esModule: false, //关闭es6模块化
},
type: "javascript/auto",
},
]
7.打包插入图
//# 下载模块
yarn add html-loader@3.1.2 html-webpack-plugin@5.5.0 -D
//# 配置loader
rules: [
{
test: /\.(jpg|png|gif|jpeg)$/,
loader: "url-loader",
options: {
name: "[hash:16].[ext]", // 图片输出的名字hash长度16位 默认32位
limit: 50 * 1024, // 小于10kb base64处理
outputPath: "imgs", //输出路径
esModule: false, //关闭es6模块化
},
type: "javascript/auto",
},
{
test: /\.html$/, // 处理html中引入img
loader: "html-loader",
},
]
//# 配置插件
//处理html的插件
const HtmlWebpackPlugin = require('html-webpack-plugin')
//插件plugins
plugins: [
//处理html
new HtmlWebpackPlugin({
template: "./src/page/home/home.html", // 把home.html复制到dist中 自动引入资源文件
filename: "home.html", //出口名字
//chunks: ['home'] //引入js资源
}),
]
//# 配置出口的公共路径
//出口output
output: {
path: path.resolve(__dirname, 'dist'), //出口路径
filename: 'home.js',//输出文件名字
publicPath: './'
}
//# 在home.html页面中删除script标签
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- <script src="../dist/home.js"></script> -->
</head>
8. 打包字体图标
//# 下载模块
//yarn add file-loader@6.2.0 -D (之前下载过,无需下载)
//# 配置loader
rules: [
{
test: /\.(eot|svg|ttf|woff|woff2)$/, // 处理字体格式文件
type: "asset/resource",
generator: {
filename: "fonts/[name].[hash:6][ext]",
},
},
]
9. 编译ES6到ES5
//# 下载模块
yarn add babel-core@6.26.3 babel-loader@7.1.5 babel-preset-es2015@6.24.1 -D
//# 配置loader
rules: [
{
test: /\.js$/,
loader: 'babel-loader', // loader 编译es6为es5
exclude: /node_modules/ // 排除
}
]
//# 项目根目录创建 .babelrc文件
{
"presets": [
"es2015"
],
"plugins": []
}
10. 压缩和提取css
//# 下载插件
-------------提取------------
yarn add mini-css-extract-plugin@2.6.1 -D
--------------压缩-------------
yarn add optimize-css-assets-webpack-plugin@6.0.1 -D
//# 引入插件
//提取css插件
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
//压缩css
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
//# 配置插件
plugins: [
// 提取css
new MiniCssExtractPlugin({
filename: "css/[name]-[hash:5].css", // 重命名输出的css
}),
// 压缩css
new OptimizeCssAssetsWebpackPlugin(),
]
//# 配置loader
{
test: /\.css$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: "../",
},
},
"css-loader",
], //顺序不能换
},
{
test: /\.less$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: "../",
},
},
"css-loader",
"less-loader",
],
},
11. 开发服务器devServer配置启动命令
11.1 配置服务器
#1.下载插件
yarn add webpack-dev-server@3.11.2 -D
#配置
// 开发服务器 -- 和五大特性同级
devServer: {
contentBase: path.resolve(__dirname, 'dist'), //启动服务器目录
publicPath: '/',// 静态资源查找路径
compress: true,// 启动gzip
port: 9527,// 端口
open: true,// 是否在浏览器自动打开
openPage: ['home.html']
}
target:'web',// 目标是浏览器
# 在package.json配置命令
"scripts": {
"serve": "npx webpack serve",
"build": "npx webpack"
}
# 启动命令
yarn serve/npm run serve 开发阶段启动
yarn build/npm run build 项目完成后才进行打包,中途不需要打包
12. 区分开发环境和生产环境[了解]
//#下载插件
yarn add cross-env@7.0.3 -D
//#修改package.json
"scripts": {
"serve": "cross-env NODE_ENV=development webpack serve",
"build": "cross-env NODE_ENV=production webpack"
},
//#修改模式mode
mode: process.env.NODE_ENV,
13. 自动清除dist
//# 下载插件
yarn add clean-webpack-plugin@3.0.0 -D
//# 引入
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
//# 调用插件
plugins = [
// 删除dist目录
new CleanWebpackPlugin()
]
14.多入口文件
//# 配置入口entry
entry: {
dom: './src/js/dom.js',
home: './src/js/home.js',
login: './src/js/login.js',
register: './src/js/register.js',
},
//# 配置出口output
output: {
path: path.resolve(__dirname, 'dist'), //出口路径
filename: 'js/[name]-[hash:5].js',//输出文件名字
publicPath: './'
},
//# 实例化html插件(一个页面实例一个插件)
new HtmlWebpackPlugin({
template: './src/page/home.html', // 把index.html复制到dist中 自动引入资源文件
filename: 'home.html',
chunks: ['home', 'dom'] //引入js资源
}),
15.自动读取入口文件
//#1.自动获取js文件,实现自动找到入口
let glob = require('glob');
let files = glob.sync('./src/pages/*?/*?.js');
let entry = {};
files.forEach(function (v) {
let fn = v.match(/\/(\w+)\.js/i);
entry[fn[1]] = v;
})
//#2.自动获取html文件,实现自动找网页模板
let htmls=glob.sync('./src/pages/*?/*?.html');
let htmlArr=htmls.map(function(v){
let fn=v.match(/\/(\w+)\.html/i);
return new HtmlWebpackPlugin({
template: v,
filename: fn[0].substr(1),
chunks:[fn[1]],
});
});
//#3.修改入口
//暴露webpack对象
module.exports = {
//入口entry
entry: entry,//修改这里
}
//#4.修改插件
//插件plugins
plugins: [
// 提取css
new MiniCssExtractPlugin({
filename: "css/[name]-[hash:5].css", // 重命名输出的css
}),
// 压缩css
new OptimizeCssAssetsWebpackPlugin(),
// 删除dist目录
new CleanWebpackPlugin()
].concat(htmlArr), //修改这里