- webpack5.x 在2021.10发布上线
webpack 入门
1、webpack 简介
webpack 是一个现代 JavaScript 应用程序的静态模块打包器 (module bundle),当 webpack 处理应用程序时,它会递归的构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或者多个的 bundle。
webpack 是一个打包模块化 JavaScript 的工具,它会从入口模块出发,识别出源码中的模块化导入语句,递归地找出入口文件的所有依赖,将入口和其所有的依赖打包到一个单独的文件中,是工程化、自动化思想在前端开发中的体现。
2、webpack 安装
环境准备
nodejs: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 init -y // 初始化 npm 配置文件
npm install --save-dev webpack // 安装核心库
npm install --save-dev webpack-cli // 安装命令行工具
// 安装最新的 4.x稳定版本
npm i -D webpack@4.44.0
// 安装指定版本
npm i -D wenpack@<version>
3、启动webpack
3.1 webpack 默认配置
- webpack 默认支持 js模块 和 json 模块
- 支持 CommonJS Es module AMD 等模块类型
- webpack4 支持零配置使用,但是很弱,稍微复杂些的场景都需要额外扩展
3.2 准备执行构建
- 新建src⽂件夹
- 新建src/index.js、src/index.json、src/other.js
// index.js
const json = require("./index.json"); // commonJS
import { add } from "./other.js"; // es module
console.log(json, add(2, 3));
// index.json
{
"name": "JOSN"
}
// other.js
export function add(n1, n2) {
return n1 + n2; }
3.3 执行构建
// npx 方式
npx webpack
// npm script
npm run bulid
修改package.json⽂件:
"scripts": {
"build": "webpack"
},
原理就是通过 shell 脚本在 node_modules/.bin 目录下创建一个软链接
3.4 构建成功
我们会发现目录下多出一个 dist 目录,里面有一个 main.js, 这个文件是一个可执行的 JavaScript 文件,里面包含 webpackBootstrap 启动函数。
- 一个自执行函数,参数是一个对象{},参数称为 依赖图谱 模块路径以及该模块被打包编译后生成的chunk(代码片段) eval()
3.5 默认配置
// wevpack.config.js
const path = require("path");
module.exports = {
// 必填 webpack执⾏构建⼊⼝
entry: "./src/index.js",
output: {
// 将所有依赖的模块合并输出到main.js
filename: "main.js",
// 输出⽂件的存放路径,必须是绝对路径
path: path.resolve(__dirname, "./dist")
}
};
4、webpack 配置核心概念
- chunk:指代码块,一个chunk 可能由多个模块组合而成,也用于代码合并与分割
- bundle:资源经过 webpack 流程解析编译后最终输出的成果文件
- entry:顾名思义,就是入口起点,用来告诉 webpack 用哪个文件作为构建依赖图的起点。webpack 会根据 entry 递归的去寻找依赖,每个依赖都将被它处理,最后输出到打包成果中
- output:output 配置描述了 webpack 打包的输出配置,包含输出文件的命名、位置等信息
- loader:默认情况下,webpack 仅支持 .js .json 文件,通过 loader,可以让它解析其他类型的文件,充当翻译官的角色。理论上只要有相对应的 loader,就可以处理任何类型的文件。
- plugin:loader 主要的职责是让 webpack 认识更多的文件类型,而 plugin 是职责是让其可以控制构建流程,从而执行一些特殊的任务。插件的功能非常强大,可以完成各种各样的任务
- webpack的功能补充
- mode:4.0开始,webpack支持零配置,旨在为开发人员减少上手难度,同时加入 mode 的概念,用于指定打包的目标环境,以便在打包过程中启用 webpack 针对不同环境下内置的优化
-
chunk chunks chunkNames
- chunk 代码片段 一个module 对应 一个 chunk
- chunks chunk组 (包含至少一个chunk(module))
-
bundle module
- 一个 bundle 对应一个chunkName (chunks)
- 一个 chunkName (chunks)包含至少一个 module(chunk)
-
loader
- 假如我们知道 webpack 只会编译处理 js json 格式的模块,那么怎么集成样式,图片,vue,jsx等模块呢?