Webpack 简介

Webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 Webpack 处理应用程序时,会在内部从一个或多个入口点构建一个 依赖图① 然后将你项目中所需要的模块组合成一个或多个 bundles他们均为静态资源,用于展示你的内容。
注:
每当一个文件依赖另一个文件时,webpack都会将文件视为直接存在 依赖关系这使得webpack可以获取非代码资源,如 images 或 web 字体等,并把他们作为 依赖 提供给应用程序。当 webpack 处理应用程序时,它会根据命令行参数中或配置文件中定义的模块列表开始处理。 从 入口__ 开始,webpack 会递归的构建一个 依赖关系图,这个依赖图包含着应用程序中所需的每个模块,然后将所有模块打包为少量的 bundle —— 通常只有一个 —— 可由浏览器加载

开发准备

我们先在桌面新建一个 works 的文件夹拖入 VsCode ,在 works 下新建一个 app 文件夹和 index.html 文件,在 app 下新建 hello.js 和 index.js 来编写下面代码。

  1. // hello.js
  2. function Hello() {
  3. console.log('Hello 索大')
  4. }
  1. // index.js
  2. Hello()
  1. // index.html
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  8. <title>Webpack 入门</title>
  9. </head>
  10. <body>
  11. <script src="./app/index.js"></script>
  12. <script src="./app/hello.js"></script>
  13. </body>
  14. </html>

我们来运行 index.html 发现控制台报错如下:
image.png
为什么出现这个原因呢?看下 index.html 代码,发现是我们的 js 文件引用顺序反了。修改一下引用顺序控制台便能正常打印出结果。
问题来了,这里我们只有两个js文件。如果有多个js文件呢?甚至有成百上千个js文件,我们要怎么处理?一个一改吗?着这显然是不可能的。这里我们的 Webpack 就登场了。

安装

前提条件

在开始之前请确保已经安装了 Node.js 的最新稳定版本(v10以上均可),没有安装的可以移步 Node.js专栏 进行安装

安装 Webpack

全局安装(不推荐)

全局安装后我们在任何目录都可以使用,但是不推荐大家在全局安装,因为不同项目之间公用一套 webpack配置 可能会导致构建失败,尤其是在多人协作开发时,构建可能也会存在问题,推荐本地安装webpack

  1. npm install webpack webpack-cli -g // 全局安装
  2. webpack -v // 查看webpack版本

本地安装(推荐)

在本地安装前需要先通过 npm 来安装一个包管理配置文件

  1. npm init -y // 生成项目配置文件 package.json,里面会展示我们项目安装的所有依赖
  2. npm install webpack webpack-cli -s // 本地安装

运行 Wepack

准备工作

我们将上面的 Hello 函数使用 ESModel模块化 的方式改写一下

  1. // hello.js
  2. export default function Hello() { // 通过 export default 将 Hello函数 暴露出去
  3. console.log('Hello 索大')
  4. }
  1. // index.js
  2. import Hello from './hello' // 通过 import xxx from '路径' 的方式引入暴露出来的 Hello 函数
  3. Hello()

然后我们直接在控制台运行 webpack ,发现会报错:
image.png
这里告诉我们找不到 main 模块在 src 中,所以我们应该将 上面的 app 文件夹改为 src 文件夹,然后再次运行 webpack ,我们的目录下多了一个dist的文件夹,打开发现生成了 main.js 文件,如下:
image.png
这个dist下的 main.js 就是 webpack 自动帮我们打包生成的,那么 main.js 是依赖那个文件的包呢?
我们在控制台输入如下指令查看:

  1. webpack --stats detailed

image.png
这里我们可以看到,这个 main.js 是从 src 中打包的,src中有一个 index.js 文件,这个文件就是 webpack 默认的打包入口文件,这个文件中加载了 Hello模块,webpack 会自动识别帮我们做代码分析,最后在main.js中生成代码。

Tip

我们上面运行 webpack 进行打包使用的并非本地的 webpack,我们来验证一下:

  1. npm uninstall webpack webpack-cli -g // 卸载全局的 webpack
  2. webpack // 运行 webpack 报错

这里我们要注意,使用本地的 webpack 需要使用下面命令:

  1. npx webpack // npx 的作用就是如果在你打包的目录没有找到 webpack 那么他就会去向上层寻找

思考:我们是否可以自己规定打包入口文件的路径和文件名呢?