SlideShare una empresa de Scribd logo
1 de 31
谈谈前端模块化



 2011年06月07日 阳衡锋
议程


模块化介绍

模块化演进过程

模块化的实现手段

Noah组件库中模块化的实践
什么是模块?
前端模块化的优点:

•可维护性:
  灵活架构,焦点分离,低耦合,高内聚
  方便模块间的组合,分解
  方便单个模块功能调试,升级
  多人协作互不干扰
•可测试性
前端模块化的缺点:

•性能损耗
•系统分层
•模块间的通信
前端模块的边界:

•功能边界
•可重用的粒度
•人员的分工
万物皆模块:




http://925html.com/techniques/auto-building-yui-3-custom-modules/
前端模块:

          HTML
            +
          CSS
            +
        JavaScript
演进-现状
演进-CSS的模块化
演进-现状的不足

•一个文件完成独立的功能,而且粒度很细
•细粒度的引入是为了防止引入无关的
js,css
•事实上适得其反,使用者往往徒简单,会
引入多余的js css
演进-使用loader


              声明模块
              模块=js+css



              使用js加载
              js,css,回调
演进-使用loader

优点:
•减少了js,css的引入,防止重复加载


缺点:
•模块之间的依赖关系未知,加载顺序比较
严格,后面模块依赖于前面模块。
为loader添加依赖声明

                声明模块
                模块=js+css+
                依赖


                Base模块自
                动加载

按需引入,无需考虑个模块内部依赖
loader不足
http请求太多?
•尝试后端combo服务
•深入浏览器javascript加载机制


依赖关系不智能?
•重新审视我们的“模块”


并不是每个模块都能如此加载,如My97DP
浏览器脚本加载
分为两个阶段:下载阶段,执行阶段


                •按需加载,并行
•脚本加载阻塞         下载
           VS   •严格的依赖关系,
•浏览器并发限制        脚本执行顺序
脚本加载策略:
脚本加载执行几种控制方法:
1.给script设置src属性但是并不把dom节点append到head中,实现预加载,当dom追加
到head中时脚本执行(IE中使用该方法)。


2.相同domain。使用XHR对象加载。然后使用eval(xhr.responseText)来执行脚本。


3.非IE浏览器,使用<script type=”text/cache”></script>来预先加载脚本。然后将
type=”text/javascript”来执行脚本。
(类似的思路还可以使用(new Image().src=”xx.js” 来将脚本加载到缓存中,然后使用DOM
操作添加script节点)


4.使用html5中<script async ></script>来保证执行顺序


5.单个js加载直接使用DOM操作。
一些脚本加载器

•LabJs
•Requirejs
Combo服务
YUI combo:按需拼接js,打包,混淆压缩




需要有后端能读取的依赖关系才能完成按
需加载
Tangram的自动引入   /import.php?f=baidu.ui.Tab
Commonjs规范来定义模块
              模块定义:提
              供的API在
               export上


         使用require引入无需关
           心模块间的依赖
nodejs:一种commonjs的实现




•require同步加载js,在web环境中比较困难
seajs:完美的模块化的实现

•实现commonjs模块规范
•依赖可追朔
•按需引入,按序引入
•配合打包部署工具
Seajs中的“声明”式依赖
模块的通信机制:通知/监听
             Notify




    Listen
模块的通信机制
•有效减少了模块之间的耦合
•各模块都不知道彼此的存在
•任何模块的缺失都不会影响整体运行
•事件通知给第三方,监听也是监听第三方事件
•整个应用变得强壮,可伸缩性增强
•各模块各司其职,分工协作完成应用
Noah组件库的一些实践:
组件库的特点:
•依赖关系比较简单
•模块粒度比较大
处理办法:

•压缩打包工具,提供部署方法
•引入时防止缓存
http://fe.baidu.com/doc/noah/nuit/#uitext/ui_devcomp.text
总结:
模块化实现的技术点:
•模块本身的定义,注册
•依赖声明,追朔机制
•开发阶段的加载机制
•打包部署机制
•模块间的通信机制
参考资料:
•Commonjs模块规范:http://wiki.commonjs.org/wiki/Modules/1.1
•动态脚本执行顺序:http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order
•模块化: http://baike.baidu.com/view/182267.htm
•Labjs: http://labjs.com
•Requirejs:http://requirejs.org/
•Nodejs: http://nodejs.org
•Seajs:http://seajs.org/
•Kissy的前端模块化实践 http://www.slideshare.net/yiminghe/kissy-6637677
•可伸缩性架构: http://www.slideshare.net/nzakas/scalable-javascript-application-
architecture
•再读可扩展的javascript架构:
http://hi.baidu.com/ywdblog/blog/item/f4f6680e15737cc57acbe100.html
Q&A
Thanks!

Más contenido relacionado

La actualidad más candente

Azure 迁移之道
Azure 迁移之道Azure 迁移之道
Azure 迁移之道Tao Wang
 
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Justin Lin
 
前端编译平台
前端编译平台前端编译平台
前端编译平台Welefen Lee
 
大众点评网的技术变迁之路
大众点评网的技术变迁之路大众点评网的技术变迁之路
大众点评网的技术变迁之路jeffz
 
百度前端性能监控与优化实践
百度前端性能监控与优化实践百度前端性能监控与优化实践
百度前端性能监控与优化实践Welefen Lee
 
Ch09 整合資料庫
Ch09 整合資料庫 Ch09 整合資料庫
Ch09 整合資料庫 Justin Lin
 
你的 JS 該減肥了!5個提升網頁載入速度的技巧 - Modern Web 2020
你的 JS 該減肥了!5個提升網頁載入速度的技巧 - Modern Web 2020你的 JS 該減肥了!5個提升網頁載入速度的技巧 - Modern Web 2020
你的 JS 該減肥了!5個提升網頁載入速度的技巧 - Modern Web 2020Shubo Chao
 
Active Mq JMS
Active Mq JMSActive Mq JMS
Active Mq JMShzchenkj
 
領域驅動設計 (Domain Driven Design)
領域驅動設計 (Domain Driven Design)領域驅動設計 (Domain Driven Design)
領域驅動設計 (Domain Driven Design)Jeff Chu
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
 
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)ASP.NET 5 快速入門 (Getting Started ASP.NET 5)
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)Jeff Chu
 
Web coding principle
Web coding principleWeb coding principle
Web coding principleZongYing Lyu
 
构建基于Lamp的中型网站架构
构建基于Lamp的中型网站架构构建基于Lamp的中型网站架构
构建基于Lamp的中型网站架构HonestQiao
 
MySQL优化、新特性和新架构 彭立勋
MySQL优化、新特性和新架构 彭立勋MySQL优化、新特性和新架构 彭立勋
MySQL优化、新特性和新架构 彭立勋Lixun Peng
 
Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案美团技术团队
 
ASP.Net MVC2 简介
ASP.Net MVC2 简介ASP.Net MVC2 简介
ASP.Net MVC2 简介Allen Lsy
 
对MySQL的一些改进想法和实现
对MySQL的一些改进想法和实现对MySQL的一些改进想法和实现
对MySQL的一些改进想法和实现Lixun Peng
 

La actualidad más candente (20)

Azure 迁移之道
Azure 迁移之道Azure 迁移之道
Azure 迁移之道
 
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
 
React js
React jsReact js
React js
 
前端编译平台
前端编译平台前端编译平台
前端编译平台
 
大众点评网的技术变迁之路
大众点评网的技术变迁之路大众点评网的技术变迁之路
大众点评网的技术变迁之路
 
Vue
VueVue
Vue
 
百度前端性能监控与优化实践
百度前端性能监控与优化实践百度前端性能监控与优化实践
百度前端性能监控与优化实践
 
Ch09 整合資料庫
Ch09 整合資料庫 Ch09 整合資料庫
Ch09 整合資料庫
 
2009/10/07 meeting
2009/10/07 meeting2009/10/07 meeting
2009/10/07 meeting
 
你的 JS 該減肥了!5個提升網頁載入速度的技巧 - Modern Web 2020
你的 JS 該減肥了!5個提升網頁載入速度的技巧 - Modern Web 2020你的 JS 該減肥了!5個提升網頁載入速度的技巧 - Modern Web 2020
你的 JS 該減肥了!5個提升網頁載入速度的技巧 - Modern Web 2020
 
Active Mq JMS
Active Mq JMSActive Mq JMS
Active Mq JMS
 
領域驅動設計 (Domain Driven Design)
領域驅動設計 (Domain Driven Design)領域驅動設計 (Domain Driven Design)
領域驅動設計 (Domain Driven Design)
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)ASP.NET 5 快速入門 (Getting Started ASP.NET 5)
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)
 
Web coding principle
Web coding principleWeb coding principle
Web coding principle
 
构建基于Lamp的中型网站架构
构建基于Lamp的中型网站架构构建基于Lamp的中型网站架构
构建基于Lamp的中型网站架构
 
MySQL优化、新特性和新架构 彭立勋
MySQL优化、新特性和新架构 彭立勋MySQL优化、新特性和新架构 彭立勋
MySQL优化、新特性和新架构 彭立勋
 
Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案Truck js 高性能移动web开发解决方案
Truck js 高性能移动web开发解决方案
 
ASP.Net MVC2 简介
ASP.Net MVC2 简介ASP.Net MVC2 简介
ASP.Net MVC2 简介
 
对MySQL的一些改进想法和实现
对MySQL的一些改进想法和实现对MySQL的一些改进想法和实现
对MySQL的一些改进想法和实现
 

Destacado

I like this bag
I like this bagI like this bag
I like this bagechimeg
 
Herelegdehvvn word
Herelegdehvvn wordHerelegdehvvn word
Herelegdehvvn wordechimeg
 
Hereglegdehvvn
HereglegdehvvnHereglegdehvvn
Hereglegdehvvnechimeg
 
Halloween 2011
Halloween 2011Halloween 2011
Halloween 2011jimmypolk
 
Slideshare
SlideshareSlideshare
Slidesharemmehtala
 
Javascript加载总结
Javascript加载总结Javascript加载总结
Javascript加载总结衡锋 阳
 
I like this bag
I like this bagI like this bag
I like this bagechimeg
 

Destacado (9)

I like this bag
I like this bagI like this bag
I like this bag
 
Herelegdehvvn word
Herelegdehvvn wordHerelegdehvvn word
Herelegdehvvn word
 
Hereglegdehvvn
HereglegdehvvnHereglegdehvvn
Hereglegdehvvn
 
Web绘图
Web绘图Web绘图
Web绘图
 
Halloween 2011
Halloween 2011Halloween 2011
Halloween 2011
 
Slideshare
SlideshareSlideshare
Slideshare
 
Tangramgrid
TangramgridTangramgrid
Tangramgrid
 
Javascript加载总结
Javascript加载总结Javascript加载总结
Javascript加载总结
 
I like this bag
I like this bagI like this bag
I like this bag
 

Similar a 谈谈模块化

构建可维护的Javascript 小米网
构建可维护的Javascript 小米网构建可维护的Javascript 小米网
构建可维护的Javascript 小米网yang alex
 
Nodejs & NAE
Nodejs & NAENodejs & NAE
Nodejs & NAEq3boy
 
Clipper@datacon.2019.tw
Clipper@datacon.2019.twClipper@datacon.2019.tw
Clipper@datacon.2019.twWei-Yu Chen
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
 
Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超drewz lin
 
Notes of jcip
Notes of jcipNotes of jcip
Notes of jcipDai Jun
 
2011新版首页总结 技术篇
2011新版首页总结 技术篇2011新版首页总结 技术篇
2011新版首页总结 技术篇传贵 谢
 
从CI到CD[麻袋理财王天青]v1
从CI到CD[麻袋理财王天青]v1从CI到CD[麻袋理财王天青]v1
从CI到CD[麻袋理财王天青]v1天青 王
 
廣宣學堂: 企業導入微服務實戰
廣宣學堂: 企業導入微服務實戰廣宣學堂: 企業導入微服務實戰
廣宣學堂: 企業導入微服務實戰Paul Chao
 
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated企業導入微服務實戰 - updated
企業導入微服務實戰 - updatedPaul Chao
 
Mvc架构在discuz!插件开发的应用 wps create_msoffice_check
Mvc架构在discuz!插件开发的应用 wps create_msoffice_checkMvc架构在discuz!插件开发的应用 wps create_msoffice_check
Mvc架构在discuz!插件开发的应用 wps create_msoffice_checkCevin Cheung
 
Kissy design
Kissy designKissy design
Kissy designyiming he
 
Component in fe
Component in feComponent in fe
Component in fesking l
 
构建可扩展的微博系统
构建可扩展的微博系统构建可扩展的微博系统
构建可扩展的微博系统lonegunman
 
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated企業導入微服務實戰 - updated
企業導入微服務實戰 - updatedPaul Chao
 
Mock Server的应用与实践
Mock Server的应用与实践Mock Server的应用与实践
Mock Server的应用与实践qi lei
 
July.2011.w3ctech
July.2011.w3ctechJuly.2011.w3ctech
July.2011.w3ctechKai Cui
 
Introduction to NodeJS
Introduction to NodeJSIntroduction to NodeJS
Introduction to NodeJSTechParty@UIC
 

Similar a 谈谈模块化 (20)

构建可维护的Javascript 小米网
构建可维护的Javascript 小米网构建可维护的Javascript 小米网
构建可维护的Javascript 小米网
 
Nodejs & NAE
Nodejs & NAENodejs & NAE
Nodejs & NAE
 
Clipper@datacon.2019.tw
Clipper@datacon.2019.twClipper@datacon.2019.tw
Clipper@datacon.2019.tw
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超
 
Notes of jcip
Notes of jcipNotes of jcip
Notes of jcip
 
2011新版首页总结 技术篇
2011新版首页总结 技术篇2011新版首页总结 技术篇
2011新版首页总结 技术篇
 
从CI到CD[麻袋理财王天青]v1
从CI到CD[麻袋理财王天青]v1从CI到CD[麻袋理财王天青]v1
从CI到CD[麻袋理财王天青]v1
 
廣宣學堂: 企業導入微服務實戰
廣宣學堂: 企業導入微服務實戰廣宣學堂: 企業導入微服務實戰
廣宣學堂: 企業導入微服務實戰
 
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated企業導入微服務實戰 - updated
企業導入微服務實戰 - updated
 
Mvc架构在discuz!插件开发的应用 wps create_msoffice_check
Mvc架构在discuz!插件开发的应用 wps create_msoffice_checkMvc架构在discuz!插件开发的应用 wps create_msoffice_check
Mvc架构在discuz!插件开发的应用 wps create_msoffice_check
 
Kissy design
Kissy designKissy design
Kissy design
 
Component in fe
Component in feComponent in fe
Component in fe
 
java title
java titlejava title
java title
 
构建可扩展的微博系统
构建可扩展的微博系统构建可扩展的微博系统
构建可扩展的微博系统
 
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated企業導入微服務實戰 - updated
企業導入微服務實戰 - updated
 
Mock Server的应用与实践
Mock Server的应用与实践Mock Server的应用与实践
Mock Server的应用与实践
 
A
AA
A
 
July.2011.w3ctech
July.2011.w3ctechJuly.2011.w3ctech
July.2011.w3ctech
 
Introduction to NodeJS
Introduction to NodeJSIntroduction to NodeJS
Introduction to NodeJS
 

谈谈模块化