基本安装

首先我们创建一个目录,初始化 npm,然后 在本地安装 webpack,接着安装 webpack-cli(此工具用于在命令行中运行 webpack):

在 webpack4 之后webpack 和webpack-cli 已经分开,需要单独安装

1
2
3
mkdir webpack-demo && cd webpack-demo
npm init -y
npm install webpack webpack-cli --save-dev

注意:

由于npm安装走的是国外的网络,比较慢容易出现安装失败的现象。

可以用yarn安装,首先得全局安装yarn,npm install yarn -g

或使用nrm快速切换npm源,首先得全局安装nrm, npm install -g nrm

nrm 使用:

nrm ls 查看可选源。

nrm test npm 测试速度。看哪个快就use哪个。

nrm use cnpm 使用cnpm 。

现在我们将创建以下目录结构、文件和内容:

1
2
3
4
5
  webpack-demo
|- package.json
+ |- index.html
+ |- /src
+ |- index.js

src/index.js

1
2
3
4
5
6
7
8
9
10
function component() {
var element = document.createElement('div');

// Lodash(目前通过一个 script 脚本引入)对于执行这一行是必需的
element.innerHTML = _.join(['Hello', 'webpack'], ' ');

return element;
}

document.body.appendChild(component());

index.html

1
2
3
4
5
6
7
8
9
10
<!doctype html>
<html>
<head>
<title>起步</title>
<script src="https://unpkg.com/lodash@4.16.6"></script>
</head>
<body>
<script src="./src/index.js"></script>
</body>
</html>

我们还需要调整 package.json 文件,以便确保我们安装包是私有的(private),并且移除 main 入口。这可以防止意外发布你的代码。

如果你想要了解 package.json 内在机制的更多信息,推荐阅读 npm 文档

package.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  {
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
+ "private": true,
- "main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^4.0.1",
"webpack-cli": "^2.0.9"
},
"dependencies": {}
}

在此示例中,<script> 标签之间存在隐式依赖关系。index.js 文件执行之前,还依赖于页面中引入的 lodash。之所以说是隐式的是因为 index.js 并未显式声明需要引入 lodash,只是假定推测已经存在一个全局变量 _

使用这种方式去管理 JavaScript 项目会有一些问题:

  • 无法立即体现,脚本的执行依赖于外部扩展库(external library)。
  • 如果依赖不存在,或者引入顺序错误,应用程序将无法正常运行。
  • 如果依赖被引入但是并没有使用,浏览器将被迫下载无用代码。

让我们使用 webpack 来管理这些脚本。

创建一个 bundle 文件

首先,我们稍微调整下目录结构,将“源”代码(/src)从我们的“分发”代码(/dist)中分离出来。“源”代码是用于书写和编辑的代码。“分发”代码是构建过程产生的代码最小化和优化后的“输出”目录,最终将在浏览器中加载:

project

1
2
3
4
5
6
7
  webpack-demo
|- package.json
+ |- /dist
+ |- index.html
- |- index.html
|- /src
|- index.js

要在 index.js 中打包 lodash 依赖,我们需要在本地安装 library:

1
npm install --save lodash

在安装一个要打包到生产环境的安装包时,你应该使用 npm install --save,如果你在安装一个用于开发环境的安装包(例如,linter, 测试库等),你应该使用 npm install --save-dev。可以在 npm 文档 中查找更多信息。

现在,在我们的脚本中 import lodash

src/index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
+ import _ from 'lodash';
+
function component() {
var element = document.createElement('div');

- // Lodash, currently included via a script, is required for this line to work
+ // Lodash, now imported by this script
element.innerHTML = _.join(['Hello', 'webpack'], ' ');

return element;
}

document.body.appendChild(component());

现在,由于通过打包来合成脚本,我们必须更新 index.html 文件。因为现在是通过 import 引入 lodash,所以将 lodash <script> 删除,然后修改另一个 <script> 标签来加载 bundle,而不是原始的 /src 文件:

dist/index.html

1
2
3
4
5
6
7
8
9
10
11
  <!doctype html>
<html>
<head>
<title>起步</title>
- <script src="https://unpkg.com/lodash@4.16.6"></script>
</head>
<body>
- <script src="./src/index.js"></script>
+ <script src="main.js"></script>
</body>
</html>

在这个设置中,index.js 显式要求引入的 lodash 必须存在,然后将它绑定为 _(没有全局作用域污染)。通过声明模块所需的依赖,webpack 能够利用这些信息去构建依赖图,然后使用图生成一个优化过的,会以正确顺序执行的 bundle。

可以这样说,执行 npx webpack,会将我们的脚本作为入口起点,然后 输出main.js。Node 8.2+ 版本提供的 npx 命令,可以运行在初始安装的 webpack 包(package)的 webpack 二进制文件(./node_modules/.bin/webpack):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ npx webpack
Hash: 80ebcfbd18d60f0c47a0
Version: webpack 4.43.0
Time: 281ms
Built at: 2020-07-24 11:22:19
Asset Size Chunks Chunk Names
main.js 72.3 KiB 0 [emitted] main
Entrypoint main = main.js
[1] ./src/index.js 284 bytes {0} [built]
[2] (webpack)/buildin/global.js 472 bytes {0} [built]
[3] (webpack)/buildin/module.js 497 bytes {0} [built]
+ 1 hidden module

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/

WARNING in configuration(配置警告)
The ‘mode’ option has not been set. Set ‘mode’ option to ‘development’ or ‘production’ to enable defaults for this environment.(‘mode’ 选项还未设置。将 ‘mode’ 选项设置为 ‘development’ 或 ‘production’,来启用环境默认值。)

输出可能会稍有不同,但是只要构建成功,那么你就可以继续。并且不要担心,稍后我们就会解决。

在浏览器中打开 index.html,如果一切访问都正常,你应该能看到以下文本:’Hello webpack’。

hello word 就这样弄好了,是不是很简单呢