Webpack 笔记
Webpack的作者:Tobias Koppers
诞生的起源
webpack 是为了实现code splitting,帮助大型 web 应用提升性能。
本质
Webpack 本质是模块打包程序,只识别javaScript 语言。在开发一个应用的时会用到各种各样的第三方模块,通过 Webpack 可以将这些模块抽离到一起形成一个模块。但是当项目特别巨大的时候,如果只要一个包那么首次加载的时候肯定很慢,所以可以利用 Webpack 进行代码拆分,实现 web 项目的按需加载。对于多页面入口来说,一个入口就生成一个模块,对于单页面来说,可以对路由进行懒加载操作,实现一个路由打包成一个模块。
什么是 Webpack 模块
有外部依赖关系的,对 webpack 来说都是模块,如:
- ES2015
import语句 - CommonJS
require()语句 - AMD
define和require语句 - css/sass/less 文件中的
@import语句。 - 样式(
url(...))或 HTML 文件(img src=...)中的图片链接(image url)
四个核心概念
entry:让Webpack知道从哪里开始来构建其内部依赖图。output:输出打包出来的文件的位置。loader:将非JavaScript文件的模块编译成webpack 能够有效处理的模块。plugins:做一些范围更广的任务,如压缩代码、抽离CSS文件、HTML文件等。
webpack 模块路径解析规则
Webpack 使用 enhanced-resolve 来解析文件路径,resolver 帮助 webpack 找到 bundle 中需要引入的模块代码。
引入绝对路径时,不需要额外解析
相对路径解析
import "../src/file1";
import "./file2";
- 查找相对当前模块的路径下是否有对应文件或文件夹
- 如果是文件,且路径具有文件扩展名,则被直接将文件打包
- 否则,将使用
resolve.extensions选项作为文件扩展名来解析 - 如果是文件夹找
package.json的main字段 - 没有 main 字段就找
index.js - 如果都没找到,解析失败
模块路径
import "module";
import "module/lib/file";
- 模块目录解析时将在
resolve.modules中指定的所有目录内搜索。resolve.alias可以用来替换路径 - 如诺未指定,查找当前文件目录下,父级目录及以上目录下的
node_modules文件夹 - 检查路径是否指向文件或目录
- 如果路径指向一个文件,且路径具有文件扩展名,则被直接将文件打包
- 否则,将使用
resolve.extensions选项作为文件扩展名来解析 - 如果路径指向一个文件夹,且包含
package.json文件,则按照顺序查找resolve.mainFields配置选项中指定的字段 - 如果
package.json文件不存在或者package.json文件中的 main 字段没有返回一个有效路径,则按照顺序查找resolve.mainFiles配置选项中指定的文件名
Manifest 是什么?
Webpack 打包编译后的代码,import 或者 require 会转化为 __webpack_require__
manifest包含了runtime候的基础公共依赖。在浏览器运行时,Webpack用来连接模块化的应用程序的所有代码。runtime 在模块交互时,连接模块所需的加载和解析逻辑。包括浏览器中的已加载模块的连接,以及懒加载模块的执行逻辑。

浙公网安备 33010602011771号