最新要闻
- 全球焦点!微软回应Xbox 360商店关闭:只是搞错了
- 全球最新:每逢佳节胖三斤 专家提醒:节后运动“甩膘”要注意三点
- 环球快报:13倍浓缩:日本隅田川胶囊咖啡1.16元/杯史低
- 充会员才解封?爱奇艺回应一号三用被封:技术故障 跳转错误页面
- 《卧龙》天柱山介绍公开:红晶小姐姐美如画!
- 天天热点!对Intel穷追猛打!AMD Zen4c 128核心上半年杀来
- 突然暴雷!世界第一辆量产太阳能汽车 黄了
- 天天热头条丨2023年新势力首月销量成绩单:理想最显眼 零跑暴跌
- 全球新资讯:蔚来大降价超10万?总裁回应:没有 展车最多2.4万优惠
- 【全球报资讯】比尔·盖茨盛赞ChatGPT:称其“不亚于互联网诞生”
- 环球视点!女子拍抖音私闯已关闭自然保护区 或处5000元以下罚款
- 一个手机号搞定!微信正式支持注册小号:生活、工作能分开吗?
- 世界语言的分布是什么?世界语言难度排行
- 三星手机怎么截屏图片?三星手机如何防盗?
- 韩国游戏公司有哪些?韩国游戏公司排名
- 穿越火线什么时候出的?穿越火线怎么安装?
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Webpack解析与讲解
一、什么是Webpack?
一个基于node.js的前端模块化/预处理/扁平化处理器。二、为什么要使用Webpack?
- 解决业务代码中的各种依赖,模块加载,静态文件引入问题(重复依赖/强依赖,阻塞加载,资源整合)
- 使浏览器支持众多样式预处理器(sass, less, stylus)
- 使浏览器支持众多第三方框架与工具(react/vue/angluar)
- 使浏览器支持ECMA5以上的特性和语法
三、Webpack在打包时都做了些什么?
- 生成一个包含入口出口路径模块的compiler类
- 获取抽象语法树(AST),建立模块之间关系(@babel/parser)
- 找出所有依赖模块(@babel/traverse)
- AST 转换为 code(@babel/core 和 @babel/preset-env)
- 递归解析所有依赖项,生成依赖关系图(mainfest.json)
- 重写 require 函数,输出 bundle(即浏览器能够识别的模块)
const fs = require("fs")const path = require("path")const options = require("./webpack.config")const parser = require("@babel/parser")const traverse = require("@babel/traverse").defaultconst { transformFromAst } = require("@babel/core")const Parser = { getAst: path => { // 读取入口文件 const content = fs.readFileSync(path, "utf-8") // 将文件内容转为AST抽象语法树 return parser.parse(content, { sourceType: "module" }) }, getDependecies: (ast, filename) => { const dependecies = {} // 遍历所有的 import 模块,存入dependecies traverse(ast, { // 类型为 ImportDeclaration 的 AST 节点 (即为import 语句) ImportDeclaration({ node }) { const dirname = path.dirname(filename) // 保存依赖模块路径,之后生成依赖关系图需要用到 const filepath = "./" + path.join(dirname, node.source.value) dependecies[node.source.value] = filepath } }) return dependecies }, getCode: ast => { // AST转换为code const { code } = transformFromAst(ast, null, { presets: ["@babel/preset-env"] }) return code }}class Compiler { constructor(options) { // webpack 配置 const { entry, output } = options // 入口 this.entry = entry // 出口 this.output = output // 模块 this.modules = [] } // 构建启动 run() { // 解析入口文件 const info = this.build(this.entry) this.modules.push(info) this.modules.forEach(({ dependecies }) => { // 判断有依赖对象,递归解析所有依赖项 if (dependecies) { for (const dependency in dependecies) { this.modules.push(this.build(dependecies[dependency])) } } }) // 生成依赖关系图 const dependencyGraph = this.modules.reduce( (graph, item) => ({ ...graph, // 使用文件路径作为每个模块的唯一标识符,保存对应模块的依赖对象和文件内容 [item.filename]: { dependecies: item.dependecies, code: item.code } }), {} ) } build(filename) { const { getAst, getDependecies, getCode } = Parser const ast = getAst(filename) const dependecies = getDependecies(ast, filename) const code = getCode(ast) return { // 文件路径,可以作为每个模块的唯一标识符 filename, // 依赖对象,保存着依赖模块路径 dependecies, // 文件内容 code } } // 重写 require函数,输出bundle generate() {}}new Compiler(options).run()
四、主要涉及知识点:
- require/import
- AMD/CMD
- babel与loader
- require与import
- require是一个同步动态加载,导出的是当前整个模块(一次导出多次使用)
const fs = require("fs") // 其中require的路径是支持模版语法的 console.log(JSON.stringify(fs.readFileSync)
- import是一个同步静态加载,导出的是模块引用(即实现部分导出)
import { addSum } from "./path"addSum()webpack最终打出的来的包 还是通过babel降维得到的通过amd/cmd规范组合的require包。
- AMD与CMD(异步加载)
- AMD(Async Module Definition) 异步模块定义(require.js)
define(["./a", "./b"], function([a,b])) { a.doSomething() b.doSomething() }
依赖前置、在定义模块的时候就要声明其依赖的模块
- CMD(Common Module Definition) 通用模块定义(sea.js)
define(function(require, exports, module) { var a = require("./a") a.doSomething() var b = require("./b") b.doSomething() })
就近依赖、只有在用到某个模块的时候再去加载
- babel(Babel 是一个 JavaScript 编译器)
由于浏览器的支持速度远远慢于语言的更新速度。所以我们需要一个强大的能够向下兼容的编译器来帮助浏览器识别我们使用的这些新特性。包括:
(相关资料图)
- 语法转换
- 通过 Polyfill 方式在目标环境中添加缺失的特性
- 源码转换 (codemods)
eg:
// Babel 输入: ES2015 箭头函数 [1, 2, 3].map((n) => n + 1); // Babel 输出: ES5 语法实现的同等功能 [1, 2, 3].map(function(n) { return n + 1; });
我们现在使用到的很多特性/预设/插件/配置/工具等 都是在有babel这个生态中维护(具体可以参考官网https://www.babeljs.cn/docs/options)
五、要优化Webpack可以怎么做?
分析 :BundleAnalyzerPlugin
Speed-measure-webpack-plugin
- 优化加载静态资源的大小
(1) 将资源上传至服务器
(2) 开启gzip
(3) 压缩静态资源(图片剔除sourcemap, 代码内容格式化)
(4) 剔除重复的静态资源
- 优化加载(同步/异步)依赖模块的多少
(1) 合理划分同步加载/异步加载模块(包括路由,依赖,以及第三方库等)
(2) 尽量使用按需加载,减少依赖重复引用
(3) 剔除不必要的第三方依赖
(4) 配置跳过一些大的第三方依赖babel-loader
- 添加缓存(manfest.json / babel-loader)
推荐hardSource(webpack 5.0) 与 webpack(4.0) babel-cache
- 启用并行构建(thread-loader)
(2)注意构建时间:(改进后)
Webpack解析与讲解
全球焦点!微软回应Xbox 360商店关闭:只是搞错了
全球最新:每逢佳节胖三斤 专家提醒:节后运动“甩膘”要注意三点
天天快资讯丨el表达式注入漏洞
环球快报:13倍浓缩:日本隅田川胶囊咖啡1.16元/杯史低
充会员才解封?爱奇艺回应一号三用被封:技术故障 跳转错误页面
《卧龙》天柱山介绍公开:红晶小姐姐美如画!
天天热点!对Intel穷追猛打!AMD Zen4c 128核心上半年杀来
突然暴雷!世界第一辆量产太阳能汽车 黄了
讯息:操作系统的体系结构
天天热头条丨2023年新势力首月销量成绩单:理想最显眼 零跑暴跌
全球新资讯:蔚来大降价超10万?总裁回应:没有 展车最多2.4万优惠
【全球报资讯】比尔·盖茨盛赞ChatGPT:称其“不亚于互联网诞生”
环球视点!女子拍抖音私闯已关闭自然保护区 或处5000元以下罚款
一个手机号搞定!微信正式支持注册小号:生活、工作能分开吗?
世界语言的分布是什么?世界语言难度排行
三星手机怎么截屏图片?三星手机如何防盗?
韩国游戏公司有哪些?韩国游戏公司排名
穿越火线什么时候出的?穿越火线怎么安装?
饱和石灰水是什么意思?饱和石灰水变浑浊的原因是什么?
诺基亚5000刚出来是多少钱?诺基亚5000手机参数
宽带连接怎么创建?宽带连接怎么设置到桌面上?
一次JSF上线问题引发的MsgPack深入理解,保证对你有收获
全球快看点丨springboot实战——总结
全球观点:(笔记)【NTP系列:05】NTP时间同步失败:Windows(W32Time)作为NTP时钟源服务端,Linux作为客户端
[概率论与数理统计]笔记:5.4 假设检验概述
西门子手机怎么样?西门子手机哪年进入中国?
联想y470双显卡驱动怎么装?联想y470双显卡怎么切换?
dota2怎么改成国服?DOTA2配置要求是什么?
世界新动态:传奇大佬、联想PC全球第一的功臣蒋凡可·兰奇去世 享年69岁
不叫003 极氪第三款车型ZEEKR X官图发布:20万买不
世界观焦点:智商碾压 新养的边牧把养5年金毛拐跑丢弃
当前滚动:办公党等到了!小米笔记本12.4二合一发布:2.5K触屏 2999元
荣耀Magic5通过3C认证:1/1.1英寸主摄、标配66W充电头
世界关注:非常强大的gsap动画
2023年值得收藏的开源或免费的web应用防火墙
keycloak~JWT各字段说明及扩展字段的方法
苹果业绩暴雷:iPhone卖不动了!库克感谢国人支持 要降价刺激销量?
《巫师3:狩猎》4.01版更新上线:光追性能更强 帧率又高了
美国新造车告急:造一辆亏23万 CEO深感抱歉
极氪009被吐槽像灵车、棺材 车主亲身评测:死人躺并不舒适
比亚迪又一大杀器 全新海鸥出街被拍:超个性涂装上身
快看:iPhone 12/13/14灵魂设计师离职 苹果直接取消工业设计总监职位
动态焦点:男孩为网游充值4万 家长控诉腾讯监控不力未尽义务:该不该退钱?
全球微动态丨国内油价今晚调整 或迎兔年“第一涨”:加满一箱预计多花8.5元
环球滚动:20个小猫身上笑死人的奇葩花纹:只有你想不到!
萌萌哒的兔子竟是“头号杀手”!澳大利亚曾研制病毒专杀兔兔
全球新资讯:澳大利亚搞丢一枚剧毒放射性胶囊 相关单位仅被罚款1000块:下不为例?
专家称年轻人工资低可能是能力不够引争议:企业点赞 打铁还应自身硬
世界今热点:触控体验碾压iPhone 14 Pro Max!一加Ace 2做到了
火箭弹电子版领取处>>(密码博主昵称 全部小写)
天天观点:Pandas分析泰坦尼克号生还比例
天天新资讯:图卷积的演变-从谱图卷积到GCN
.NET Core 3.1 通过 Web Service 读写 Salesforce 数据
【全球新要闻】打开它 游戏性能飙升46%!NVIDIA为啥不要呢?
每日资讯:麦当劳赢了:世界第一美食APP
即时看!地球最稀有矿石就一个标本!已知6000多种矿石就它特殊
【天天速看料】《流浪地球2》票房破30亿!下一部或两年后上映
最新消息:这两年大家都在吃瘪 结果微软闷声发大财了!全靠它
视焦点讯!Spring中Bean的生命周期
一名老了的普通程序员的未来在哪里
元宵节将至:北京周五晚高峰将达严重拥堵
焦点报道:334个小核心反超AMD!Intel下代至强“增肥”70%
出厂安卓13 三星Galaxy S23承诺四次大版本迭代:包你升级Android 17
世界热点!在欧洲大陆上奔跑的中国新能源车正越来越多!当地人慌了
当前热讯:编写干净代码的 9 条必须知道的规则
有钱玩家真多!越来越多Steam用户配置RTX 4090显卡:已超2万人
Python教程:OS与sys模块用法教程
世界看点:mybatis-plus代码生成器
女子误用八千元一斤茶叶煮茶叶蛋 以为过期:网友称这茶叶蛋真吃不起
天天观天下!专家:年轻人工资低是因为能力不够 很少有人反思这问题
全球微速讯:爱奇艺回应3台设备登录账号被封:改密码能解封 不用充值更贵会员
全球滚动:PS游戏启动失败?PS日本教你如何进行问题排查
剧版一集就被砍之后 DC电影版《沼泽怪物》物色导演
订单破5万!比亚迪腾势D9登35万以上新能源豪华MPV销量第一
环球微动态丨导演评价《狂飙》:可能是可以刻在自己墓碑上的一部戏
每日快报!12.4万的保时捷带来诸多疑问 故意营销质疑越来越多!
造车新势力第一!广汽埃安1月交付10206辆 今年冲击60万辆
天天观热点:CSS 清除浮动
今日快讯:蔚来开启降价 内部员工回应:像小鹏那样直接降太没面子
彻底不冒黑烟!沃尔沃天然气重卡发布:发动机最大500马力
世界速讯:30岁中国女子在日本买70万平小岛成岛主:永久使用权
天天资讯:体育纳入高考、鲨鱼咬人?朋友圈十大谣言出炉
环球速看:800W核弹 老外猜测RTX Titan Ada售价:2.5万元都是良心价
每日信息:程序员应该专注技术,还是优雅转管理?
环球今日报丨超越三星 中国电视品牌出货量首次登顶全球第一
天天看热讯:33款砍掉一半多!奔驰大刀阔斧改革旗下车型:不赚钱的都扔掉
环球短讯!上海动物园小老虎意外溺亡 回应:因外界人员干扰致应激反应
河南一地发现大型石墨矿:自然界最软的矿物 估算超100万吨
95比92更耐烧吗、中石化和中石油能混加吗?官方科普
当前焦点![JavaSript]闭包
即时焦点:element-ui表格展开行每次只能展开一行
阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了
热推荐:MyBatis的使用一(框架的搭建)
环球要闻:数字孪生|可视化图表之散点图
焦点报道:视网膜能秒击穿!网友用小米12实测新能源车激光雷达威力:相机被烧坏
天天速讯:可口可乐定制版真我10 Pro外观首曝:最具辨识度的千元机
世界滚动:《狂飙》落幕后 《三体》剧版上线超前点播:18元提前看大结局
安卓之光归来 三星对Galaxy S23系列很自信:最好的相机及游戏性能
世界今日报丨小米汽车设计泄密供应商被处罚100万!雷军:泄密员工正在处理