webpack 4 入门指南 系列二(入门篇)

  • webpack是用来编译javascript模块的。

基本设置

  • 首先创建一个目录,初始化npm,本地安装webpack,以及安装webpack-cli(webpack命令行工具):
# win10 ps执行连续命令用 ; 替换 &&
mkdir webpack-demo && webpack-demo
npm init -y
npm install webpack webpack-cli --save-dev

project

  • 现在我们将创建以下目录结构和文件
   webpack-demo
  |- package.json
+ |- index.html
+ |- /src
+   |- index.js

src/index.js

function component() {
  var element = document.createElement('div');

  // 为了使 _ 生效,需要 Lodash 库, 现在是通过 script标签引用的
  element.innerHTML = _.join(['Hello', 'webpack'], ' ');

  return element;
}

document.body.appendChild(component());    

index.html

<!doctype html>
<html>
  <head>
    <title>Getting Started</title>
    <script src="https://unpkg.com/lodash@4.16.6"></script>
  </head>
  <body>
    <script src="./src/index.js"></script>
  </body>
</html>
  • 我们还需要调整 package.json文件以确保我们的包是私有的,同时移除了main入口。这是防止意外发布你的代码。

package.json

  {
    "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项目存在问题:
    • 无法明显的看出该脚本依赖于外部库。
    • 如果缺少依赖项或包含在错误的顺序中,则应用程序将无法正常运行。
    • 如果包含但未使用依赖项,则将强制浏览器下载不必要的代码。
  • 让我们使用webpack来管理这些脚本。

打包依赖(bundle)

  • 我们将要稍微调整下我们的目录结构,把源代码(/src)和分发代码(/dist)分开来。源代码是我们编写和编辑的代码。分发代码是我们在构建过程中优化和压缩的结果,将在浏览器中加载:

project

  webpack-demo
  |- package.json
+ |- /dist
+   |- index.html
- |- index.html
  |- /src
    |- index.js
  • 要将lodash依赖项与index.js捆绑在一起,我们需要在本地安装库:
npm install --save lodash

安装软件包到生产环境时,应该使用npm install --save。如果安装软件包是为了开发环境(比如 linter,测试包等等),那你就需要使用npm install --save-dev

src/index.js

  • 现在在脚本中引入 lodash
+ 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。因为已经在index.js中import了,让我们移除lodash的script标签, 并且用其他script标签加载构建生成的捆绑包而不是/src下的源代码文件:
  <!doctype html>
  <html>
   <head>
     <title>Getting Started</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可以使用此信息来构建依赖关系图。然后,它使用该图生成一个优化的包,其中js脚本将以正确的顺序执行。 话虽如此,让我们运行npx webpack,它将把src/中的 index.js脚本作为入口点,并生成dist/main.js作为输出。 npx命令需要Node 8.2 / npm 5.2.0或更高版本一起运行,它将执行我们在开头安装的webpack包的webpack二进制文件(./node_modules/.bin/webpack):
npx webpack

Hash: f786199817e635507cff
Version: webpack 4.15.1
Time: 3785ms
Built at: 2018-07-08 13:07:30
  Asset      Size  Chunks             Chunk Names
main.js  70.5 KiB       0  [emitted]  main
[1] (webpack)/buildin/module.js 497 bytes {0} [built]
[2] (webpack)/buildin/global.js 489 bytes {0} [built]
[3] ./src/index.js 222 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/concepts/mode/

你的输出可能会有所不同,但如果构建成功,那么你可以继续往下走了。另外,不要担心警告,我们稍后会解决。

  • 在浏览器中打开 index.html,如果配置都是正确的,你应该会看到“Hello webpack”。

模块

importexport语句已经在ES2J015中标准化,并且在大多数浏览器中都收支持。一些旧的浏览器仍然很落后不支持,但webpack支持开箱即用的模块。

  • 在幕后, webpack实际上“转换”了代码,以便旧浏览器也可以运行它。如果你查看dist/main.js,你就会发现了。除了importexport之外,webpack还支持各种其他模块语法。

  • 注意,webpack不会更改importexport语句以外的代码。如果你正在使用其他ES2015功能,请确保通过webpack的加载器系统使用Babel等转换器。

使用配置文件

  • 从版本4开始,webpack不需要任何配置,但大多数项目可能需要更复杂的设置,所以webpack支持配置文件的形式。与在命令行手动设置大量命令相比,配置文件方便的多。现在我们来创建一个配置文件来替换我们上面使用的命令行接口选项。

projcet

  webpack-demo
  |- package.json
+ |- webpack.config.js
  |- /dist
    |- index.html
  |- /src
    |- index.js

webpack.config.js

const path = require("path")

module.exports = {
  entry: "./src/index.js",
  output:{
    filename: "main.js",
    path: path.resolve(__dirname, "dist")
  }
}
  • 现在让我们使用配置文件重新构建一下:
npx webpack --config webpack.config.js
Hash: 17e2e6a019ab95135618
Version: webpack 4.15.1
Time: 3792ms
Built at: 2018-07-08 13:34:51
  Asset      Size  Chunks             Chunk Names
main.js  70.5 KiB       0  [emitted]  app
[1] (webpack)/buildin/module.js 497 bytes {0} [built]
[2] (webpack)/buildin/global.js 489 bytes {0} [built]
[3] ./src/index.js 224 bytes {0} [built]
    + 1 hidden module

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this v
alue. 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://w
ebpack.js.org/concepts/mode/

注意,windows上通过其路径调用webpack时必须使用反斜杠,例如node_modules.bin\webpack --config webpack.config.js

只要存在webpack.config.js,webpack命令就会默认使用它。我们这里使用config选项只是为了告诉你,你可以传递任意名字的配置文件。在配置项很复杂需要拆分到多个文件的时候,这是很有用的。

  • 配置文件比简单的命令行接口要灵活的多。通过这种方式可以指定加载器的规则(loader rules),插件(plugins),解析选项(resolve )和许多其他增强功能。

npm 脚本

  • 鉴于从命令行接口运行webpack的本地副本并不是特别有趣,我们可以设置一些快捷方式。我们将通过添加一个npm script来调整package.json
  {
    "name": "webpack-demo",
    "version": "1.0.0",
    "description": "",
    "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1",
+     "build": "webpack"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "devDependencies": {
      "webpack": "^4.0.1",
      "webpack-cli": "^2.0.9",
      "lodash": "^4.17.5"
    }
  }
  • 现在可以用npm run build代替我们之前的npx命令了。请注意,在scripts中,我们可以按照和npx一样的方式引用本地安装的npm软件包。此约定是大多数基于npm的项目的标准的,因为它允许所有贡献者使用相同的一组公共脚本(如果需要,每个脚本都带有--config标志)。

  • 现在执行以下命令,你将会看到你的脚本别名是否运行正常:

npm run build

> webpack-demo@1.0.0 build C:\Users\PC\workspace\IntellijProjects\branches\bleview\c
li\webpack-demo
> webpack

Hash: 17e2e6a019ab95135618
Version: webpack 4.15.1
Time: 441ms
Built at: 2018-07-08 13:50:09
  Asset      Size  Chunks             Chunk Names
main.js  70.5 KiB       0  [emitted]  app
[1] (webpack)/buildin/module.js 497 bytes {0} [built]
[2] (webpack)/buildin/global.js 489 bytes {0} [built]
[3] ./src/index.js 224 bytes {0} [built]
    + 1 hidden module

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this v
alue. 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://w
ebpack.js.org/concepts/mode/

通过在npm run build和你的参数之间使用两个破折号可以传递自定义参数。例如 npm run build -- --colors

总结

  • 既然你已经有了个基本框架,那你就可以继续学习接下来的指南资源管理,以了解如何使用webpack管理图像和字体等资源。此时你的项目应该如下所示:
webpack-demo
|- package.json
|- webpack.config.js
|- /dist
  |- main.js
  |- index.html
|- /src
  |- index.js
|- /node_modules

如果使用npm5, 你还可能看到package-lock.json文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容