webpack的学习 | 青训营笔记

79 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

什么是webpack

webpack本质上是一周前端资源编译、打包工具

  • 多份资源文件打包成一个bundle
  • 支持babel、eslint、stylelint、vue、typescript、less、sass
  • 支持模块化处理css、图片等资源文件
  • 支持持续监听、持续构建
  • 支持代码分离
  • 支持tree-shaking
  • 支持sourceMap

webpack的构建流程

  1. 入口处理(从entry文件开始,启动编译流程)
  2. 依赖解析(从entry文件开始,根据require或import等语句找到依赖资源)
  3. 资源解析(根据module配置,调用loader,将png、css等非标准js资源转译为js内容)
  4. 资源合并打包(将转译后的资源内容合并打包为可直接在浏览器运行的js文件)

webpack的特点

模块化:一致性

  • 将多个文件资源合并成一个,减少http请求数
  • 支持模块化开发
  • 支持高级js特性
  • 支持typescript、coffeescript语言
  • 统一图片、css、字体等其它资源的处理模型

webpack的工具类配置

  • 开发效率类:watch、devtool、devServer
  • 性能优化类:cache、performace
  • 日志类:stats、infrastructureLogging
  • 输入:entry、context
  • 模块处理:module、resolve、externals
  • 后处理:optimization、target、mode
  • 输出:output

tree-shaking的作用

  • 代码没有被用到,不可到达
  • 代码的执行结果变化被用到
  • 代码只读不屑
  • 模块导出了,但未被其它模块使用 以上几种情况开启了tree-shaking,在打包的时候就不会打包它们
开启treeshaking的方法
  • mode:production
  • optimazation.usedExports:true
开启treeshaking后的缺点

由于tree-shaking会默认不打包未直接使用的模块。假设有这样一个场景,如果一个模块引入后是会自动影响全局(也就是用副作用),但是未被使用,而treeshaking直接忽略掉它。这样就会有问题,我们要告诉webpack这个模块是有副作用的。在package.json中根对象配置

"sideEffects":["module"]

其它注意的点

loader是用来帮助webpack转换非js文件的

而plugin是拓展webpack功能的。