Webpack 的基本使用

关键概念

  • Entry:入口文件(源代码入口)

  • Output:输出文件(分发代码)

  • Module:import、css 中的@importurl(...)<img src="..." />...

  • Chunk:打包时生成的模块

  • Bundle:打包完成的代码

  • Mode:development / production

  • Loader:用于加载模块时预处理文件

  • Plugins:提供自动生成 html 页面、清理、模块热替换等功能

  • Configuration:webpack.config.js

  • Dependency graph:从入口文件开始递归构建出,并由此进行打包

  • Runtime 和 Manifest:连接模块所需的加载和解析逻辑和模块标识集合

  • Hot Module Replacement:只更新模块, 而不用重载整个页面

  • Public Path

    • output.publicPath:项目中引用css、js、img等资源时候的一个基础路径
    • devServer.publicPath:打包后资源存放的位置

基本使用

安装

  • webpack
  • webpack-cli(对于 webpack 4+ 版本)

项目目录结构

webpack-demo
    |- package.json
  |- webpack.config.js
  |- /dist
    |- index.html
  |- /src
    |- index.js
  • webpack.config.js 为 webpack 配置文件
  • /dist 文件夹存放分发代码
  • /src 文件夹存放源代码

基础配置

// webpack.config.js

const path = require('path');

module.exports = {
  entry: './src/index.js', // 入口文件
  output: {
    filename: 'bundle.js', // 打包后的bundle文件
    path: path.resolve(__dirname, 'dist') // 分发代码存放的目录
  }
};

Webpack 可以接受多个 entry,但只能指定一个 output

加载资源

除 js 文件外,其他类型的文件需要使用额外的 loader 来加载。

加载CSS

webpack 根据正则表达式,来确定应该查找哪些文件,并将其提供给指定的 loader。在这种情况下,以 .css 结尾的全部文件,都将被提供给 style-loader css-loader

使用上述方式打包时,CSS 文件将会被编译成含有 CSS 字符串的 <style> 标签,并插入到 html 文件的 <head> 中。当样式文件较大时可以利用 extract-text-webpack-plugin 插件将 CSS 打包成独立的文件。

加载图片

图像将被处理并添加到分发代码存放的目录中。

管理输出

入口分离

Webpack 接受多入口(例如多页面应用程序中),且可以配置根据入口起点名称动态生成 bundle 名称:

打包后会在 /dist 目录下生成 print.bundle.jsapp.bundle.js 两个文件。

自动生成 index.html 并关联入口文件

title 属性用于指定生成的 index.html 中的<title>标签的内容。

配置该插件后则无需手动将各入口文件引入 index.html 中。

清理 /dist 文件夹

即清理掉未在项目中使用的文件。

提取公共入口 chunk

当多个入口文件都引用了同样的模块时,可以利用 [splitChunks] (https://webpack.js.org/plugins/split-chunks-plugin/) 插件在打包将该模块作为一个公共模块提取出来。

  • cacheGroups 中的每一个键值对为一个公共模块的配置
  • name 属性为生成的公共模块的名字
  • chunks 属性用于指定打包的 chunks 的类型(
    • 包含三个选项:initialasyncall
    • 分别针对非动态加载的模块和动态加载的模块(使用 import() 引入的模块)采用不同的打包方式

搭建开发环境

追踪源代码

使用JavaScript 提供的 source map 功能,将编译后的代码映射回原始源代码。

inline-source-map 适用于开发环境,source map 还有很多不同的选项,需根据生产/开发环境进行选择。

开发工具

  1. 观察模式

    使用该模式后修改依赖图中任意一个文件被更新时代码都会重新编译打包,而无需手动再次构建。

    • 添加脚本:"watch": "webpack --watch"
  2. webpack-dev-server

    该依赖提供了一个 web 服务器来实现实时重新加载。

    • NPM 安装 webpack-dev-server
    • 修改配置文件(如下图)
    • 添加脚本:"start": "webpack-dev-server --open"

模块热替换

HMR 只影响包含 HMR 代码的模块。

如果一个模块没有 HMR 处理函数,更新会冒泡,即,某个模块更新时,所依赖的模块均会重新加载。

启用方法

  • 修改配置文件

    • 引入 webpack 对象
    • 需要开启热替换的模块不应作为入口 js
    • dev server 设置 hot 模式
    • 引入 HotModuleReplacementPlugin
  • 对模块应用 HMR 处理函数

    如在使用 print.js 模块的 index.js 中:

支持模块热替换的框架

配置多环境

  1. 为不同环境创建独立的配置文件

    • webpack.common.js:通用配置

    • webpack.dev.js:开发环境配置

    • webpack.prod.js:生产环境配置

    可以使用 webpack-merge 在不同环境的配置文件中引入通用配置。

  1. 配置 NPM 脚本

    • 开发环境脚本

      "start": "webpack-dev-server --open --config webpack.dev.js"

    • 生产环境脚本

      "build": "webpack --config webpack.prod.js"

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

推荐阅读更多精彩内容