这是我参与「第五届青训营」伴学笔记创作活动的第 11 天
本堂课重点内容
本堂课重点讲述了Webpack定义、Webpack打包流程、Loader的使用、Plugin的使用、Webpack学习方法。
什么是Webpack
-
前端资源编译、打包工具 => 模块化、一致性
-
使用Webpack:安装--编译配置文件--执行编译命令
-
Webpack执行步骤:
- 入口 entry
- 依赖解析 require、import
- 资源解析 module
- 资源合并打包 output
- 2-3步递归执行,直到所有资源处理完毕
-
Webpack的配置项大致可以分为两类:
- 流程类:影响执行步骤,作用于某些流程
- 输入:entry、context
- 模块解析:resolve、externals
- 模块转译:module
- 后处理:optimization、mode、target
- 工具类:作用于执行步骤之外,提供工程化能力
- 开发效率类(watch、devtool、devServer等)、性能优化类(cache、performance)、日志类(stats、infrastructureLogging)
- 流程类:影响执行步骤,作用于某些流程
-
Webpack配置属性至少必须要有:
- entry 入口
- output 出口
-
常见场景:
-
处理css文件:在module属性的rules属性的use属性中定义处理css文件的loader序列“css-loader”和“style-loader”,test中设置过滤文件属性“/.css$/”
-
接入Babel
- Babel作用:把高版本JS转译成低版本JS代码
- 安装babel依赖--声明产物出口“output”--执行“npx webpack”
- 与处理CSS一样,是要在module中定义相关属性的:
module:{ rules:[{ test: /\.js?$/, use: [{ loader: "babel-loader", options: {presets: [['@babel/preset-env']]} }] }], },- 生成HTML
-
使用插件 plugins: [new HTMLWebpackPlugin()]
- 工具线
-
模块热替换 HMR ,页面无需刷新就能将立刻将新代码的效果更新显示出来
devServer: {hot:true, open:true}"npm webpack server" -
Tree-Shaking 删除没有用到的代码,对打包工具类库如Loadash有奇效
简单方法:
mode: "production",optimization: {useExports: true}
-
-
其他常见场景:缓存、Sourcemap、性能监控、日志、代码压缩、分包...
加载器Loader
- Webpack只能识别JS代码,所以使用Loader把处理不同类型文件转换成JS资源
- Loader是逐个进行、链式调用的,前一个loader的结果可能是后一个loader的输入,所以要使用许多个loader,如转换less文件需要用到less-loader、css-loader、style-loader三个loader
- 特点:链式调用、支持异步执行、有normal/pitchl两种模式
- 常用Loader
- loader的执行流程,以less为例
插件Plugin
插件用起来简单,写起来难 “钩子”:时机、上下文(参数)、交互
举例:DashboardPlugin() 把编译结果用一个好看的方式呈现出来
Webpack学习方法
个人总结
学习webpack,可以加深对“前端工程化”概念的理解和工具的掌握,学会并熟练掌握webpack可以增强个人的核心竞争力,如果前端想要往更高层次发展,这将是必不可少的一项技能。
课后思考
- Loader有什么作用?为什么这里需要用到css loader、style-loader
- 与旧时代——在HTML文件中维护CSS相比,这种方式会有什么优劣处?
- 有没有接触过Less、Sass、 Stylus 这一类CSS预编译框架?如何在Webpack接入这些工具?
- Babel具体有什么功能?
- Babel与Webpack分别解决了什么问题?为何两者能协作到一起了?
- 相比于手工维护HTML内容,这种自动生成的方式有什么优缺点?
- 除上面提到的内容,还有哪些配置可划分为“流程类”配置?
- 工具类配置具体有什么作用?包括devtool/cache/stat等
- Loader输入是什么?要求的输出是什么?
- Loader的链式调用是什么意思?如何串联多个Loader ?
- Loader中如何处理异步场景?
- Loader与插件有什么区同点?
- '钩子”有什么作用?如何监听钩子函数?