这是我参与「第四届青训营 」笔记创作活动的第5天
为什么使用Webpack
前端项目由资源组成,在传统的方式中,我们依赖手工管理。
手工管理的缺点体现在:
- 过程繁琐
- 当代码文件之间又依赖的时候,就得严格按依赖顺序书写
- 开发与生产环境一致,难以接入TS或JS新特性
- 比较难接入Less、Sass工具
- JS、图片、CSS资源管理模型不一致
这些对开发效率有很大的影响,在之后不断的发展中,出现了Webpack对前端资源就行管理。
什么是Webpack
本质上是一种前端资源编译、打包工具
- 多份资源文件打包成一个Bundle
- 支持Babel、Eslint、TS、CoffeScript、Less、Sass
- 支持模块化处理CSS、图片等资源文件
- 支持HMR+开发服务器(Hot Module Replacement--模块热替换)
- 支持持续监听、持续构建
- 支持代码分离
- 支持Tree-shaking(树摇--用于删除无用代码)
- 支持Sourcemap(源代码和生成代码的映射)
- ...
如何使用Webpack
简单示例
- 安装
npm i -D webpack webpack-cli - 编辑配置文件webpack.config.js
module.exports = {
entry: 'main.js',
output: {
filename: "[name].js",
path: path.join(__dirname, "./dist"),
},
module: {
rules: [{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'less-loader']
}]
}
}
- less-loader:实现less到css的转换
- css-loader:将CSS包装成类似module.exports="${css}"的内容,包装后的内容符合JavaScript语法
- style-loader:将css模块包进require语句,并在运行时调用injectStyle等函数将内容注入到页面的style标签
- 执行编译命令
npx webpack
核心流程
-
入口处理--从
entry文件开始,启动编译流程 -
依赖解析--从
entry文件开始,根据requireorimport等语句找到依赖资源 -
资源解析--根据
module配置,调用资源转移器,将png、css等非标准JS资源转译为JS内容递归调用2、3,知道所有资源处理完毕 -
资源合并打包--将转译后的资源内容合并打包为可直接在浏览器运行的JS文件
特性:模块化+一致性
- 多个文件资源合并成一个,减少http请求数
- 支持模块化开发
- 支持高级JS特性
- 支持Typescript、CoffeeScript方言
- 统一图片、CSS、字体等其它资源的处理模型
- Etc...
Webpack配置
关于Webpack的使用方法,基本围绕"配置"展开,而这些配置大致可划分为两类:
- 流程类:作用于流程中某个or若干个环节,直接影响打包效果的配置项
entry--输入:entry``contextrequire``import--模块解析:resolve``externalsmodule--模块转译:moduleoutput--后处理:optimization``mode``target
- 工具类:主流程外,提供更多工程化能力的配置项
- 开发效率类 watch、devtool、devServer
- 性能优化类 cache、performance
- 日志类 stats、infrastructureLogging
- 其它 amd、bail等