Webpack

https://www.cnblogs.com/tugenhua0707/p/11317557.html#_labe6

Webpack本质上是一种事件流的机制,它的工作流程就是将各个插件串联起来,而实现这一切的核心就是Tapable,或者叫做发布订阅模式,或观察者模式。webpack中最核心的负责编译的Compiler和负责创建bundle的Compilation都是Tapable的实例

四大核心:entry,output,loader和plugin
其他:resolve,dev-server
entry

output
总结:通过entry和output,可以实现简单的webpack打包
https://www.jianshu.com/p/1192cfd4a012

loader(翻译器?)

### 可进行预处理, module模块中进行
sass,less --> css
vue,jsx,ts --> js
es6,es7-->es5

常见loader:
raw-loader:加载文件原始内容(utf-8)
file-loader:把文件输出到一个文件夹中,在代码中通过相对 URL 去引用输出的文件 (处理图片和字体)
url-loader:与 file-loader 类似,区别是用户可以设置一个阈值,大于阈值时返回其 publicPath,小于阈值时返回文件 base64 形式编码 (处理图片和字体)
source-map-loader:加载额外的 Source Map 文件,以方便断点调试
svg-inline-loader:将压缩后的 SVG 内容注入代码中
image-loader:加载并且压缩图片文件
json-loader 加载 JSON 文件(默认包含)
handlebars-loader: 将 Handlebars 模版编译成函数并返回
babel-loader:把 ES6 转换成 ES5
ts-loader: 将 TypeScript 转换成 JavaScript
awesome-typescript-loader:将 TypeScript 转换成 JavaScript,性能优于 ts-loader
style-loader:将 CSS 代码注入 JavaScript 中,通过 DOM 操作去加载 CSS
css-loader:加载 CSS,支持模块化、压缩、文件导入等特性
postcss-loader:扩展 CSS 语法,使用下一代 CSS,可以配合 autoprefixer 插件自动补齐 CSS3 前缀
eslint-loader:通过 ESLint 检查 JavaScript 代码
tslint-loader:通过 TSLint检查 TypeScript 代码
vue-loader:加载 Vue.js 单文件组件
i18n-loader: 国际化
cache-loader: 可以在一些性能开销较大的 Loader 之前添加,目的是将结果缓存到磁盘里

css module/postcss.config.js-autoprefixer

plugin
webpack支柱

常见plugin:??
define-plugin:定义环境变量 (Webpack4 之后指定 mode 会自动配置)
ignore-plugin:忽略部分文件
html-webpack-plugin:简化 HTML 文件创建 (依赖于 html-loader)
web-webpack-plugin:可方便地为单页应用输出 HTML,比 html-webpack-plugin 好用
uglifyjs-webpack-plugin:不支持 ES6 压缩 (Webpack4 以前)
terser-webpack-plugin: 支持压缩 ES6 (Webpack4)
webpack-parallel-uglify-plugin: 多进程执行代码压缩,提升构建速度
mini-css-extract-plugin: 分离样式文件,CSS 提取为独立文件,支持按需加载 (替代extract-text-webpack-plugin)
serviceworker-webpack-plugin:为网页应用增加离线缓存功能
clean-webpack-plugin: 目录清理
ModuleConcatenationPlugin: 开启 Scope Hoisting
speed-measure-webpack-plugin: 可以看到每个 Loader 和 Plugin 执行耗时 (整个打包耗时、每个 Plugin 和 Loader 耗时)
webpack-bundle-analyzer: 可视化 Webpack 输出文件的体积 (业务组件、依赖第三方模块)

resolve
[alians, extension(遇到无后缀文件依次匹配)]

dev-server
启动本地服务器

例1.Loader和Plugin的区别
1.Loader 本质是一个函数,作用是转换。(因为 Webpack 只认识 JavaScript,所以 Loader 就成了翻译官,对其他类型的资源进行转译的预处理工作)
2.Plugin 是插件,基于事件流框架 Tapable,扩展 Webpack 的功能。在 Webpack 运行的生命周期中会广播许多事件,Plugin 可以监听这些事件,在合适的时机通过 Webpack 提供的 API 改变输出结果。


image.png

Loader 在 module.rules 中配置,作为模块的解析规则,类型为数组。每一项都是一个 Object,内部包含了 test(类型文件)、loader、options (参数)等属性。
Plugin 在 plugins 中单独配置,类型为数组,每一项是一个 Plugin 的实例,参数都通过构造函数传入。

例2.Webpack构建流程
1.初始化:启动构建,读取与合并配置参数,加载 Plugin,实例化 Compiler
2.编译:从 Entry 出发,针对每个 Module 串行调用对应的 Loader 去翻译文件的内容,再找到该 Module 依赖的 Module,递归地进行编译处理
3.输出:将编译后的 Module 组合成 Chunk,将 Chunk 转换成文件,输出到文件系统中

你可能感兴趣的:(Webpack)