文章目录
什么是webpack
前端工程化,是指项目开发到上线,过程中集成的所有工具技术,Node.js是前端工程化的基础。

webpack是用于JavaScript应用程序的静态模块打包工具,当webpack处理应用程序时,会在内部从一个或多个入口点构建一个依赖图(dependency graph),然后将项目中所需的所有模块组成一个或多个bndles,它们均为静态资源,用于展示内容。
静态模块指的是编写代码过程中的,html,css,js,图片等固定内容的文件。
打包是指把静态模块内容,压缩,整合,转译等(前端工程化),例如:把 less / sass 转成 css 代码,把 ES6+ 降级成 ES5,支持多种模块标准语法。

参考文档 : https://www.webpackjs.com/concepts/
webpack配置
使用webpack
- 新建并初始化项目,编写业务源代码
npm init
- 下载 webpack和webpack-cli 到当前项目中
npm i webpack webpack-cli --save-dev
- 配置局部自定义命令
"scripts": {
"build": "webpack"
}
3.运行打包命令,会自动产生dist分发文件夹
npm run build
打包入口和出口
-
项目根目录,新建 webpack.config.js 配置文件

-
导配置入口,出口文件路径
const path = require("path")
module.exports = {
entry: path.resolve(__dirname, 'src/index.js'),
output: {
path: path.resolve(__dirname, 'dist'),
filename: './login/index.js'
}
}
生成 html 文件
1.下载 html-webpack-plugin 本地软件包
npm i html-webpack-plugin --save-dev
2.配置webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
plugins: [
new HtmlWebpackPlugin({
template: './public/login.html',
filename: './login/login.html',
})
]
}
打包css
- 准备 css 文件代码引入到入口src/login/index.js 中
import './login.css'
- 下载 css-loader 和 style-loader 本地软件包
css-loader:解析css代码
style-loader: 把解析的css代码插入到DOM
npm i css-loader style-loader --save-dev
- 配置 webpack.config.js
module.exports = {
module: {
rules: [
// 打包css 代码
{
test: /\.css$/i,
use: ["style-loader", "css-loader"],
}
]
}
}
打包css-提取css代码
将CSS代码提取到独立的css文件中,这样css文件可以被浏览器缓存,减少js文件体积
- 下载mini-css-extract-plugin 本地软件包
npm install mini-css-extract-plugin --save-dev
- 配置webpack.config.js,注意不能和style-loader 一起使用
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
module: {
rules: [
// 打包css 代码
{
test: /\.css$/i,
//use: ["style-loader", "css-loader"],
use: [MiniCssExtractPlugin.loader, 'css-loader']
}
]
},
plugins: [
new MiniCssExtractPlugin({
filename: './login/login.css'
})
]
}
打包css-压缩代码
压缩提取的CSS代码
1.下载插件css-minimizer-webpack-plugin
npm install css-minimizer-webpack-plugin --save-dev
- 配置webpack.config.js
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
module.exports = {
// ...
optimization: {
minimizer: [
// webpack中可以使用`...`来扩展现有minimizer
`...`,
new CssMinimizerPlugin()
]
}
}
打包less代码
- 新建less 代码(设置背景图)并引入到入口文件,例如src/login/index.js中
import './xxx.css'
- 下载less 和less-loader 本地软件包
npm i less less-loader --save-dev
- 配置webpack.config.js
module.exports = {
module: {
rules: [
// 打包less
{
test: /\.less$/i,
use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader']
}
]
}
}
打包图片
Webpack内置资源模块(字体,图片等)打包,无需额外loader
配置webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.(png|jpg|jpeg|gif)$/i,
type: 'asset',
generator: {
filename: 'assets/[hash][ext][query]'
}
}
]
}
}
其中:
【hash】对模块内容做算法计算,得到映射的数字字母组合的字符串
【ext】使用当前模块原本的占位符,例如:.png / .jpg 等字符串
【query】保留引入文件时代码中查询参数(只有URL 下生效)
注意:资源临界值默认为8KB
大于8KB 文件:发送一个单独的文件并导出URL 地址
小于8KB 文件:导出一个data URI(base64字符串)
开发环境
之前改代码,需重新打包才能运行查看,效率很低,可以配置开发环境,启动web服务,自动检测代码变化,热更新到页面。
注意:dist 目录和打包内容是在内存里,并不在打包导出的dist目录下
- 下载webpack-dev-server
npm i webpack-dev-server --save-dev
- 在webpack.config.js设置模式为开发模式
module.exports = {
mode: 'development',
devServer: {
static: './dist',
}
}
- 在package.json中配置自定义命令
"scripts": {
"build": "webpack",
"dev": "webpack serve --open"
}
- 启动开发服务器
npm run dev
打包模式
| 模式 | 名称 | 特点 | 场景 |
|---|---|---|---|
| 开发模式 | development | 调试代码,实时加载,模块热替换等 | 本地开发 |
| 生产模式 | production | 压缩代码,资源优化,更轻量等 | 打包上线 |
打包模式的配置
方式一
在webpack.config.js 配置文件设置mode 选项
module.exports = {
mode: 'production'
}
方式二
在package.json 命令行设置mode 参数,命令行设置的优先级高于配置文件中的,推荐用命令行设置
"scripts": {
"build": "webpack --mode=production",
"dev": "webpack serve --open --mode=development"
}
打包模式的应用
例如对CSS代码的提取,在开发模式下用style-loader内嵌更快,在生产模式下用MiniCssExtractPlugin提取css代码
方案一
webpack.config.js 配置mode选项,或者在package.json 命令行设置mode 参数,会将 DefinePlugin 中 process.env.NODE_ENV 的值设置为development和production,但只接受这两种参数。
如果要根据 webpack.config.js 中的 mode 变量更改打包行为,则必须将配置导出为函数,而不是导出对象:
var config = {
entry: './app.js',
//...
};
module.exports = (env, argv) => {
if (argv.mode === 'development') {
config.devtool = 'source-map';
}
if (argv.mode === 'production') {
//...
}
return config;
};
方案二
配置不同环境的webpack.config.js
- 安装 webpack-merge
npm install --save-dev webpack-merge
- 创建不同环境的webpack.config.js
webpack-demo
|- package.json
|- package-lock.json
|- webpack.config.js
|- webpack.common.js
|- webpack.dev.js
|- webpack.prod.js
|- /dist
|- /src
|- index.js
|- math.js
|- /node_modules
将prod和dev配置中公共部分提取到common中,在prod和dev中使用merge进行引用
webpack.common.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: {
app: './src/index.js',
},
plugins: [
new HtmlWebpackPlugin({
title: 'Production',
}),
],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
clean: true,
},
};
webpack.dev.js
const { merge } = require('webpack-merge');
const common = require('./webpack.common.js');
module.exports = merge(common, {
mode: 'development',
devtool: 'inline-source-map',
devServer: {
static: './dist',
},
});
webpack.prod.js
const { merge } = require('webpack-merge');
const common = require('./webpack.common.js');
module.exports = merge(common, {
mode: 'production',
});
- 配置package.json
"scripts": {
"start": "webpack serve --open --config webpack.dev.js",
"build": "webpack --config webpack.prod.js"
}
方案三
借助cross-env (跨平台通用)包命令,设置参数区分环境
- 下载cross-env 软件包到当前项目
npm i cross-env --save-dev
- package.json中配置自定义命令,传入参数名和值
"scripts": {
"build": "cross-env NODE_ENV=production webpack --mode=production",
"dev": "cross-env NODE_ENV=development webpack serve --open --mode=development"
}
- 在webpack.config.js 区分不同环境使用不同配置
module.exports = {
module: {
rules: [
// 打包css 代码
{
test: /\.css$/i,
use: [process.env.NODE_ENV === 'development' ? 'style-loader': MiniCssExtractPlugin.loader, 'css-loader']
}
]
}
}
cross-env 设置的只在Node.js 环境生效,前端代码运行环境无法访问process.env.NODE_ENV,需要使用Webpack 内置的DefinePlugin 插件,在编译时,将前端代码中匹配的变量名,替换为值或表达式
const webpack = require('webpack')
module.exports = {
plugins: [
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
})
]
}
打包模式
打包的代码被压缩和混淆,无法正确定位源代码位置(行数和列数),source map
可以准确追踪error 和warning 在原始代码的位置,inline-source-map 选项把源码的位置信息一起打包在js 文件内,仅适用于开发环境,不要在生产环境使用(防止被轻易查看源码位置)
module.exports = {
devtool: 'inline-source-map'
}
解析别名alias
在webpack.config.js 中配置解析别名@ 来代表src 绝对路径,创建import引入路径的别名,来确保模块引入变得更简单
module.exports = {
resolve: {
alias: {
'@': path.resolve(__dirname, 'src')
}
}
}
cdn 使用
- 在html 中引入第三方库的CDN 地址并用模板语法判断
<% if(htmlWebpackPlugin.options.useCdn){ %>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.2.3/css/bootstrap.min.css" rel="stylesheet">
<% } %>
2.配置webpack.config.js 中 externals外部扩展选项(防止某些import 的包被打包)
const config = {
plugins: [
new HtmlWebpackPlugin({
template: './public/login.html',
filename: './login/login.html',
useCdn: process.env.NODE_ENV === 'production'
})
]
}
if(process.env.NODE_ENV === 'production') {
config.externals = {
// key:代码中import from 后面的模块标识字符串
// value: 替换在原地的变量名(要和CDN暴露在全局的变量名一致)
'bootstrap/dist/css/bootstrap.min.css': 'bootstrap',
'axios': "axios"
}
}
多页面打包
配置webpack.config.js
const config2 = {
entry: {
'模块1': path.resolve(__dirname, 'src/入口1.js'),
'模块2': path.resolve(__dirname, 'src/入口2.js')
},
ouput: {
path: path.resolve(__dirname, 'dist'),
filename: './[name]/index'
},
plugins: [
new HtmlWebpackPlugin({
template: './public/页面1.html',
filename: './路径/login.html',
chunks: ['模块1']
}),
new HtmlWebpackPlugin({
template: './public/页面2.html',
filename: './路径/login.html',
chunks: ['模块2']
})
]
}
-1
1492

被折叠的 条评论
为什么被折叠?



