基于webpack和npm的前端组件工程化实践方案
2020-02-27 195浏览
- 1.富途web前端组件化实践 TooBug / 富途web前端负责⼈人
- 2.关于 曾就职 腾讯CDC 曾维护 Less中⽂文官⽹网 Grunt中⽂文社区 曾翻译 @TooBug 富途web前端负责⼈人 《SVG精髓(第⼆二版)》 《与⼩小卡特⼀一起学Python》 《JavaScript模式》
- 3.富途组件化 1.前尘往事 2.初试⽜牛⼑刀 3.为伊憔悴 4.灯⽕火阑珊
- 4.后端⼯工程师的产物
- 5.弹窗
- 6.问题 效率 低下 ⽆无法 维护 交互 各异 质量量 不不⼀一
- 7.前端从零到⼆二
- 8.富途组件化 1.前尘往事 2.初试⽜牛⼑刀 3.为伊憔悴 4.灯⽕火阑珊
- 9.组件化⽬目标 模块化 标准化 灵活性
- 10.模块化 • AMD模块化规范 • 开发免构建 • i18n插件 • html/text插件 • 构建打包上线
- 11.模块化
- 12.标准化 Dialog ConfirmBox AlertBox MessageBox Widget init / ⾃自定义结构 onCloseClick / onConfirmClick bindEvent / title / content show / hide / layout / onClose preCreate / onCreate / postCreate
- 13.标准化
- 14.标准化
- 15.灵活性 开放扩展和⾃自定义模板
- 16.组件化⽬目标 模块化 标准化 灵活性
- 17.使⽤用 繁琐 难以理理解
- 18.团队和项⽬目
- 19.问题 构建不不 可控 构建奇慢 跨项⽬目 复⽤用 需要定义结构和样式 开发版本和发布版本不不⼀一致,容易易逻辑不不⼀一致 require.js 仅限项⽬目⽬目录内寻址 优化慢 API冗⻓长且不不规范 发布版本依赖构建配置⽂文件,容易易漏漏配置项 与是否压缩并没有太⼤大关系 按路路径精确寻址 继承过多,难以理理解 发布过程完成构建,反馈不不直观 依赖关系不不透明,⽆无法介⼊入分析优化 ⽆无法与npm配合使⽤用 易易⽤用性 规范性
- 20.富途组件化 1.前尘往事 2.初试⽜牛⼑刀 3.为伊憔悴 4.灯⽕火阑珊
- 21.跨项⽬目复⽤用 • 安装(下载) 升级 • 包管理理 • bower • component • npm
- 22.跨项⽬目复⽤用 • 引⽤用(打包) • 尽可能兼容已有代码 • 跟包管理理⾃自然地结合
- 23.跨项⽬目复⽤用
- 24.跨项⽬目复⽤用 npm install ui-modal --save
- 25.require.js → webpack • 1个⼈人 6个⽉月 2单事故 • 600+ js⽂文件 • 关键点: • 多⻚页⾯面多⼊入⼝口 • require.js插件 • 远程模块 • shim(ueditor/jquery/ plupload/angular)
- 26.组件抽取 • 20+组件迁移到单独的Git仓库 • webpack⽀支持node_modules寻址 • 使⽤用npm引⽤用组件
- 27.组件抽取
- 28.组件抽取
- 29.i18n • webpack-amdi18n-loader • 与require.js i18n plugin⼏几乎⼀一样的⽤用法 • runtime选择语⾔言包 • 根据window._i18n.locale或者html[lang]选择 • ⽀支持AMD/CommonJS/JSON/Coffee
- 30.webpack-amdi18n-loader
- 31.组件开源https://github.com/futuweb
- 32.打包体积 • 同⼀一模块重复打包 • 多个⼊入⼝口⽂文件中的相同依赖 缓存复⽤用 HTTP请求
- 33.pa 压 缩 ck 增 量 压 缩 ck 全 量 15 eb pa 缩 未 压 量 增 缩 压 300 w eb .js ck 全 量 ir e .js 缩 压 未 30 w pa qu ir e .js 0 eb re qu ir e 950 re qu 900 w re 打包速度 1200 1,020 600 300 20
- 34.速度 - 增量量和缓存 • 分治:划模块和⼦子任务 分别缓存打包 • 根据源码分析依赖列列表 • 根据打包后的⽂文件获取依赖列列表 • webpack watch的缓存落地 • 先打包 根据中间状态做缓存过滤 再压缩
- 35.速度 - 增量量和缓存
- 36.速度 - 增量量和缓存
- 37.打包环境 开发机 发布机 环境不不⼀一 模块版本不不⼀一 依赖⾃自觉 影响发布时间 结果⽆无反馈 CPU负载⾼高 ⽣生产环境 downtime 影响负载 安全和运维
- 38.打包环境 开发机 CI 发布机 环境不不⼀一 模块版本不不⼀一 依赖⾃自觉 环境⼀一致 专属运算能⼒力力 邮件反馈 影响发布时间 结果⽆无反馈 CPU负载⾼高 ⽣生产环境 downtime 影响负载 安全和运维
- 39.打包环境
- 40.问题 构建不不 可控 构建奇慢 需要定义结构和样式 API冗⻓长且不不规范 继承过多,难以理理解 跨项⽬目 复⽤用 易易⽤用性 规范性
- 41.问题 需要定义结构和样式 API 冗⻓长且不不规范 易易⽤用性 规范性 继承过多 难以理理解 依赖jQuery 难复⽤用 野蛮发展 缺少规划 从Git安装 semver失效
- 42.团队和项⽬目
- 43.组件2.0 • 全新API设计 • 去除多重继承的设计 • 组件封闭,提供定制化选项 • 全⾯面去jQuery 包装适配多框架 • 私有NPM • 重新规划组件
- 44.组件2.0 • 增删、合并组件列列表 • 落地设计规范 统⼀一交互视觉 • 编写测试⽤用例例 ⾃自动化测试 • 全新⽂文档和展示⻚页 • 使⽤用LessCSS • 全⾯面使⽤用ES2015
- 45.组件2.0 - ⾃自动化测试
- 46.组件2.0 - UI规范
- 47.组件2.0 - 私有NPM
- 48.组件2.0 - 私有NPM • 私有NPM registry.npm.oa.com • 命名空间@futuweb • semver语义化版本 解决组件重复打包
- 49.组件2.0 - API
- 50.组件2.0 - API包装
- 51.组件2.0 - ⽂文档
- 52.组件2.0 - ⽂文档
- 53.富途组件化 1.前尘往事 2.初试⽜牛⼑刀 3.为伊憔悴 4.灯⽕火阑珊
- 54.蓦然回⾸首 2015 webpack npm 2014 require.js 组件规范 2017 组件2.0 2016 打包和构建
- 55.蓦然回⾸首 • 团队的⼯工程化和技术迁移成本⾼高 • ⽅方案会和团队⼀一起不不断成⻓长 • 适合团队现状的⽅方案是最好的⽅方案 • 临渊羡⻥鱼者众 退⽽而结⽹网⽽而寡 • 细节为王 冷暖⾃自知
- 56.灯⽕火阑珊 • 不不断有新的问题出现 • 不不断有新的⼯工具出现 • 组件化和⼯工程化的终点在哪⾥里里
- 57.没有终点 - CSS • 核⼼心问题: • 代码组织和复⽤用 • 避免冲突 • CSS Next ? • CSS modules ?
- 58.CSS Modules
- 59.CSS Modules
- 60.CSS Modules • HTML模板中应⽤用不不⽅方便便 • classNames = require('xx.css');
- 61.没有终点 - 组件⽅方案 • • web components • 兼容性不不好 • 框架集成⽅方案缺失 react / angular.js / vue 通⽤用组件⽅方案 • 原⽣生代码包装 • ngVue(angular.js + vue) • JSX(react + vue)
- 62.npm是终极⽅方案吗
- 63.包管理理和引⼊入 • • 包管理理 • bower和component已死 • jspm呢? 引⼊入 • ES Modules落地? • system.js + http/2 ?
- 64.jspm + SystemJS
- 65.配置⼯工程师有归宿吗 Windows Mac / iOS Android Web?
- 66.