前言
Webpack 是一款用于现代 JavaScript 应用程序的模块打包工具(module bundler)。它把项目中的所有依赖,包括JavaScript文件、CSS、图片、字体等静态资源,按照你定义的规则和配置,打包成一个或多个优化过的静态文件。这些打包后的文件可以被浏览器加载并运行,使得你的应用可以在Web上运行。
尽管市场上诞生了众多打包工具,如 Vite、Parcel、Rollup 等,但是 Webpack 凭借拥有着极其丰富的生态系统,仍在模块打包工具中一直保持着领先地位。这里带大家,一起介绍、学习下 Webpack 的初步应用和核心概念。
一. Webpack 详细介绍
1. 介绍和理解
首先,Webpack是一个款前端构建工具,用来进行模块化打包,通过loader转换文件,通过plugin注入钩子,最后输出由多个模块组合成的打包文件。
2. 五大核心概念
Entry(入口)
Output(输出)
Loaders(加载器)
Plugins(插件)
Mode(模式)
3. 核心概念的具体定义
入口(Entry) :入口点指示 Webpack 应该从哪个或哪些模块开始打包。它可以是一个字符串(指向单个文件)、数组(指向多个文件)或一个对象(定义多个入口点)。Webpack 会从这里开始递归地查找和处理依赖项。
输出(Output) :输出配置决定了输出文件的名称、路径和格式。通常情况下,你需要指定输出文件的目录(
output.path
)和文件名(output.filename
)。Webpack 会将所有模块及其依赖项打包到这个指定的输出文件中。加载器(Loader) :加载器允许 Webpack 处理非 JavaScript 文件。加载器本质上是可配置的函数,它们接受模块源代码作为输入并输出转换后的代码。例如,你可以使用
babel-loader
来将现代 JavaScript 转换为浏览器兼容的代码,或者使用file-loader
来处理图片和字体文件。插件(Plugin) :插件是具有更广泛功能的 Webpack 扩展点,可以修改编译结果、优化输出、注入 HTML 文件等。插件在特定的时机运行,可以执行更复杂的任务,比如清理旧的 build 文件、压缩代码、生成 source map 等。
模式(mode):Webpack 支持两种模式:development 和 production。每种模式都有默认的优化设置,例如在生产模式下会自动开启代码压缩。
二.Webpack 初步使用
1. 创建测试环境
首先,我们模拟项目目录,分别创建public、src文件夹,以及 public>index.html 文件和src>main.js>、src>js>clone.js、src>js>sum.js文件,用于初步环境的应用,然后在文件夹中分别写入文件内容。
首先是, src > js > clone.js、
// clone.js
export default function Clone(obj) {
console.log("Clone.js")
if (typeof obj !== "object" || obj === null) { return obj }
let res = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
res[key] = deepClone(obj[key]);
}
}
return res;
}
然后是,src > js > sum.js、
// sum.js
export default function Sum(...arr) {
console.log("Sum.js")
return arr.reduce((prev, cur) => prev + cur, 0)
}
src > main.js、
// main.js
import Clone from "./js/clone"
import Sum from "./js/sum"
var obj = {
name: "longlong",
age: 18,
status: {
hoppy: "sduty",
}
}
console.log(Sum(1, 2, 3, 4, 5), 123)
console.log(Clone(obj.name = "test"), obj, 456)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Webpack</title>
</head>
<body>
<h1>Webpack 初步使用</h1>
<script src="../src/main.js"></script>
</body>
</html>
最后,我们打开 index.html 文件
可以看到控制台直接报错,这个报错表示在一个没有被视为模块的 JavaScript 文件中使用了 import
语句。这是因为ES6模块语法,在浏览器中是并不识别的,而JavaScript 文件在浏览器和 Node.js 环境中使用的是非模块化的脚本语法(也称为脚本模式)。在这种模式下,import
和 export
语句是无效的。
所以如果你在非模块化的 JavaScript 文件中使用 import
语句,会导致 Uncaught SyntaxError: Cannot use import statement outside a module
错误。
要使用模块语法,需要明确告诉 JavaScript 运行时环境(浏览器或 Node.js)该文件应该被当作一个模块处理。这时候就需要用到 Webpack 进行编译,构建成浏览器能识别的语法。
2. 初步实际应用
(1)初始化命令
要想使用 Webpack 构建工具,我们需要把依赖包下载下来才能使用,所以这里我们首先需要,初始化一个新的 npm 项目。直接在文件夹根目录,执行以下命令,生成 package.json
初始文件
npm init -y
这里的npm init -y
是 Node.js 包管理器(npm)提供的一个命令,用于快速初始化一个新的 npm 项目。这个命令的作用是创建一个默认的 package.json
文件,包含项目的基本配置信息。
可以看到根目录执行 npm init -y ,生成 package.json
文件。
(2)修改路径
这里需要将 package.json
文件中的主文件路径"main": "index.js",修改成自己需要的路径
"main": "./src/main.js",
(3)安装打包工具和命令行工具
直接执行以下命令,安装到开发环境,依赖项仅在开发过程中需要,而不是在生产环境中
npm i webpack webpack-cli -D
安装介绍:
Webpack 是一个静态模块打包工具,用于将应用程序的所有依赖(包括 JavaScript、CSS、图像等)打包成一个或多个优化过的文件。
Webpack CLI(命令行界面)是 Webpack 的命令行工具,用于与 Webpack 进行交互。它允许开发者通过命令行配置和运行 Webpack 的打包过程。
安装完成后,可以在 package.json
文件中看到,同时还会生成 node_modules 文件,
然后就就可以执行 webpack 相关命令了。
(4)注意事项
webpack代码外层文件不能有中文,且必须是安装了nodejs才能使用。
文件名字,就是 "name": "wpbk_init",不能以 webpack 命名,容易冲突,可能会出现 npm init -y 安装不下来的情况。
(5)执行打包命令,启用 Webpack
执行以下命令时,会使用webpack ,指定打包文件./src/main.js,并且输出到开发环境/生产环境
npx webpack ./src/main.js --mode=development
// 打包指定文件./src/main.js,输出到开发环境
npx webpack ./src/main.js --mode=production
// 打包指定文件./src/main.js,输出到生产环境
打包完成后,会生成 dist 目录
和打包信息
(6)打包结果
这里我们直接将 index.html 中的 src>main.js 路径,换成打包后 dist>main.js 文件路径
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Webpack</title>
</head>
<body>
<h1>Webpack 初步使用</h1>
<script src="../dist/main.js"></script>
</body>
</html>
然后打开控制台,查看,
可以看到 main.js 中的函数执行成功。
(7)打包区别
One. 开发环境
执行 npx webpack ./src/main.js --mode=development 后,
npx webpack ./src/main.js --mode=development
命令使用开发模式进行打包,生成未压缩的代码,支持调试和源映射,适合开发过程中使用。
Two. 生产环境
执行 npx webpack ./src/main.js --mode=production 后,
npx webpack ./src/main.js --mode=production
命令使用生产模式进行打包,生成经过优化和压缩的代码,适合部署到生产环境。
当然,开发和生产环境,代码同样都没有问题,可以正常执行。
(8)小结
- Webpack打包的本质,就是将浏览器不能识别的语法,编译成浏览器能识别的语法。
- 这里执行打包命令后,如果更改sum.js、clone.js、main.js文件内容时不再生效,需要重新打包后生效。
Webpack 本身功能较少,只能处理 JS 资源,一旦遇到 CSS 等其它资源就会报错。所以我们学习 webpack ,就是主要学习如何处理其它资源。
(9)大致流程
1、npm init -y
// 初始化,生成package.json文件
2、./src/main.js
// 修改打包文件路径
3、npm i webpack webpack-cli -D
// 配置安装打包器和命令行工具
4、npx webpack ./src/main.js --mode=development
// 指定打包文件和输出到:开发环境
5、npx webpack ./src/main.js --mode=production
// 指定打包文件和输出到:生产环境
三. Webpack 扩展
除了以上的简单应用,还有一些其他重要的核心概念和配置选项,这些对于高级使用和优化 Webpack 配置非常重要。请看以下
1. Modules(模块)
Webpack 的核心是模块化打包。模块可以是 JavaScript 文件、CSS 文件、图片或其他资源。Webpack 会递归地解析入口文件的所有依赖,将其打包到输出文件中。模块化的好处在于代码分离和重用,能让项目更加结构化和可维护。
2. Chunk(代码块)
Chunk 是 Webpack 生成的一个代码块,它包含了多个模块。Webpack 在构建过程中将代码拆分成不同的 chunks,以实现更高效的加载和优化。Chunk 使得按需加载、懒加载和代码分割成为可能。
3. Configuration(配置)
Webpack 通过 webpack.config.js
文件进行配置。这些配置选项定义了 Webpack 如何处理、打包和优化项目中的文件。配置文件可以包含 entry、output、module、plugins、resolve 等部分。
4. DevServer(开发服务器)
webpack-dev-server
提供了一个本地开发服务器,支持实时重新加载和热模块替换。它能够提升开发效率,使得每次代码修改后不需要手动刷新浏览器即可查看更改效果。
5. HMR(Hot Module Replacement,热模块替换)
HMR 是一种开发模式下的功能,允许你在应用运行时替换、添加或删除模块,而无需完全刷新页面。这极大地提高了开发效率,避免了重新加载应用的开销。
6. Tree Shaking(树摇)
Tree Shaking 是一种优化技术,用于去除未使用的代码。它依赖于 ES6 的模块系统,通过静态分析来确定哪些代码实际上被使用,从而移除那些未被引用的部分,减小最终包的体积。
7. Code Splitting(代码分割)
Code Splitting 允许将应用程序的代码拆分成多个 chunks,这样可以按需加载或并行加载。Webpack 支持几种不同的代码分割方法,包括:
- 入口点代码分割:通过多个入口点拆分代码。
- 动态导入:使用
import()
函数进行按需加载。 - Vendor 分割:将第三方库单独打包,减少主应用的体积。
8. Optimization(优化)
Webpack 提供了多种优化选项来提升构建效率和最终文件的性能:
- 代码压缩:使用插件如
TerserPlugin
进行代码压缩。 - 长效缓存:通过哈希值来优化浏览器缓存。
- 去重:自动移除重复的依赖。
- 分离 runtime 和 manifest:优化 Webpack 的运行时和 manifest 文件。
9. Resolve(解析)
resolve
配置选项告诉 Webpack 如何寻找模块的文件,包括模块的路径、扩展名、别名等。这有助于简化模块导入路径和提高构建效率。
10. Alias(别名)
Alias 配置用于简化模块的引用路径。通过为常用路径设置别名,可以减少模块导入的复杂性,使代码更加简洁和易于维护。
11. 关键技术,实际应用
- 热加载:
webpack-dev-server
和 HMR 是提高开发效率的工具,使得代码更改能即时反映在浏览器中。- 性能优化:通过 Tree Shaking、Code Splitting 和优化配置来减小最终输出文件的体积,提高应用性能。
这些概念和技术的合理应用可以使 Webpack 成为一个强大的构建工具,帮助我们高效地开发、构建和优化现代 JavaScript 应用。后续有时间,持续更新
四. 更多,请看
Webpack 官网https://webpack.js.org/
Webpack 中文网https://webpack.docschina.org/