# develop-tools **Repository Path**: tinglab/develop-tools ## Basic Information - **Project Name**: develop-tools - **Description**: Team/RD/Tools - **Primary Language**: Shell - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-08-16 - **Last Updated**: 2023-01-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 匠心之路 > 观点:科技公司 “价值导向,业务选型(产品),管理(项目)整合,技术创新” 的。 > > 做事心态:脚踏实地、仰望星空。 > > 为人处事的哲学:道法术器势。“道以明向,法以立本,术以立策,势以立人,器以成事。” 以下是根据我曾经所在公司的经历总结,供研发团队参考。以通用优先,各平台特有补充。后续会随时调整补充。 ## 企业 创业是以融资支撑指数型增长的爆发领域的事情。 ### 要素 > 一个创业项目成功,技术只是各个条件中一环。用户体验打磨、营销各种因素的综合,甚至运气占非常重要的成分。在 2B 领域,客户选择一个产品,会有很多综合考量,例如产品特色、实施成本、维护服务等,并不仅仅是产品功能和公司规模能决定的。 ![](./img/271320871718220728.jpg) ### 视野·事业 ![](./img/219354919318427695.jpg) ## 管理(团队协作/项目管理) > 公司成长业务增加,核心的关键是让优秀人才的密度超过业务复杂度的增加。 ![业务、人才、流程的关系](https://raw.githubusercontent.com/TingGe/develop-tools/master/img/640.png) *详见:附录「2016码会」张一鸣:为何不赞同控制人力成本* ### 员工特点 [创业公司员工都有哪些特点?](https://mp.weixin.qq.com/s?__biz=MjM5ODQwMjA4MA==&mid=401385432&idx=1&sn=19819579203c1d6711663e7b6964ccc2) ### 日常管理 > 团队协作的核心是项目管理,其他工具需要配合项目管理平台来选择。 > > 利益相关者:发起方、项目经理(PM)、产品(PD)、交互(UX)、视觉(UI)、前端(FE)和后端 > > 最佳实践: > 3个平台,PRD和Demo分享平台;整合了Sketch、图标库、可输出npm包和(SVG格式)设计稿分发的 Living Style Guide 平台;需求和缺陷跟踪平台 > 组件化的设计、开发;沉浸式页面交互 - 项目管理方式:Agile Project Management(Scrum、Kanban、XP、Lean)、PMP - 时间管理:[RescueTime](https://www.rescuetime.com/) - 协调团队间工作:[ZenHub](https://www.zenhub.com/)、[Trello](https://trello.com/)、[Slack](https://slack.com/)、[Redmine](http://www.redmine.org/projects/redmine/wiki/Download)(需求过程管理)、[Confluence](https://www.atlassian.com/software/confluence)(需求内容管理)teambition、Gantter、HackPad、Mantis - 任务排期:[OmniPlan](https://www.omnigroup.com/omniplan)、[Microsoft Project](https://products.office.com/en-us/project/project-and-portfolio-management-software) - PRD 协作和分享平台:OmniGraffle - 交互稿:Sketch + [Marketch](https://github.com/tudou527/marketch) - 原型:Axure、[Fuse](https://www.fusetools.com/)、[Pencil](https://github.com/evolus/pencil) - Living Style Guide平台:[getstorybook](https://getstorybook.io/)(支持React Native)、[Styleguide](https://github.com/hugeinc/styleguide/)、Styleguide - 图标库:[CSSIcon](https://github.com/wentin/cssicon)、[阿里巴巴矢量图标库](http://iconfont.cn/)、[icons8 animated icons](https://github.com/icons8/titanic)、[Feather](https://feathericons.com/) - 文件共享服务:NAS - 文档:[Typora](https://typora.io)、[语雀](https://yuque.com/)、[Evernote](https://www.evernote.com/)、MS Office、[Laverna](https://github.com/Laverna/laverna)(私有云笔记) - Markdown 转 Google Slides:[md2googleslides](https://github.com/googlesamples/md2googleslides) - 架构图:[OmniGraffle](https://www.omnigroup.com/omnigraffle/) - 会议与头脑风暴:[Draw.io](https://www.draw.io/)、[MindMup](https://www.mindmup.com/)、[百度脑图](http://naotu.baidu.com/)、[ProcessOn](https://www.processon.com/)、MindNode、XMind、Mindjet MindManager - 前后端接口约定:[Swagger](https://github.com/swagger-api/swagger-codegen)、[Slate](https://github.com/lord/slate)、Rap - 接口对比验证:[Diffy](https://github.com/twitter/diffy) ## 研发 #### 技术挑战 1. 快速、低成本的搭建系统,确保安全稳定 2. 快速的构建和发布应用,满足业务需求 3. 提高团队开发效率,确保开发质量 #### 应对方案 > 组织文化上:公司内部应重视 code review、wiki,重视技术分享,给予并鼓励 20% 个人项目时间;不是内斗纷争、团队方向散乱、技术氛围不浓厚。 > > 大型应用的编程,一般会遇到性能墙和复杂度墙两类问题。 ##### 标准 > [12-factors](https://12factor.net/zh_cn/) 1. 基准代码:一份基准代码,多份部署; 2. 依赖:显示声明依赖关系; 3. 配置:在环境中存储配置; 4. 后端服务:把后端服务当作附加资源; 5. 构建,发布,运行:严格分离构建和运行; 6. 进程:以一个或多个无状态进程运行应用; 7. 端口绑定:通过端口绑定提供服务; 8. 并发:通过进程模型进行扩展; 9. 易处理:快速启动和优雅终止可最大化健壮性; 10. 开发环境与线上环境等价:尽可能的保持开发,预发布,线上环境相等; 11. 日志:把日志当作事件流; 12. 管理进程:后台管理任务当作一次性进程运行。 ##### 备选工具 - 应用程序执行容器: [Docker](https://www.docker.com/)、[Kubernetes](https://kubernetes.io/) - 代码仓库:Github、[GitLab](https://about.gitlab.com/) - Git 代码库命令:[Git Pretty](https://raw.githubusercontent.com/TingGe/develop-tools/master/img/git-pretty.jpg) - 代码审核:[Phabricator](https://github.com/phacility/phabricator) - 代码片段分享平台:[ESNextbin](https://esnextb.in/)、[RequireBin](http://requirebin.com/)、[React.run](http://www.react.run/)、[CodePen](http://codepen.io/) - 规范:[语义化版本 2.0.0](http://semver.org/lang/zh-CN/)、[表述性状态转移(RESTful API)](http://www.ituring.com.cn/tupubarticle/3790)、远程过程调用(RPC)、面向服务架构(SOA) - 发布并测试的持续集成工具: Jenkins、Travis CI 和 Circle CI - 监控应用:[Zabbix](http://www.zabbix.com/)、[Collected](https://collectd.org/)、 [Trace](https://trace.risingstack.com/) - 实时数据一站式解决方案:ELK stack([ElasticSearch](https://www.elastic.co/products/elasticsearch)、[Logstash](https://www.elastic.co/products/logstash)、[Kibana](https://www.elastic.co/downloads/kibana)) - 移动测试缺陷发现和管理:[Bugtags](https://www.bugtags.cn/)、[Fabric](https://get.fabric.io/) - Bage服务:[shields](https://github.com/badges/shields) ### 技术 > Web 核心:API、JavaScript、Html、CSS > > 快速迭代的产品必须有敏捷的技术栈和稳定的框架。 #### JavaScript 应用领域和技术栈 JavaScript 在经历端的融合、栈的融合阶段。JavaScript 可以做很多事情:从前端到全栈,从桌面到移动、物联网,从应用到游戏。然而,其在大数据、高强度计算等等这些考验性能和执行效率的场景并不适用。 | 应用领域 | 技术栈 | | ---------------- | ------------------------------------------------------------ | | 全栈 JavaScript | [React Starter Kit](https://github.com/kriasoft/react-starter-kit) | 服务器端 | [MidwayJS](https://midwayjs.org/)、[Nest](https://github.com/nestjs/nest) | | 浏览器插件和扩展 | 见 [Extensions和Bookmarklet](https://github.com/TingGe/chrome-extensions/blob/master/README.md) | | 桌面应用 | [Electron](https://electron.atom.io/) | | 移动端 | [React Native](https://facebook.github.io/react-native/)、Hybrid App(Cordova + AngularJS + lonic)、 [Rax](https://rax.js.org/)、[Weex](https://weex.apache.org/)、Native、微信小应用、快应用、PWA | | 游戏 | PixiJS、Phaser、Cocos2d-x、Unity3D、Pomelo、Bearcat | | 物联网 | [Cylon](https://cylonjs.com/)、Arduino、Tessel、[Ruff](https://ruff.io/zh-cn/) | | 机器学习 | [deeplearn.js](https://github.com/PAIR-code/deeplearnjs)、[TensorFire](https://tenso.rs/)、[brain.js](https://github.com/harthur-org/brain.js) (神经网络)、[Synaptic](https://github.com/cazala/synaptic) (神经网络)、[Natural](https://github.com/NaturalNode/natural) (自然语言处理)、[ConvNetJS](http://cs.stanford.edu/people/karpathy/convnetjs/) (卷积神经网络)、 [mljs](https://github.com/mljs) (一组具有多种功能的子库)、[Neataptic](http://dnn%20execution%20framework%20o/) (神经网络)、[Webdnn](https://github.com/mil-tokyo/webdnn) (深度学习)、[Deep playground](https://github.com/tensorflow/playground)、 [FlappyLearning](https://github.com/xviniette/FlappyLearning)、 [Land Lines](https://github.com/ofZach/landlines)、 [Thing Translator](https://github.com/dmotz/thing-translator)、 [Neurojs](https://github.com/janhuenermann/neurojs)、 [Machine_learning](https://github.com/junku901/machine_learning)、[DeepForge](https://github.com/deepforge-dev/deepforge)、[Keras.js](https://transcranial.github.io/keras-js) | 附:[Machine Learning in Javascript: Introduction](http://burakkanber.com/blog/machine-learning-in-other-languages-introduction/) #### JavaScript 引擎 && 渲染引擎 JavaScript 引擎工作原理是,围绕抽象语法树(AST), 大致分 parse > transform > generator 三步实现 JavaScript 代码到机器码的转换。 | Browser, Headless Browser, or Runtime | JavaScript引擎 | 渲染引擎 | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | Mozilla | [Spidermonkey](https://developer.mozilla.org/zh-CN/docs/Mozilla/Projects/SpiderMonkey) | [Servo](https://github.com/servo/servo) 或 [Gecko](https://github.com/mozilla/gecko-dev) | | Chrome | [V8](https://github.com/v8/v8) | [Blink](https://chromium.googlesource.com/chromium/blink) | | Safari | [JavaScriptCore](https://github.com/WebKit/webkit/tree/master/Source/JavaScriptCore) | [Webkit](https://github.com/WebKit/webkit) | | IE and Edge | [Chakra](https://github.com/Microsoft/ChakraCore) | EdgeHTML 和 Trident | | TrifleJS | V8 | | | Node.js | V8 | | | [Node.js on ChakraCore](https://github.com/nodejs/node-chakracore) | [Chakra](https://github.com/Microsoft/ChakraCore) | | | Ruff | [Duktape](http://duktape.org/) | | #### JavaScript 编译器 JavaScript 编译器原理同 JavaScript 引擎类似,区别是转换后还是 JavaScript 代码。 如果想看下 AST 可以试下 [AST Explorer](https://astexplorer.net/) 。 | JavaScript compiler | 说明 | | ------------------------------------------------------------ | ------------------------------------------------------------ | | [Prepack](https://prepack.io/) | 采用局部优化的思路。运行在AST级别,用Babel解析并生成JavaScript源代码 | | [Closure Compiler](https://developers.google.com/closure/compiler/) | Google 的 JavaScript 代码优化工具 | | [Babel](https://babeljs.io/)(含 [Babylon](https://github.com/babel/babylon)、[babel-traverse](https://www.npmjs.com/package/babel-traverse)、[babel-generator](https://www.npmjs.com/package/babel-generator) ) | ES6 转 ES5 | | [Lebab](https://lebab.io/) | ES5 转 ES6 | | TypeScript 的 tsc | `tsc` 是 TypeScript 转译的命令,用于转换为 JavaScript | ### 软件设计模式 > 维基百科:[软件设计模式](https://zh.wikipedia.org/wiki/Category:%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F) > > 秉持最简单的**分层**和**依赖规则**开发,就能开发出干净整洁的系统架构。 虽然这些架构在细节处都有一些变化,但是实际上,它们是非常相似的。它们的目标是一样的,将各种实体间的关系进行分离。它们分离操作的方法也是一样的,采用软件分层的方式。它们分的层中至少有一个业务逻辑层,并且有其他的接口层。——摘取自《[架构整洁之道](http://www.cnblogs.com/yjf512/archive/2012/09/10/2678313.html)》 架构特征: 1. 与框架分离 2. 可测试性 3. 与UI的分离 4. 与数据库的分离 5. 与外部结构的分离 #### 软件设计架构 | | 提出时间 | 作者 | 说明 | 落地实例 | | ------------------------------------------------------------ | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | [DDD(Domain-driven design)](https://en.wikipedia.org/wiki/Domain-driven_design)/[命令和查询责任分离(CQRS)](http://martinfowler.com/bliki/CQRS.html) | 2004 | Eric Evans/Greg Young | DDD 将软件开发分两个阶段:需求交流中发现领域概念,设计成领域模型;由领域模型驱动软件设计,代码实现领域模型。 CQRS 将应用分为:查询部分(查看模型)和命令部分(写入模型)。 业务逻辑层两个组件相互独立地运行。因此,读取模型(Read Model)将会处理用户的查询——在处理能力方面的要求会更少一些,而写入模型(Write Model)将会经历一个很长的处理路径,包括校验、队列、消息以及用户命令要执行的业务规则处理。 | Flux | | 六边形架构Hexagonal Architecture (也称为 端口和[适配器](http://cpro.baidu.com/cpro/ui/uijs.php?rs=1&u=http%3A%2F%2Fwww%2Ejdon%2Ecom%2Fartichect%2Fthe%2Dclean%2Darchitecture%2Ehtml&p=baidu&c=news&n=10&t=tpclicked3_hc&q=banq_cpr&k=%CA%CA%C5%E4%C6%F7&k0=%CA%FD%BE%DD%BF%E2&kdi0=8&k1=%BF%D8%D6%C6%C6%F7&kdi1=8&k2=%D4%B4%B4%FA%C2%EB&kdi2=1&k3=%CA%CA%C5%E4%C6%F7&kdi3=1&k4=sql&kdi4=8&sid=1e7c4ea576ec9f0b&ch=0&tu=u1683405&jk=bd19187c218e7435&cf=29&fv=14&stid=9&urlid=0&luki=4&seller_id=1&di=128)) | 2005 | [Alistair Cockburn](http://alistair.cockburn.us/Hexagonal+architecture) | 包括三个层,其中最关键是的**领域模型**,包括所有的应用逻辑与规则。在领域层中不会直接引用技术实现。 包围在领域层之外的是**端口层**,负责接收与用例相关的所有请求,这些请求负责在领域层中协调工作。端口层在端口内部作为领域层的边界,在端口外部则扮演了外部实体的角色。 在端口层之外的是**适配器层**,这一层的技术实现负责以某种格式接收输入、及产生输出 | | | [洋葱图架构 The Onion Architecture](http://jeffreypalermo.com/blog/the-onion-architecture-part-1/) | 2006 | [Jeffrey Palermo](http://jeffreypalermo.com/blog/onion-architecture-part-4-after-four-years/) | 和六边形架构一脉相承,可理解为六边形架构的子集。 常和DDD一起使用。以领域模型为中心,从里到外是**领域模型、领域服务、应用服务**,外面的都会用到里面的内容,最外围的是容易变化的内容,如界面、测试和基础设施(如数据存储等) | | | [Clean架构](https://www.bbsmax.com/A/pRdBWY3ezn/) | 2012 | [Robert C. Martin](https://sites.google.com/site/unclebobconsultingllc/) | 可看作六边形架构的衍生, 和 The Onion Architecture 异曲同工,对组织大型应用很有参考价值,也有很多语言在实践 | | | MVC | 1978 | [Trygve Reenskaug](https://zh.wikipedia.org/w/index.php?title=Trygve_Reenskaug&action=edit&redlink=1) | MVC模式在概念上强调 Model, View, Controller 的职责分离。 MVC 应用时会产生很多文件,但带来的可测试性、可扩充性和可维护性,利于单元测试、自动化测试、CI和持续发布 | Smalltalk、Java、.NET、Ruby,JavaScript,Python,PHP,ActionScript 3 | | DCI | 2000—2008 | James Coplien和Trygve Reenskaug | DCI 是 MVC 的一种补充。MVC 作为一种范式语言继续用于分离数据和对数据的处理和对数据的展现。OO 衍生出很多概念、模式,DCI 为解决 OO 及 MVC 存在的这些问题而提出。 它试图在 OO 和数据结构+算法的模型寻求平衡,引入函数式编程的概念来解决 OO 中存在的一些问题。常见的概念,如 Mixins、Multiple dispatch、 Dependency injection、Multi-paradigm design、 [Aspect-oriented programming](https://en.wikipedia.org/wiki/Aspect-oriented_programming) (AOP)、 [Role-oriented programming](https://en.wikipedia.org/wiki/Role-oriented_programming) 等 | Self、Smalltalk-Squeak,C ++,C#,Ruby,JavaScript,Python,Qi4J(Java), Scala,Perl和PHP | | BCE模式(Boundary-Control-Entity Patterns) | ? | Ivar Jacobson | 跟著名的MVC模式(Model-View-Control Pattern)概念相似。将对象分为三类:边界类(boundary class,隔离系统内外)、控制类(control class,控制用例执行期间的复杂运算或者业务逻辑)和实体类(entity class,对应领域概念的类,主要用来保存问题领域中的重要信息,封装了跟数据结构和数据存储有关的变化) | | 附一张 [对比 BCE、MVC 和 3-Tier 的图](./img/VH0W5.jpg)。 #### 展示模式架构 | 展示模式架构 | 说明 | | | ------------ | ---- | ---- | | MVP(SC) | | | | MVP(PV) | | | | PM | | | | MVVM | | | | MVC | | | #### 模式 > 模式,帮助你设计API、搭建代码架构、优化性能 1. [API模式](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/api.js),帮助我们为函数给出更干净的接口,包括 | 模式 | 说明 | | -------- | -------------------------------------------- | | 回调模式 | 传入一个函数作为参数 | | 配置对象 | 帮助保持函数的参数数量可控 | | 返回函数 | 函数的返回值是另一个函数 | | 柯里化 | 新函数在已有函数的基础上再加上一部分参数构成 | 2. [初始化模式](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/init.js),帮助我们用一种干净的、结构化的方法来做一些初始化工作,通过一些临时变量来保证不污染全局命名空间。包括: | 模式 | 说明 | | -------------- | ------------------------------------------------------------ | | 即时函数 | 当它们被定义后立即执行 | | 对象即时初始化 | 初始化工作被放入一个匿名对象,这个对象提供一个可以立即被执行的方法 | | 条件初始化 | 使分支代码只在初始化时执行一次,而不是在整个程序生命周期中反复执行 | 3. [性能模式](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/performance.js),帮助提高代码执行速度,包括: | 模式 | 说明 | | ---------- | -------------------------------------------------- | | 记忆模式 | 利用函数的属性,使已经计算过的值不用再次计算 | | 重定义函数 | 重写自身的函数体,使第二次及后续的调用做更少的工作 | 4. 对象创建模式,包括: | 模式 | 说明 | | ------------------------------------------------------------ | :------------------------------- | | [命名空间模式 + 依赖声明模式](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/namespace.js) | 保持全局空间干净、帮助组织代码 | | [沙箱模式](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/sanbox.js) | 唯一的全局变量是一个构造函数 | | 链式调用模式 | | | [method() 方法](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/method.js) | 将JavaScript变得像基于类的语法糖 | 5. 代码复用模式。 > “优先使用对象创建而不是类继承” | 模式 | 说明 | | ------------ | ------------------------------------------------------------ | | 现代继承模式 | [Object.create()](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/create.js) 、借用方法、绑定、[复制属性](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/extend.js)、[混元](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/mix-ins.js) | | 类式继承 | [Klass](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/kclass.js) | 6. 设计模式,包括: ![设计模式六大原则](https://raw.githubusercontent.com/TingGe/develop-tools/master/img/2012110233.jpg) | 模式 | 说明 | 遵循原则 | | ------------------------------------------------------------ | ------------------------------------------------------------ | --------------------- | | [单例模式](https://github.com/TingGe/knowledge/tree/master/javascript/others/javascript.patterns/singleton) | 使用`new`、通过同一个构造函数来创建多个对象时,得到同一个对象的不同引用 | | | [工厂模式](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/factory.js) | 在运行时通过指定字符串来创建指定类型对象的方法 | 开闭原则(OCP) | | [遍历模式](https://github.com/TingGe/knowledge/tree/master/javascript/others/javascript.patterns/iterator) | 提供一种简单的API(hasNext()、next())来访问复杂的有序聚合数据的每个元素 | | | [装饰模式](https://github.com/TingGe/knowledge/tree/master/javascript/others/javascript.patterns/decorate) | 在运行时动态地给一个对象添加一些额外功能 | | | [策略模式](https://github.com/TingGe/knowledge/tree/master/javascript/others/javascript.patterns/strategy)(对比 [状态模式](https://github.com/TingGe/knowledge/tree/master/javascript/others/javascript.patterns/status)) | API一致情况下,允许在运行时选择策略 | | | [外观模式("门面模式")](https://github.com/TingGe/knowledge/blob/master/javascript/%E4%BA%8B%E4%BB%B6%E7%B3%BB%E7%BB%9F/dom-events/dom-events.js) | 包装通用的或者设计很差的方法来提供一个更方便的API | 迪米特法则(LoD,LKP) | | [代理模式](https://github.com/TingGe/knowledge/tree/master/javascript/others/javascript.patterns/proxy)(对比 适配器模式) | 一个对象充当了另一个对象的接口的角色 | | | 适配器模式 | 将接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作 | | | [中介者模式](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/mediator.html) | 各彼此合作的对象通过一个`mediator`(中介者)对象通讯 | | | [观察者模式](https://github.com/TingGe/knowledge/tree/master/javascript/others/javascript.patterns/observer)(“订阅者/发布者”或“自定义事件”) | 创建“可被观察的对象”使它在某个事件发生时通知订阅者的方式 | | 7. DOM和浏览器中的模式,包括: > 遵循分离和渐进增强的思想 | 类别 | 模式 | 说明 | | ---------------- | ------------------ | ------------------------------------------------------------ | | DOM编程 | DOM访问 | 避免在循环中访问DOM | | | | 将DOM引用赋给本地变量,然后操作本地变量 | | | | 当可能的时候使用selectors API | | | | 遍历HTML collections时缓存length | | | DOM操作 | [使用文档碎片](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/documentfragment.js) | | | | “cloneNode父节点+修改+replaceChild” | | 事件 | 事件处理 | | | | 事件委托 | | | 长时间运行的脚本 | | setTimeout() | | | | [Web Workers](https://github.com/TingGe/knowledge/tree/master/javascript/others/javascript.patterns/web-workers) | | 远程脚本编程 | | [XMLHttpRequest](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/xhr.html) | | | | [JSONP](https://github.com/TingGe/knowledge/blob/master/javascript/others/javascript.patterns/jsonp.html) | | | | 框架(frame)和图片信标(image beacon) | | 部署JavaScript | 合并脚本 | | | | 压缩 + gzip | | | | 使用CDN + 缓存头 | | | | 加载策略 | HTML5中更好的`async` | | | 引入页面脚本的模式 | `