webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。在使用 WebPack 前你需要先了解 NodeJS 及 NPM。

基础
在使用 WebPack 之前你需要先安装它(NodeJS 的安装及 NPM 的使用此处不再叙述)。以下是 WebPack 使用必装的内容及命令:
npm i webpack -D // webpack 主程序 npm i webpack-cli -D // webpack 命令工具包,不安装无法使用 webpack 命令打包 npm i webpack-dev-server -D // webpack 开发服务器,用于开发模式下实时打包编译,方便开发
如果你没有安装 webpack-dev-server ,那么只能使用如下命令打包文件,生产环境相较于开发环境会压缩代码使其体积更小。
webpack --entry ./src/main.js -o ./dist --mode development // 开发环境,不压缩 Version:4.3.1 webpack --entry ./src/main.js -o ./dist --mode production // 生产环境,会压缩 Version:4.3.1
注意:使用上述命令需全局安装 webpack 及 webpack-cli ,否则会报错:'webpack' 不是内部或外部命令,也不是可运行的程序
安装 webpack-dev-server 后在 package.json 的 scripts 中配置 "server": "webpack serve --host 127.0.0.1 --port 1001" 并在项目根目录下新建 webpack.config.js 配置 webpack 选项后,即可通过 npm run server 运行 webpack 开发服务器,实时编译。webpack.config.js 的基本配置结构如下:
// WebPack v5.11.1 常用配置
// 引入 Node.js 的 path 模块
const path = require('path');
// 向外暴露一个配置对象
module.exports = {
// 配置模式 Mode
mode: 'development',
// 入口起点 Entry
entry: {
main: path.join(__dirname, './src/main.js'),
},
// 输出路径 Output
output: {
path: path.join(__dirname, './dist'),
filename: 'bundle.js'
},
// 配置插件 Plugins
plugins: [
],
// 配置加载器 Loaders
module: {
rules: [
]
},
// 配置别名 Resolve
resolve: {
alias: {
'@': path.resolve(__dirname, 'src/'),
}
}
}
模式(Mode)
mode: "development"|"production"
模式(mode)告诉 webpack 打包时如何优化,目前 webpack 支持 development 与 production 两种模式,不同的模式加载的插件不同。设置 mode 后会将对应的值设置给 process.env.NODE_ENV 。
入口(Entry)
entry: String|Array|Object|Function
入口(entry)用来设置 webpack 从哪个文件开始编译,可以是一个字符串、数组、对象或函数。
// 字符串 String
entry: './app.js'
// 数组 Array
entry: ['./src/js/app.js', './src/js/other.js']
// 对象 Object
entry: {
home: './home.js',
shared: ['react', 'react-dom', 'redux', 'react-redux'],
catalog: {
import: './catalog.js',
filename: 'pages/[name][ext]',
},
personal: {
import: './personal.js', // 入口文件路径
filename: 'pages/personal.js', // 输出文件名
dependOn: 'shared', // 依赖关系
chunkLoading: 'jsonp', // 异步加载,理解 chunk
}
}
// 函数 Function
entry: () => new Promise((resolve) => resolve(['./demo', './demo2']))
出口(Output)
output: Object
出口(Output)用来设置 webpack 输出到什么位置去以及一些输出时的配置,是一个对象。注意:虽然可以设置多个入口起点,但只能有一个输出配置!
// 对象 Object
output: {
path: path.join(__dirname, './dist'), // 输出路径
filename: 'bundle.js' // 输出文件名,设为 [name].js 则根据 chunk 模块名输出唯一的名称
},
加载器(Loaders)
webpack 默认只编译 js 或 json 文件,对于其他文件需要通过专门的加载器(Loader)进行处理,加载器从右到左(或从下到上)进行处理。其常用配置如下:
安装
使用加载器(loader)前需要使用 npm 命令安装对应的 Loader ,比如:
npm i style-loader css-loader sass-loader -D
配置
module.rules 中配置各个加载器:
module: {
rules: [
{ // SCSS 加载器
test: /\.scss$/,
loaders: ['style-loader','css-loader','sass-loader'],
},
{ // JS 加载器
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/,
},
{ // 图片加载器
test: /\.jpg|jpeg|png|gif|bmp$/,
use: [{
loader: 'url-loader',
options:{
esModule: false,
name: 'images/[name].[ext]',
limit: 10 * 1024,
},
}],
},
]
}
module.rules 中可以设置多个加载器,每种加载器的配置方式略有不同。
- test:字符串,设置要处理的文件格式,可使用正则匹配;
- use:数组,包含多个加载器的详细配置
- include:字符串或数组,指定 test 处理那些文件或文件夹下的内容
- exclude:字符串或数组,禁止 test 处理那些文件或文件夹下的内容
- loader:字符串,指定要使用的单一加载器
- loaders:数组,指定要使用的多个加载器
常用的加载器有: - style-loader:将 css-loader 打包好的代码以<style>标签的形式插入到 HTML 文件中,不想插入到页面中的话可以考虑使用插件:mini-css-extract-plugin 处理一下
- css-loader:将 css 文件打包,然后交由 style-loader 处理
- sass-loader:将 sass 文件打包成 css 文件,然后交由 css-loader 与 style-loader 处理
- less-loader:将 less 文件打包成 css 文件,然后交由 css-loader 与 style-loader 处理
- babel-loader:编译 ES 语法的高级语言,然后打包成浏览器可识别的 JS 语言
- url-loader:将文件编码成 base64 通过 URL 直接打包到文件中,避免过多 HTTP 请求,内嵌 file-loader ,当文件超过 limit 大小时自动调用 file-loader 处理
- file-loader:修改打包后文件的路径,使之与实际使用路径一致
- html-loader:注意这个加载器不是用来处理 HTML 的,它是用来处理 HTML 中的 url 图片的
- vue-loader: 将 vue 文件进行打包处理,提取出其中的逻辑代码 script ,样式代码 style 以及 HTML 模板 template ,再分别将它们交给对应的loader去处理。注意需要配置 plugins !
更多加载器可访问>>>WebPack Loaders
插件(Plugins)
加载器(Loader)只能处理特定类型的模块,如果需要拓展更多功能,比如包优化、资源管理、注入环境变量等,则需要使用插件(Plugins)。
安装
使用插件(Plugins)之前需要使用 npm 命令安装指定插件,并通过 require() 引入到配置文件中。比如:
npm i html-webpack-plugin -D \\ 安装 html-webpack-plugin 插件
引入
const HtmlWebpackPlugin = require('html-webpack-plugin'); \\ 引入插件
配置
插件(Plugins)是一个数组,可以通过实例化对应的插件并配置所需的选项引入插件以拓展 webpack 更多的功能。
plugins: [
new HtmlWebpackPlugin({
template : path.join(__dirname,'./src/index.html'),
filename : 'index.html',
minify : {
removeComments: true, // 移除页面中的注释
collapseWhitespace: true, // 合并空白字符
removeAttributeQuotes: true, // 移除属性节点上的引号
}
})
],
常用的插件有:
- html-webpack-plugin:生成一个 HTML 文件(不配置 template 则自动生成一个 HTML 结构的文件,否则根据 template 指向的模板生成 HTML 文件)并自动绑定其他打包好的内容,比如 JS、CSS
- mini-css-extract-plugin:将 CSS 单独抽离出来形成一个 css 文件
- optimize-css-assets-webpack-plugin:优化压缩 CSS 资源,使其体积更小
更多插件可访问>>>WebPack Plugins
解析(Resolve)
解析(Resolve)用于配置并告诉 webpack 如何解析各模块内容,比如我们可以配置将 @ 字符解析为 src/ 路径。
resolve: {
alias: {
'@': path.resolve(__dirname, 'src/'),
}
}
模块(module)
模块(module)用来设置 webpack 如何处理不同的模块,比如上面提到的加载器(Loader)就是在 module.rules 下配置的。
优化(Optimization)
优化(Optimization)用来帮助 webpack 用户自定义一些优化配置选项。
开发服务器(DevServer)
开发服务器(DevServer)里配置的一些内容将会影响 webpack-dev-server 工具的使用。对于开发过程中类似跨域无法发起请求等问题,我们可以通过配置该选项在开发阶段临时解决。
// 配置代理 解决跨域问题
devServer: {
proxy: {
'/': {
target: 'https://api.music.quietguoguo.com/',
changeOrigin: true,
secure: true,
}
},
}
更多 WebPack 配置问题,建议访问官网查看文档:













