参考视频 文章:
http://www.woc12138.com/article/45
https://segmentfault.com/a/1190000006178770
https://mp.weixin.qq.com/s?__...
https://www.jianshu.com/nb/45770544
webpack
简介
webpack 是一种前端资源构建工具,一个动态模块打包器(module bundler)。
在webpack 看来, 前端的所有资源文件(js/json/css/img/less/...)都会作为模块解决。
它将依据模块的依赖关系进行动态剖析,打包生成对应的动态资源(bundle)。
5个外围
Entry入口:批示 webpack 以哪个文件为入口终点开始打包,剖析构建外部依赖图,trunk。
Output输入:批示 webpack 打包后的资源 bundles 输入到哪里去,以及如何命名。
翻译:让 webpack 可能去解决那些非 JS 的文件,比方款式文件、图片文件(webpack 本身只了解JS)
Plugins插件:对象,
能够用于执行范畴更广的工作。插件的范畴包含从打包优化和压缩,始终到从新定义环境中的变量等,相当于钩子函数。
Mode模式:批示 webpack 应用相应模式的配置,development开发模式和production生产模式。
loader:函数,在构建过程中,文件转换器,文件转换的工作;a.less=>a.css
webpack的装置
webpack 打包原理
先递归辨认依赖,构建依赖图谱
把代码转换成 AST 形象语法树
在 AST 中去解决代码
将 AST 形象语法树变成浏览器能够辨认的代码并输入
https://github.com/bestCindy/mini-webpack/blob/main/README.md
webpack打包过程
辨认入口文件
通过逐层辨认模块依赖。(Commonjs、amd或者es6的import,webpack都会对其进行剖析。来获取代码的依赖)
webpack做的就是剖析代码。转换代码,编译代码,输入代码
最终造成打包后的代码
https://segmentfault.com/a/1190000020266246
(一)将代码转换成 AST 形象语法树
利用 babel-parser 转换
代码在 convertToAST.js 文件中
(二)找到依赖关系
利用 traverse 遍历 AST 形象语法树
找到文件的依赖关系
代码在 convertToDependency.js 外面
(三)将形象语法树转换成浏览器能够运行的代码
代码在 convertToCode.js 外面
(四) 遍历 dependencies 找到所有的依赖获取依赖图谱
代码在 makeDependenciesGraph.js 外面
(五)生成代码
代码在 generateCode.js 外面
webpack编译过程
https://www.jianshu.com/p/99ecc9209bfb
https://www.jianshu.com/p/01e9b0414553
webpack生命周期
筹备工作
@babel/parser: 剖析咱们通过 fs.readFileSync 读取的文件内容,返回 AST (形象语法树)
@babel/traverse: 能够遍历 AST, 拿到必要的数据
@babel/core: babel 外围模块,其有个transformFromAst办法,能够将 AST 转化为浏览器能够运行的代码
@babel/preset-env: 将代码转化成 ES5 代码
ast形象语法树:
https://juejin.cn/post/6844903727451602951
词法剖析:将每项拆开。
语法分析:依据逻辑关系把token流合起来
Vue-loader 插件VueLoaderPlugin
vue2中的build 和config 文件夹用来配置webpack
loader plugin优化
是什么 有什么区别
手写loader
babel
Babel 是什么:是一个 JavaScript 编译器
Babel 是一个工具链,次要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便可能运行在以后和旧版本的浏览器或其余环境中。
能做什么:
语法转换
通过 Polyfill 形式在指标环境中增加缺失的个性 (通过 @babel/polyfill 模块)
源码转换 (codemods)
babel-loader
babel-loader:加载babel的
babel-loader在执行的时候,可能会产生一些运行期间反复的公共文件,造成代码体积冗余,同时也会减慢编译效率。
https://huangxsu.com/2018/08/12/webpack-optimization/
限度范畴:
限度 loader 只解决特定的目录, babel-loader,include
noParse (该模块中不应该含有 import,require,define)
放慢解析(resolve)速度,extensions不要加太多,常呈现的放在后面
babel-polyfill垫片
tree shaking
作用: webpack2减少tree-shaking,tree shaking 摇摆 a module引入了Bmodule,将用不到的代码摇掉 不实用的代码 不打包进去
原理:打消无用的js代码,编译器能够判断某些代码不影响输入,是DCE的一种新的实现
在前端应用UglifyJS,外围是ES6 module嵌套援用关系
tree-shaking的打消原理利用ES6模块个性
ES6 modules去除掉多余代码
commonjs按需加载
webpack5
rollup babel+webpack打包
UglifyJS:代码压缩优化工具,是 tree shaking 删除代码的外围
Uglify没有欠缺的程序流剖析
rollup有程序流剖析
babel导致产生副作用代码
webpack:不反对导出ES模式
rollup:打包工具库 组件库 反对ES模块 问题:生态不行
manifestPlugin:判断文件入口
webpack的 plugin机制
拆包
不要改全局的货色
vue2 rollup
先打包后编译
Dllplugin
scope hoisting
实现原理: 剖析出模块之间的依赖关系,尽可能的把打散的模块合并到一个函数中去,但前提是不能造成代码冗余。因而只有那些被援用了一次的模块能力被合并。
code splitting拆分代码
code splitting作用: 拆分代码,优化相干配置
webpack优化,怎么做:
Entry Points:多入口离开打包
Prevent Duplication: 抽离第三方库vander,webpack去除反复援用是通过commonsChunkPlugin插件来实现
再抽离反复组件。
Dynamic Imports:动静加载
commonsChunkPlugin在webpack4不应用了。
minchunks
自动化拆散vender
code splitting 和 chunks
chunk:打包后的货色
拆分而后再从新放在一起
旧版的问题:没法辨别父子级,找到对应关系
所以新的chunk图引入一个新对象 chunkGroups,一个chunkGroups蕴含多个chunk
新插件 SplitChunksPlugin
设置cacheDirectory为true
HappyPack不更新了,thread-loader
HappyPack 能够让 Webpack 同一时间解决多个工作,施展多核 CPU 的能力,将工作合成给多个子过程去并发的执行,子过程解决完后,再把后果发送给主过程。通过多过程模型,来减速代码构建。
thread-loader
webpack4官网举荐
webpack热更新
https://juejin.cn/post/6844904008432222215#heading-13
二、webpack的编译构建过程
实现原理
- webpack-dev-server启动本地服务
- 批改webpack.config.js的entry配置
- 监听webpack编译完结
- webpack监听文件变动
- 浏览器接管到热更新的告诉
- HotModuleReplacementPlugin
- moudle.hot.check 开始热更新
- hotApply 热更新模块替换
①删除过期的模块,就是须要替换的模块
②将新的模块增加到 modules 中
③通过__webpack_require__执行相干模块的代码
webpack性能优化的形式
缓存:
1. 大部分babel-loader解决,在babel-loader中,能够通过设置 cacheDirectory 来开启缓存。 2. loader 不反对缓存,能够应用cache-loader
多核 / 多过程:
1. happypack 分解成多个子过程并发执行 2. 个别都会提供 parallel 这样的配置项供你开启多核编译
抽离
1. 一种是应用 webpack-dll-plugin 的形式,在首次构建时候就将这些动态依赖独自打包,后续只须要援用这个早就被打好的动态依赖包即可,有点相似“预编译”的概念;
问题:
另一种,也是业内常见的Externals的形式,咱们将这些不须要打包的动态资源从构建逻辑中剔除进来,而应用 CDN 的形式,去援用它们。
拆分
1. docker,虚构物理机
压缩代码
优化网站性能有哪些办法?
合并js,合并css,图片sprite,图片压缩
提早加载内容:图片懒加载,数据懒加载
应用离线缓存,挪动端能够把变动少的js,css存在本地
css,js搁置地位
缩小http申请
骨架屏
首页加载性能优化,晋升页面性能:
缩小包大小 :webpack打包优化,treeshaking uglify优化,按需加载。
放慢http申请速度:cdn :雪碧图, 大图, 第三方插件连贯
页面搁置程序:css,js
缩小页面重排重绘
服务器端渲染,接口响应慢等问题
延长:骨架屏 预渲染 懒加载
打包优化:应用缓存,多线程打包,缩小文件搜寻范畴,
从输出URL到页面出现?
DNS解析:
TCP连贯
发送HTTP申请
服务器响应:
webpack优化: happypack,tree shaking
浏览器解析页面
CDN
https://juejin.cn/post/6844903906296725518
内容散发网络,全国各地都有这个配置。相似菜鸟的仓配网络。
解决散布 带宽 散布的问题。事后做好散发
CDN : 缓存和回源
应用CDN镜像
多个服务器
应用CDN缓存,
CDN网络
批改DNS解析
全局负载平衡
DNS解析,失去
CDN关键技术:
缓存算法
散发能力
负载平衡(nginx),智能调用
基于DNS
反对协定,图片减速
访问量大的网络须要CDN,
毛病:
申请 CDN专用的DNS服务器
依据用户IP地址,
服务器节点:
边缘节点:
CND网络组成:核心节点、边缘节点
核心节点:总仓
边缘节点:异地散发节点,由负载平衡设施,
搭建CDN相干技术:
内容公布
内容存储
内容路由: 路由重定向,DNS机制
内容治理:
拜访cdn和不通过cdn拜访
cname过程
回源:
找本人的服务器
除了动态资源 api是否能够缓存
第三方库应用cdn加载
资源过期如何判断 cdn是如何更新数据的
被动push 被动pull
从服务器被动往cdn推送数据
webpack 变量晋升 缓存 强缓存 协商缓存
预加载 预渲染
DNS域名解析,DNS预解析
www.sunhao.win.根域
权威域.顶级域.根域
根域名 www.sunhao.win.根域 根域不显示
dns次要通过
udp
顶级域和顶级服务器
win所在的地位就是顶级域
国家顶级域名
通用顶级域名
xx
权威DNS和权威域名服务器
运营商DNS服务器和本地DNS服务器
递归查问:主机向本机服务器查问
迭代查问:
cname别名指向: 解析域名到域名
解决申请重大延时的景象,应用dns预解析。
des-prefetch,多页面反复DNS预解析会速度
浏览器缓存
DNS Prefetching 技术
DNS域名解析过程:
查找浏览器缓存
查找零碎缓存
查找路由器缓存
查找ISP DNS缓存
递归搜寻
DNS平安问题
DNS坑骗:更改IP地址
拒绝服务攻打
分布式拒绝服务攻打
缓冲区破绽溢出攻打
DNS网络性能优化
缩小DNS查找,防止重定向
- DNS预解析