You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
constexpress=require('express');constwebpack=require('webpack');constwebpackDevMiddleware=require('webpack-dev-middleware');constapp=express();constconfig=require('./webpack.config.js');constcompiler=webpack(config);app.use(webpackDevMiddleware(compiler,{publicPath: config.output.publicPath,}));app.listen(3000,function(){console.log('Example app listening on port 3000!\n');});
Table of Contents
构建工具
为什么需要构建工具?
前端构建工具的演变历史
主流的有:
ant+YUI Tool——>grunt——> fis3/gulp——>rollup/webpack/parcel
为什么选择 webpack ?
初识 webpack
配置文件
基本的包括 entry、output、mode、module、plugins 几种
Loaders
Loaders 是 webpack 的核心概念。webpack 开箱即用只支持 JS 和 JSON 两种文件类型,通过 Loaders 去支持其它文件类型并且把它们转化成有效的模块,并且可以添加到依赖图中。
Loaders 本身是一个函数,接受源文件作为参数,返回转换的结果。
常见的 Loaders
列举部分,更多见 loaders
babel-loader
转换 ES6\ES7 等 JS 新特性语法css-loader
支持.css 文件的加载和解析less-loader
将 less 文件转换成 cssts-loader
将 TS 转换成 JSfile-loader
进行图片、文字等的打包raw-loader
将文件以字符串的形式导入thread-loader
多进程打包 JS 和 CSSLoaders 的用法
Plugins
Plugins
用于bundle
文件的优化,资源管理和环境变量注入,作用域整个构建过程。常见的 Plugins
列举部分,更多见 plugins
CommonsChunkPlugin
将 chunks 相同的模块代码提取成公共 jsCleanWebpackPlugin
清理构建目录ExtractTextWebpackPlugin
将 CSS 从 bundle 文件中提取成一个独立的 CSS 文件CopyWebpackPlugin
将文件或者文件夹拷贝到构建的输出目录HTMLWebpackPlugin
创建 html 文件去承输出的 bundleUglifyjsWebpackPlugin
压缩 JSZipWebpackPlugin
将打包出的资源生成一个 zip 包Plugins 的使用
在配置文件中的 plugins 数组里将定义好的插件放入即可。
Mode
Mode 用来指定当前的构建环境是:
production
、development
还是none
, 对应 node.js 中的process.env.NODE_ENV
。设置 mode 可以使用 webpack 内置的函数,默认设置为
production
详细见:https://webpack.js.org/configuration/mode/
webpack 使用
练习使用
webpack 中文件监听
1、
--watch
监听文件改动,构建命令改为webpack --watch
缺点:构建后需要手动刷新浏览器页面才能看到效果
2、文件监听的原理分析
轮询判断文件的最后编辑时间是否变化,某个文件发生了变化,并不会立刻告诉监听者,而是先缓存起来,等 aggregateTimeout
热更新 webpack-dev-server
HotModuleReplacementPlugin
插件配合热更新 webpack-dev-middleware
热更新的原理分析
概述过程:
(启动阶段 1、2、A、B)源代码文件经过 Webpack Compiler 编译后,生成 bundle,然后 Bundle Server 提供 bundle 文件在浏览器中访问;
(热更新阶段 1、2、3、4)文件变化后,还是经过 Webpack Complier 进行编译,然后将变化的代码传给 HMR Server,HMR Server(服务端) 和 HMR Runtime(客户端) 一直通信,当有代码更新(通知过了 HMR Runtime 后),HMR Server 会将更新的代码模块以 JSON 的形式发送给 HMR Runtime,然后 HMR Runtime 进行一个代码的更新,而不需要刷新浏览器页面。
文件指纹策略
文件指纹的生成方式
文件指纹 webpack 配置
css 文件一般用 contenthash 来实现,js 则使用 chunkhash, 图片资源用 hash。相关配置和输出结果如下:
代码压缩
JS 文件压缩
内置插件
uglifyjs-webpack-plugin
CSS 文件压缩
使用
optimize-css-assets-webpack-plugin
,同时使用cssnano
预处理器处理 CSShtml 文件压缩
修改
htm-webpack-plugin
,设置压缩参数webpack 进阶
PostCSS 插件 autoprefixer 自动补齐 CSS3 前缀
浏览器内核和对应 CSS3 属性前缀:
使用
autoprefixer
插件(配合 prostcss-loader 使用),根据 Can I Use 规则 (https://caniuse.com)移动端 CSS px 自动转成 rem
使用
px2rem-loader
页面渲染时计算根元素的
font-size
值lib-flexible
库viewpoint 得到更多的浏览器支持后,可以使用 viewpoint 代替 lib-flexible , px 到 vw 的转换插件
还需要将
lib-flexible
内联到 html head 头部,为了页面渲染的时候提早计算到根元素的 font-size 的大小。静态资源的内联
资源内联的意义
代码层面:
请求层面:减少 HTTP 网络请求数
HTML 和 JS 内联
raw-loader
内联 htmlraw-loader
内联 JSCSS 内联
多页面应用(MPA)打包通用方案
基本实现思路:每个页面对应一个 entry,一个 html-webpack-plugin。缺点:每次新增或删除页面都需要改 webpack 配置。
解决方案:动态获取 entry 和设置 html-webpack-plugin 数量,利用
glob.sync
source map
source map 类型关键词:
Tree-shaking
DCE (Elimination)
tree-shaking 利用了 DCE 的特点做优化:
if(false){// 这里边的代码}
Tree-shaking 的原理
ScopeHoisting 的使用和原理分析
1、现象:webpack 构建后的带存在大量的闭包代码
eg:
假如现在有两个文件分别是 util.js:
和入口文件 main.js:
以上源码用 Webpack 打包后输出中的部分代码如下:
2、会导致什么问题?
3、结论
import
会被转换成__webpack_require
4、进一步分析 webpack 的模块机制
分析:
scope hoisting 原理
原理:将所有的模块的代码按照引用顺序放到一个函数作用域里,然后适当的重命名一些变量以防止变量名冲突
对比:通过 scope hoisting 可以减少函数声明代码和内存开销
使用
webpack v4 在将 mode 设置为
production
会默认开启 scope hoisting ,且必须是 ES6 语法,CJS 不支持(这点和 tree-shaking 一样)。体积优化策略
下边介绍后边三者
公共资源分离
图片压缩
要求:基于 Node 库的 imagemin 或者 tinypng API
使用:配置 image-webpack-loader
imagemin 的优点
imagemin 的压缩原理
动态 Polyfill
背景:babel-polyfill 打包后体积 88.49k。
构建体积优化:动态 Polyfill。如 polyfill.io
polyfill service 原理:识别 User Agent,下发不同的 Polyfill,不加载多余的已支持的特性
分割代码和动态 import
webpack 性能分析和优化
初级分析:使用 webpack 内置的 stats
速度分析:使用 speed-measure-webpack-plugin
体积分析:使用 webpack-bundle-analyszer
多进程/多实例构建
多进程/多实例并行压缩
推荐使用
terser-webpack-plugin
,设置参数 parallel进一步分包:预编译资源模块
分包:设置 Externals
思路:将 react、react-dom 基础包通过 cdn 引入,不大于 bundle 中
方法:使用
html-webpack-externals-plugin
问题:业务包多的时候,这种方式会在页面中引入很多 script 标签
进一步分包:预编译资源模块
思路:将 react、react-dom、redux、react-redux 基础包和业务基础包打包成一个文件
方法:使用
DLLPlugin
进行分包,DllReferencePlugin
对manifest.json
引用然后
webpack.prod.js
中添加 DllReferencePlugin 插件,指定 manifest json充分利用缓存提升二次构建速度
缓存思路:
?cacheDirectory=true
)cache:true
)缩小构建目标
目的:尽可能的少构建模块,比如
babel-loader
不解析node_module
。减少文件搜索范围
深入 webpack
webpack 启动过程分析
webpack-cli 源码阅读
实战
商城技术栈选型和整体架构
商城界面 UI 设计与模块拆分
demo代码:https://github.com/giscafer/webpack-study
内容为极客时间《玩转Webpack》学习笔记
The text was updated successfully, but these errors were encountered: