SlideShare a Scribd company logo
JavaScript Autoload
  更好的组织你的 JavaScript文件
       拔赤 – F2E@Taobao




                          2011-08
ongoingproject




http://ued.taobao.com/javascript   http://jayli.github.com/jswebapps

                                                                    @jayli
                                                        F2E & Translator
                                                 htt[p://jayli.github.com
                                                       bachi@taobao.com
Javascript autoload
静态语言
  vs
动态语言
如何载入外部文件/包?
PHP

<?php
   inlcude(‘config.php’);
   include(‘head.php’);
   include(‘sidebar.php’);
   include(‘main_content.php’);
   Include(‘sth_section.php’);

     //other logic
?>
C++
#include   <fstream>
#include   <sstream>
#include   <time.h>
#include   <stdio.h>
#include   <string.h>

int main(int argc,char **argv){
     //main logic…
}
Python

import dump.log
import io.xml
import io.json
from bean import *
From mod1 import *

# main logic…
PHP文件依赖

            config.php
                            sitenav.php

index.php
               header.php     channel.php



            content.php        section.php
JavaScript?
<script src=‘core.js’ />
<script src=‘dom.js’ />
<script src=‘util.js’ />
<script src=‘selection.js’ />
<script src=‘editor.js’ />
<script>
  //main logic…
</script>
JavaScript文件依赖 ?

              selection.js
                                dom.js
                                 style.js
editor.js
                  plugin.js       event.js



               editor‐util.js      core.js
                                   browser.js
JavaScriptLoader

YUI Loader
  http://developer.yahoo.com/yui/3
Yepnope.js
  http://yepnopejs.com
SeaJS
  http://seajs.com
YUILoader




http://developer.yahoo.com/yui/3
Loader.add({
  ‘base’:{
      path:’base.js’,
      requires:[‘dom’,’node’,’io’]
  },
  ‘pagination’:{
      path:’pagination-v121.js’,
      requires:[‘page-skin’,’node’,’base’]
  }
  //…
});
异步载入文件

Loader.use(‘pagination’,‘dump’,function(Y){
     //main logic…
});
Why异步?
function getScript(url,callback){
  var el = $.createElement(‘script’);
  el.src = url;
  el.onload = function(){
     callback();
  };
  document.head.appendChild(el);
}
除了html中的<script>标签
JavaScript文件载入都是异步
并行 or串行 ?
并行载入文件
getScritp(‘file1.js’);
getScript(‘file2.js’);
getScript(‘file3.js’);
…
//main logic ?
串行载入文件
getScritp(‘file1.js’,function(){
  getScript(‘file2.js’,function(){
      …
      getScript(‘fileN.js’,function(){
           //main logic…
      });
  });
});
可以这样串行!
getScritp(
  ‘file1.js’,
  ‘file2.js’,
  ‘file3.js’,…
  function(){
     //main logic…
  }
);
Yepnope.js




http://yepnopejs.com
Yepnope.js串行载入文件

yepnope([{
  load:[’file1.js’,’file2.js’]
  complete:function(){
     //main logic…
  }
}]);
有条件载入文件?
PHP
<?php
   if(condition1){
      include(‘file1.php’);
   } else if (condition2){
      include(‘file2.php’);
   } else {
      include(‘file3.php’);
   }

     //main logic…

?>
Yepnope.js

yepnope([{
  test:condition,
  yep:’file1.js’, // condition == true
  nope:’file2.js’,// condition == false
  complete:function(){
     //main logic…
  }
}]);
任意条件
if(condition1){
  getScript(‘file1.js’,foo);
}else if(condition2){
  getScript(‘file2.js’,foo);
}else{
  getScript(‘file3.js’,foo);
}

function foo(){ //主逻辑必须写入回调中
  //main logic…
}
可不可以不写回调?
CommonJS




http://www.commonjs.org
CommonJS




http://www.commonjs.org
CommonJS ∈ServerSide JS

   define(function(require){
     require(‘./mod1’); //阻塞式载入
     require(‘./mod2’); //阻塞式载入

     //main logic…
   });
CommonJS ∈Client SideJS?
SeaJS




http://seajs.com
SeaJS Demo- Calculator




   http://seajs.com/docs/demo/calculator/
JavaScript文件依赖
                      jquery.js
           stdin.js

                      calculate.js
init.js


                                      math.js
                          stdout.js
init.js
define(function(require){
     require(‘./stdin’); //输入的逻辑
     require(‘./stdout’); //输出的逻辑
});


             stdin.js
define(function(require){
     require(‘./jquery’); //载入jQuery
     require(‘./calculator’); //计算器的逻辑
});
JavaScript加载过程
闭包的重要性




http://seajs.com/docs/commonjs-modules.html#why-wrapped
SeaJS 伪阻塞 (init.js)
define(function(require){
     return;
     require(‘./mod1’);
     require(‘./mod2’);
});
Whatever
GoodIdea!
GoodIdea!

•   串行加载JavaScript文件
•   统一的沙箱结构
•   对沙箱逻辑的“预解析”
•   动态加载JavaScript文件
降低 JS文件之间的耦合
Problem!
define(function(require){
     require(‘./dom’); //必须手动引入文件?
     DOM.get(‘#id’);
});




    使用某个类的前提是
 必须知道它所在的模块/文件名称!
   并手动载入模块/文件!
Iwantthis!

define(function(require){
     require(‘./dom’);

      //知道了方法名,何必再需知道文件名?
      DOM.get(‘#id’);
});
CommonJS


文件名 =>命名空间
PHPautoload




http://cn.php.net/__autoload
<?php
  function __autoload($class_name) {
     if($class_name == ‘MyClass1’){
           require_once(‘MyClass1.php’);
      }else if($class_name == ‘MyClass2’){
           require_once(‘MC2_v102.php’);
      }
  }

  $obj = new MyClass1();
  $obj2 = new MyClass2();
?>
Sandbox.JS




https://github.com/jayli/sandbox
autoload map

function __autoload() {
  return {
     'S.Carousel':'carousel.js',
     'S.ColorPicker':'colorpicker-v1.js',
     'S.Editor':'article.js'
  };
}
SandboxJS Demo- autoload




http://jayli.github.com/sandbox/examples/autoload/test/mojo.html
<script src=“种子文件.js & 配置文件.js” />
<script>
Sandbox.ready(function(S){
  // 旋转木马模块
  S.Carousel.init(‘bid’);

 //选择颜色模块
 S.ColorPicker(‘cid’);

  //编辑器
  S.Editor(‘eid’,'淘宝UED');
});
</script>
JavaScriptAutoload

•   代码解耦更充分
•   开发者记忆负担最低
•   免除基础库升级更改文件名的麻烦
•   享受动态语言编程
•   …
Ok,开始享受编程?
Warning !!!
JavaScriptAutoload 的不足

 •   串行加载JS- 速度是个问题
 •   伪阻塞 - 客户端无“真”阻塞
 •   对包装器的支持不好(Wrap(dom))
 •   对链式调用支持不好
适用 JavaScriptAutoload 的场景

    •   内部系统 – 对性能要求不高
    •   ServerSideJavaScript
    •   当你想要更纯粹的编程时
    •   …
优化JS加载器的手段

    SeaJS - spm

YUI3 - configurator

CDN - Combo Handler
Enjoyit,Justforfun~
ref

http://developer.yahoo.com/yui/3
http://yepnopejs.com
http://seajs.com
https://github.com/seajs/spm
https://github.com/jayli/sandbox
http://www.commonjs.org
http://cn.php.net/__autoload
@jayli
       F2E & Translator
htt[p://jayli.github.com
      bachi@taobao.com

More Related Content

PDF
Node way
PDF
學好 node.js 不可不知的事
PDF
Koa 正在等一個人
PDF
advanced introduction to codeigniter
PDF
Node.js 入門 - 前端工程開發實務訓練
PDF
Django step0
PDF
Phpconf 2011 introduction_to_codeigniter
PDF
Introduction to MVC of CodeIgniter 2.1.x
Node way
學好 node.js 不可不知的事
Koa 正在等一個人
advanced introduction to codeigniter
Node.js 入門 - 前端工程開發實務訓練
Django step0
Phpconf 2011 introduction_to_codeigniter
Introduction to MVC of CodeIgniter 2.1.x

What's hot (20)

PDF
淺談 Groovy 與 Gradle
PDF
Browser vs. Node.js Jackson Tian Shanghai
PDF
JCConf2015: groovy to gradle
PDF
不断归零的前端人生 - 2016 中国软件开发者大会
PDF
Laravel II - Developer Student Clubs NCU.pdf
PDF
程式人雜誌 2015年三月
PDF
Spock:願你的測試長長久久、生生不息
PDF
那 Angular 那 AJAX 那 RESTful
PDF
一拍一产品背后的故事(React实战)
PDF
PHPUnit 入門介紹
PDF
Android vs e pub
PDF
Uliweb cheat sheet_0.1
PDF
webpack 入門
PDF
2021.laravelconf.tw.slides3
PPTX
Script with engine
PDF
My DevOps Tour 1.0
PDF
前端工程開發實務訓練
PDF
JavaScript Code Quality
PDF
YUI 教學 - 前端工程開發實務訓練
PDF
[PHP 也有 Day #64] PHP 升級指南
淺談 Groovy 與 Gradle
Browser vs. Node.js Jackson Tian Shanghai
JCConf2015: groovy to gradle
不断归零的前端人生 - 2016 中国软件开发者大会
Laravel II - Developer Student Clubs NCU.pdf
程式人雜誌 2015年三月
Spock:願你的測試長長久久、生生不息
那 Angular 那 AJAX 那 RESTful
一拍一产品背后的故事(React实战)
PHPUnit 入門介紹
Android vs e pub
Uliweb cheat sheet_0.1
webpack 入門
2021.laravelconf.tw.slides3
Script with engine
My DevOps Tour 1.0
前端工程開發實務訓練
JavaScript Code Quality
YUI 教學 - 前端工程開發實務訓練
[PHP 也有 Day #64] PHP 升級指南
Ad

Viewers also liked (6)

PDF
Js doc toolkit
PDF
赤骥 用户研究入门
PDF
卫银霞 -统计数字会撒谎
PDF
潜意识设计
PDF
F2e security
PDF
Yui3简介
Js doc toolkit
赤骥 用户研究入门
卫银霞 -统计数字会撒谎
潜意识设计
F2e security
Yui3简介
Ad

Similar to Javascript autoload (19)

PDF
SeaJS - 前端模块化开发探索与网站性能优化实践
PPTX
第三方内容开发最佳实践
PDF
SeaJS 那些事儿
PDF
JavaScript Engine
PPTX
Node js feat pegasus
PPT
Web设计 3 java_script初探(程序员与设计师的双重眼光)
PPTX
谈谈模块化
PDF
July.2011.w3ctech
PPT
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
PDF
更好的文件组织
PPTX
浅析浏览器解析和渲染
PDF
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
PDF
Banquet 52
KEY
Node combo
PPTX
J engine -构建高性能、可监控的前端应用框架
PDF
基于yui combo的代码自动压缩及合并
PPTX
J engine -构建高性能、可监控的前端应用框架
PPT
基于J2 Ee的Web应用
PDF
Node js实践
SeaJS - 前端模块化开发探索与网站性能优化实践
第三方内容开发最佳实践
SeaJS 那些事儿
JavaScript Engine
Node js feat pegasus
Web设计 3 java_script初探(程序员与设计师的双重眼光)
谈谈模块化
July.2011.w3ctech
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
更好的文件组织
浅析浏览器解析和渲染
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
Banquet 52
Node combo
J engine -构建高性能、可监控的前端应用框架
基于yui combo的代码自动压缩及合并
J engine -构建高性能、可监控的前端应用框架
基于J2 Ee的Web应用
Node js实践

More from jay li (20)

PDF
犀牛书第六版
PDF
淘宝移动端Web开发最佳实践
PDF
Jswebapps
PDF
潜力无限的编程语言Javascript
PDF
Responsive Web UI Design
PDF
深入剖析浏览器
PDF
HTML/CSS/JS基础
PDF
淘宝前端技术巡礼
PDF
中国元素在设计中的应用 -如瑟
PDF
编码大全 拔赤
PDF
小控件、大学问
PDF
Mobile UI design and Developer
PDF
Html5form
PDF
Slide
PDF
新业务新员工培训 Banner设计
PDF
夏之 专题设计
PDF
Ecmascript
PDF
2011彩票首页开发实践
PDF
Web设计的画纸深入了解我们的显示器
PDF
Html&css培训 舒克
犀牛书第六版
淘宝移动端Web开发最佳实践
Jswebapps
潜力无限的编程语言Javascript
Responsive Web UI Design
深入剖析浏览器
HTML/CSS/JS基础
淘宝前端技术巡礼
中国元素在设计中的应用 -如瑟
编码大全 拔赤
小控件、大学问
Mobile UI design and Developer
Html5form
Slide
新业务新员工培训 Banner设计
夏之 专题设计
Ecmascript
2011彩票首页开发实践
Web设计的画纸深入了解我们的显示器
Html&css培训 舒克

Javascript autoload