angular共享依赖的解决方案分享


Posted in Javascript onOctober 15, 2020

webpack-ng-dll-plugin

  • ng版本可用的dll插件,路子比较野

用途

  • 提高打包速度
  • 代码复用(微前端依赖共享)

使用

  • 首先根据个人熟悉程度选择@angular-devkit/build-webpack,@angular-builders/custom-webpack,ngx-build-plus

第一个是官方的,后两个是第三方的,但是确认你有练过之前,请不要选择官方的...

作者在测试的时候选择的是@angular-builders/custom-webpack

  • 先构建dll,建议使用空项目来创建dll,因为目前开发中并没考虑到一些复杂逻辑的实现及相关第三方包的依赖关系保存(full模式应该可以实现,理论)
  • 然后在构建时引用

引用就是webpack的正常引用插件就ok了

尝鲜

下面的函数过滤了index.html,styles,polyfills,License的输出,并且禁用了runtimeChunk

setNgDllPlugin(
 config,
 {
  //webpack 的out相关配置
  output: {
  filename: 'dll.js',
  },
  ngDllPluginOptions: {
   // dll的资源清单导出配置
  path: path.join(__dirname, 'dist', 'manifest.json'),
  name: 'TLIB',
  format: true,
  filter: {
   // 过滤模式,full全量,auto相对于项目,manual 手动指定过滤项(需要设置map)
   mode: 'auto',
  },
  },
 },
 options
 );

自定义

相关配置需要参考(暂时没写文档,需要查看源码)

config.plugins.push(new NgDllPlugin(option.ngDllPluginOptions));

引用

// 这里的context可以理解为代码(应用代码)相对于哪个文件夹解析(不是打包出来的dll.js,如果正确引用,你会发现把dll.js删掉,也不会影响打包),如果发现打包出来的东西没有使用这个,应该就是这个配置错了
 config.plugins.push(
 new webpack.DllReferencePlugin({
  context: path.resolve(__dirname),
  manifest: require('./dist/manifest.json'),
 })
 );

演示地址

https://github.com/wszgrcy/ng-cli-plugin-demo

可能解锁的技术

  • 分体式路由加载

正常情况下,哪怕是动态加载的路由,也是与项目一同打包,只不过是打包为两个文件

主体项目先打包,然后再单独开发懒加载路由模块

  • web-component的使用率上升

虽然ng已经实现了这个,但是由于每次一大包,就相当于打了一个单独项目,非常庞大,使用dll后则会缩小到一个可怕的程度,副作用接近0

目前(可能)存在的问题

  • 资源清单输出的是全量的引用,但是实际上,只有mode:'full'时,才等价

没修改之一主要是影响不大,加上调试需要

  • 如果生成dll的项目中有动态加载模块,可能有未知影响

dll在设计的时候根本没考虑过动态模块之类的东西,完全就是只打一个大包

尽量使用空项目生成dll

  • auto只代表当前生成项目可以达到完全引用,如果你修改了项目,那么必须重新构建项目(额.看起来比较废物的一个模式)

其实如果项目代码足够多(各种种类),修改代码是不影响的,但是比如有些引入第一次使用,或者html模板中使用了一些新的东西,都需要重新构建

待改进

主动排除一部分永远无法使用的导出

为什么dll比直接打包大

  • 即使dll打包现在使用到了ng的aot,摇树等相关优化技术,但是仍然有个致命问题,就是导出名,默认打包时,所有名字都会被优化(混淆),而dll打包就必须暴露这个名字,当完全暴露时,就会出现体积增长

目前用空项目生成出的dll(包括rxjs,router,common,core),全量暴力是440k(也就是说当其他包使用时这些文件都会在dll中查找),选择性导出最小化启动在216k作用,最终估计应该平均在300k左右

  • 目前使用的技术,只能1.全量导出,2.选择可用导出,这其实就有一个副作用存在,全量导出时.不仅一些不使用的依赖被导出了,还有些内部引用的(比如ɵangular_packages_core_core_h)也被强制导出了,从而增加了包大小

后期,其实可以整理一个永不导出的列表,进行排除,从而减小体积

  • 传统打包是多个模块打包一个模块,中间很多依赖都是属于内部依赖,所以精简了很多代码,dll的这种打包属于多模块,因此每个模块都有出口,之间的引用也是用的模块之间的引用,所以即使最小化dll也会比打包的多40k左右

总结

到此这篇关于angular共享依赖解决方案的文章就介绍到这了,更多相关angular共享依赖解决内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
用正则获取指定路径文件的名称
Feb 27 Javascript
使用JQUERY Tabs插件宿主IFRAMES
Jan 01 Javascript
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
Jul 31 Javascript
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
Oct 31 Javascript
日期处理的js库(迷你版)--自建js库总结
Nov 21 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
Sep 08 Javascript
jquery编写Tab选项卡滚动导航切换特效
Jul 17 Javascript
基于Vue实现timepicker
Apr 25 Javascript
微信小程序地图绘制线段并且测量(实例代码)
Jan 02 Javascript
js实现自动播放匀速轮播图
Feb 06 Javascript
在vue中实现echarts随窗体变化
Jul 27 Javascript
如何在selenium中使用js实现定位
Aug 18 Javascript
ES11新增的这9个新特性,你都掌握了吗
Oct 15 #Javascript
js实现点击烟花特效
Oct 14 #Javascript
vue使用Sass时报错问题的解决方法
Oct 14 #Javascript
JavaScript原生数组函数实例汇总
Oct 14 #Javascript
如何通过JS实现日历简单算法
Oct 14 #Javascript
浅谈js数组splice删除某个元素爬坑
Oct 14 #Javascript
如何使用JS console.log()技巧提高工作效率
Oct 14 #Javascript
You might like
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
一步一步学习PHP(8) php 数组
2010/03/05 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
php实现文件预览功能
2017/05/23 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
Javascript hasOwnProperty 方法 & in 关键字
2008/11/26 Javascript
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
javascript学习笔记之函数定义
2015/06/25 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
[01:00] DOTA2英雄背景故事第五期之重力引力法则谜团
2020/07/16 DOTA
Python性能优化的20条建议
2014/10/25 Python
全面解析Python的While循环语句的使用方法
2015/10/13 Python
Python探索之URL Dispatcher实例详解
2017/10/28 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
Python 使用office365邮箱的示例
2020/10/29 Python
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
网站客服岗位职责
2014/04/05 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
python 批量压缩图片的脚本
2021/06/02 Python