官⽅⽹站:https://webpack.js.org/
概念
webpack is a module bundler(模块打包⼯具)
Webpack是⼀个打包模块化JavaScript的⼯具,它会从⼊⼝模块出发,识别出源码中的模块化导⼊语句,递
归地找出⼊⼝⽂件的所有依赖,将⼊⼝和其所有的依赖打包到⼀个单独的⽂件中。
是⼯程化、⾃动化思想在前端开发中的体现
安装webpack
环境准备
nodeJs https://nodejs.org/en/
版本参考官⽹发布的最新版本,可以提升webpack的打包速度
全局安装 不推荐
# 安装webpack V4+版本时,需要额外安装webpack-cli
npm install webpack webpack-cli -g
# 检查版本
webpack -v
# 卸载
npm uninstall webpack webpack-cli -g
全局安装webpack,这会将你项⽬中的webpack锁定到指定版本,造成不同的项⽬中因为webpack依赖不同版
本⽽导致冲突,构建失败
项⽬安装 推荐
# 安装最新的稳定版本
npm i -D webpack
# 安装指定版本
npm i -D [email protected]<version>
# 安装最新的体验版本 可能包含bug,不要⽤于⽣产环境
npm i -D [email protected]
# 安装webpack V4+版本时,需要额外安装webpack-cli
npm i -D webpack-cli
检查安装
webpack -v //command not found 默认在全局环境中查找
npx webpack -v // npx帮助我们在项⽬中的node_modules⾥查找webpack
./node_modules/.bin/webpack -v //到当前的node_modules模块⾥指定webpack
启动webpack执⾏构建
webpack默认配置
webpack默认⽀持JS模块和JSON模块
⽀持CommonJS Es moudule AMD等模块类型
webpack4⽀持零配置使⽤,但是很弱,稍微复杂些的场景都需要额外扩展
默认配置 0配置:
const path = require("path");
module.exports = {
// 必填 webpack执⾏构建⼊⼝
entry: "./src/index.js",
output: {
// 将所有依赖的模块合并输出到main.js
filename: "main.js",
// 输出⽂件的存放路径,必须是绝对路径
path: path.resolve(__dirname, "./dist")
}
};
执⾏构建
# npx⽅式
npx webpack
npx 会自动查找当前依赖包中的可执行文件,如果找不到,就会去全局 里找。如果依然找不到,就会帮你安装。
# npm script
npm run dev
修改package.json⽂件:
"scripts": {
"dev": "webpack"
},
原理就是通过shell脚本在node_modules/.bin⽬录下创建⼀个软链接。
package-lock.json 用来锁定安装的包版本和记录版本信息的。
构建成功
我们会发现⽬录下多出⼀个 dist ⽬录,⾥⾯有个 main.js ,这个⽂件是⼀个可执⾏的JavaScript⽂件,⾥⾯包含webpackBootstrap启动函数。
webpack配置核⼼概念
何为零配置
何为配置文件
entry
output
mode
loader
plugin
chunk
module
bundle
零配置
零配置是很弱的,特定的需求,总是需要⾃⼰进⾏配置
webpack有默认的配置⽂件,叫 webpack.config.js ,我们可以对这个⽂件进⾏修改,进⾏个性化配置
使⽤默认的配置⽂件:webpack.config.js
使⽤⾃定义配置⽂件: ⽐如webpackconfig.js,可以通过--config webpackconfig.js来指定webpack使⽤哪个配置⽂件来执⾏构建
"scripts": {
"dev": "webpack --config ./webpackconfig.js"
},
配置文件
webpack.config.js配置基础结构
const path = require('path')
module.exports = {
//打包⼊⼝⽂件
entry: "./src/index.js",
//出口
output: {
// 输出资源的存放位置,必须是绝对路径
path: path.resolve(__dirname, "./dist"),
// 资源名称
filename: "main.js"
},
//打包环境 默认生产模式
// production development none
mode: "production",
module: {
rules: [
//loader模块处理
{
test: /\.css$/,
use: "style-loader"
}
]
},
plugins: [new HtmlWebpackPlugin()] //插件配置
};
entry output
入口文件
定义方式:string object array
// string
entry: "./src/index.js"
// object
// 入口
entry: {
other: "./src/index.js",
a: "./src/a.js"
},
//出口
output: {
// 输出资源的存放位置,必须是绝对路径
path: path.resolve(__dirname, "./dist"),
// 资源名称 占位符 多入口对应多出口就可以使用 占位符的方式
// 占位符 [name] [hash] [chunkhash] [contenthash]
// [hash] [name]-[hash].js hash是指构建当前文件的版本号,当文件内容发生改变,会触发hash值更新
// [hash:6] [name]-[hash:6].js 生成 hash 版本号的 前 6 位
filename: "[name]-[chunkhash].js"
},
dist 目录里生产 other.js,a.js 2个文件
// spa 单页面应用 也可以理解为单入口
// mpa 多页面应用,利于 seo
mode
// none development production
设置mode可以⾃动触发webpack内置的函数,达到优化的效果
开发阶段的开启会有利于热更新的处理,识别哪个模块变化
⽣产阶段的开启会有帮助模块压缩,处理副作⽤等⼀些功能
none: 设置为none时,很多自支持的插件是不开启的
moudle loader
moudle
模块,在 Webpack ⾥⼀切皆模块,⼀个模块对应着⼀个⽂件。Webpack 会从配置的 Entry 开始递归找出所有依赖的模块。
当webpack处理到不认识的模块时,需要在webpack中的module处进⾏配置,当检测到是什么格式的模块,使⽤什么loader来处理。
loader
模块解析,模块转换器,⽤于把模块原内容按照需求转换成新内容。
webpack是模块打包⼯具,⽽模块不仅仅是js,还可以是css,图⽚或者其他格式
但是webpack默认只知道如何处理js和JSON模块,那么其他格式的模块处理,和处理⽅式就需要loader了
module: {
rules: [
// 每一个loader所处理的功能都非常单一,css-loader只是帮助webpack处理css模块,将css编译进资源文件里
// 需要使用 style-loader 将css放到head里,让样式生效
{
test: /\.css$/,
// 多个loader是有执行顺序的,默认从右向左,可以通过配置改成从左向右
// 从右向左 compose
// 从左向右 pipe
// css-loader 分析css模块之间的关系,并合成⼀个css,
// 当css-loader处理完后,将结果返回给 style-loader 去处理
// style-loader 会把css-loader⽣成的内容,以style挂载到⻚⾯的heade部分
use: ["style-loader", "css-loader"]
},
{
test: /\.png$/,
use: ["file-loader"]
},
]
}
plugins
plugins: [
new htmlWebpackPlugin({
// 指定以哪一个html文件为模板
template: "./src/index.html",
// 生成的html文件名,默认为 index.html
filename: "laohan.html"
}),
// 清理函数,每次构建时先将输出目录里文件清空后再生成构建后的文件
new CleanWebpackPlugin()
]
bundle
output输出的资源文件就叫 bundle 文件
chunk
chunk 是指代码片段
bundle、chunk、module 三者之间的关系
chunk是指模块内代码被webpack处理后形成 webpack 输出文件内,eval所有执行的代码。当模块内代码有依赖文件时,就会生成二个chunk,形成chunks。
所以一个chunk对应一个模块,一个chunks对应一个或多个模块,一个bundle文件包含一个或多个chunk,也就是对应一个chunks。