Webpack 基础配置
概述
Webpack 是一个 JavaScript 静态模块打包器,当 webpack 处理应用程序时,它会递归地创建一个依赖关系图,包含应用程序的每个模块,然后将所有模块打包成一个或多个 bundle。
主要作用:
- 打包:把多个 JS 文件打包成一个文件,减少服务器压力和下载带宽
- 转换:把扩展语言转换成普通 JS,让浏览器顺利运行
- 优化:随着前端复杂度提升,webpack 肩负起优化和提升的责任
安装
bash
yarn init -y
yarn add webpack webpack-cli -D
# 打包命令
npx webpackyarn init -y
yarn add webpack webpack-cli -D
# 打包命令
npx webpackWebpack 可以进行 0 配置,默认直接支持 JS 模块化。
手动配置
默认配置文件:webpack.config.js
js
const path = require('path')
module.exports = {
mode: 'development', // development 不压缩 | production 压缩一行
entry: './src/index.js', // 入口文件
output: {
filename: 'bundle.[hash:8].js', // 添加 hash 戳解决缓存,:8 只显示 8 位
path: path.resolve(__dirname, 'dist'), // 必须使用绝对路径
},
}const path = require('path')
module.exports = {
mode: 'development', // development 不压缩 | production 压缩一行
entry: './src/index.js', // 入口文件
output: {
filename: 'bundle.[hash:8].js', // 添加 hash 戳解决缓存,:8 只显示 8 位
path: path.resolve(__dirname, 'dist'), // 必须使用绝对路径
},
}指定配置文件:npx webpack --config <文件名>
json
// package.json
"scripts": {
"build": "webpack --config webpack.config.js"
}// package.json
"scripts": {
"build": "webpack --config webpack.config.js"
}devServer 开发服务器
bash
yarn add webpack-dev-server -Dyarn add webpack-dev-server -Djs
module.exports = {
devServer: {
port: 3000,
progress: true, // 打包进度条
contentBase: './build', // 静态服务路径
open: true, // 自动打开浏览器
},
}module.exports = {
devServer: {
port: 3000,
progress: true, // 打包进度条
contentBase: './build', // 静态服务路径
open: true, // 自动打开浏览器
},
}json
"scripts": { "dev": "webpack-dev-server" }"scripts": { "dev": "webpack-dev-server" }html-webpack-plugin
自动创建 HTML 文件并引入打包资源:
bash
yarn add html-webpack-plugin -Dyarn add html-webpack-plugin -Djs
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html',
minify: {
removeAttributeQuotes: true, // 删除双引号
collapseWhitespace: true, // 压缩为一行
},
hash: true, // 添加 hash 戳
}),
],
}const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html',
minify: {
removeAttributeQuotes: true, // 删除双引号
collapseWhitespace: true, // 压缩为一行
},
hash: true, // 添加 hash 戳
}),
],
}Loader 基础
Loader 的特点:希望单一;从右向左执行,从下到上执行。
js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
{ loader: 'style-loader', options: { insertAt: 'top' } },
'css-loader',
],
},
{
test: /\.scss$/,
// 顺序从右向左:先 sass-loader 处理 sass,再 css-loader,最后 style-loader
use: ['style-loader', 'css-loader', 'sass-loader'],
},
],
},
}module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
{ loader: 'style-loader', options: { insertAt: 'top' } },
'css-loader',
],
},
{
test: /\.scss$/,
// 顺序从右向左:先 sass-loader 处理 sass,再 css-loader,最后 style-loader
use: ['style-loader', 'css-loader', 'sass-loader'],
},
],
},
}安装:yarn add css-loader style-loader -D、yarn add sass-loader node-sass -D
Hash 类型
| 类型 | 说明 |
|---|---|
hash | 跟整个项目构建相关,所有文件 hash 值一样,一改全改 |
chunkhash | 根据不同入口文件构建对应的 chunk,生成对应的 hash |
contenthash | 由文件内容产生的 hash,内容不同则 hash 不同 |
实际中一般用 contenthash 来最大化利用浏览器缓存。
Resolve 配置
js
module.exports = {
resolve: {
modules: [path.resolve('node_modules')], // 模块查找目录
alias: { '@': path.resolve(__dirname, 'src') }, // 别名
mainFields: ['style', 'main'], // 先查找 style 字段
extensions: ['.js', '.css', '.json'], // 省略扩展名时从左至右查找
},
}module.exports = {
resolve: {
modules: [path.resolve('node_modules')], // 模块查找目录
alias: { '@': path.resolve(__dirname, 'src') }, // 别名
mainFields: ['style', 'main'], // 先查找 style 字段
extensions: ['.js', '.css', '.json'], // 省略扩展名时从左至右查找
},
}命令行参数
js
// process.argv:数组,最后一位可取到 -- 后的参数
// process.env.npm_lifecycle_event:取 script 脚本里的命令
// process.env.npm_config_cdn:运行 npm run build --cdn 返回 true // process.argv:数组,最后一位可取到 -- 后的参数
// process.env.npm_lifecycle_event:取 script 脚本里的命令
// process.env.npm_config_cdn:运行 npm run build --cdn 返回 true
Cao Note