在使用 sea.js 、require.js 、 angular 的时候。

我们使用到  define 、 module(require) 的方式,定义模块,和依赖模块

下面给出 define 和 module 的简单实现。 其本质,就是往一个对象上面添加方法

	var F = {};
F.define = function(str,fn){
var parts = str.split(".");
var parent = this; // parent 当前模块的父模块
var i = len = 0; //如果第一个模块是模块单体对象,则移除
if(parts[0] == "F"){
parts = parts.slice(1);
} //屏蔽对 define module 模块方法重写
if(parts[0] == "define" || parts[0] == "module"){
return ;
} for(len = parts.length; i < len-1; i++){
//如果父模块中不存在当前模块
if(typeof parent[parts[i]] === 'undefined'){
//声明当前模块
parent[parts[i]] = {};
}
//缓存下一层父模块
parent = parent[parts[i]];
} if(fn && parts[i]){
//如果给定模块方法,则绑定该模块的方法,
parent[parts[i]] = fn();
}
return this;
} F.module = function(){
var args = [].slice.call(arguments);//复制参数
var fn = args.pop(); //获取回调 var parts = args[0] && args[0] instanceof Array ? args[0] : args; //模块的依赖
var modules = []; //模块的路由
var modIDs = ""; //依赖模块的索引
var i = 0; var len = parts.length; // 依赖模块的长度 var parent,j,jlen; //父级模块,模块路由层级索引,模块路由层级长度 while(i < len){
if(typeof parts[i] == "string"){
parent = this;
//解析路由,并且屏蔽掉 F
modIDs = parts[i].replace(/^F\./,"").split(".");
//遍历模块层级
for( j = 0,jlen = modIDs.length; j < jlen; j++){
//迭代 父模块
parent = parent[modIDs[j]] || false;
}
modules.push(parent); //将模块添加到依赖列表
}else{
//直接将模块添加到依赖列表
modules.push(parts[i]);
}
//取下一个模块
i++;
} //执行回调,将依赖的模块注入
fn.apply(null,modules); } //定义 string 模块
F.define("string",function(){
return {
trim(str){
return str.replace(/^s+|\s+$/g,"");
}
}
});
//定义 string 模块,的子模块 sub
F.define("string.sub",function(){
return {
low(str){
return str.toLowerCase();
}
}
});
console.log(F); //使用模块
F.module(["string","string.sub",document],function(str,strSub,doc){
console.log(str,strSub,doc)
});

  

当然了,这里使用的,F 对象,实际应用中,应该写在闭包里面。不能让外界直接访问,于是有如下代码。

	var Sea = (function(){
var F = {};
F.define = function(str,fn){
var parts = str.split(".");
var parent = this; // parent 当前模块的父模块
var i = len = 0; //如果第一个模块是模块单体对象,则移除
if(parts[0] == "F"){
parts = parts.slice(1);
} //屏蔽对 define module 模块方法重写
if(parts[0] == "define" || parts[0] == "module"){
return ;
} for(len = parts.length; i < len-1; i++){
//如果父模块中不存在当前模块
if(typeof parent[parts[i]] === 'undefined'){
//声明当前模块
parent[parts[i]] = {};
}
//缓存下一层父模块
parent = parent[parts[i]];
} if(fn && parts[i]){
//如果给定模块方法,则绑定该模块的方法,
parent[parts[i]] = fn();
}
return this;
} F.module = function(){
var args = [].slice.call(arguments);//复制参数
var fn = args.pop(); //获取回调 var parts = args[0] && args[0] instanceof Array ? args[0] : args; //模块的依赖
var modules = []; //模块的路由
var modIDs = ""; //依赖模块的索引
var i = 0; var len = parts.length; // 依赖模块的长度 var parent,j,jlen; //父级模块,模块路由层级索引,模块路由层级长度 while(i < len){
if(typeof parts[i] == "string"){
parent = this;
//解析路由,并且屏蔽掉 F
modIDs = parts[i].replace(/^F\./,"").split(".");
//遍历模块层级
for( j = 0,jlen = modIDs.length; j < jlen; j++){
//迭代 父模块
parent = parent[modIDs[j]] || false;
}
modules.push(parent); //将模块添加到依赖列表
}else{
//直接将模块添加到依赖列表
modules.push(parts[i]);
}
//取下一个模块
i++;
} //执行回调,将依赖的模块注入
fn.apply(null,modules);
}
return {
define:function(){
F.define.apply(F,arguments);
},
module:function(){
F.module.apply(F,arguments);
}
}
})(); //定义 string 模块
Sea.define("string",function(){
return {
trim(str){
return str.replace(/^s+|\s+$/g,"");
}
}
});
//定义 string 模块,的子模块 sub
Sea.define("string.sub",function(){
return {
low(str){
return str.toLowerCase();
}
}
});
console.log(Sea); //使用模块
Sea.module(["string","string.sub",document],function(str,strSub,doc){
console.log(str,strSub,doc)
});

  

javascript 构建模块化开发的更多相关文章

  1. JS模块化开发:使用SeaJs高效构建页面

    一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...

  2. JavaScript学习总结(六)——前端模块化开发

    早期的javascript版本没有块级作用域.没有类.没有包.也没有模块,这样会带来一些问题,如复用.依赖.冲突.代码组织混乱等,随着前端的膨胀,模块化显得非常迫切. 前端模块化规范如下: 一.前端模 ...

  3. 详解JavaScript模块化开发

    什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了,jQuery,Ajax,Node.Js,MVC,MVVM等 ...

  4. (转)详解JavaScript模块化开发

    https://segmentfault.com/a/1190000000733959 什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来j ...

  5. 轻轻谈一下seaJs——模块化开发的利器

    "仅做一件事,做好一件事." 这个应该就是seaJs的精髓了. 我在自己的一些项目中使用过seaJs.对其算是了解一二.如今就班门弄斧.轻轻地谈一下. 首先上一段度娘的话: &qu ...

  6. seajs的模块化开发--实践笔记

    2017-04-02 SeaJS是一个遵循CMD规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制.有效的解决复杂项目中命名冲突.依赖.性能等问题. SeaJS ...

  7. 深度扫盲JavaScript的模块化(AMD , CMD , CommonJs 和 ES6)

    原文地址 https://blog.csdn.net/haochangdi123/article/details/80408874 一.commonJS 1.内存情况 对于基本数据类型,属于复制.即会 ...

  8. Javascript模块化开发,使用模块化脚本加载工具RequireJS,提高你代码的速度和质量。

    随着前端JavaScript代码越来越重,如何组织JavaScript代码变得非常重要,好的组织方式,可以让别人和自己很好的理解代码,也便于维护和测试.模块化是一种非常好的代码组织方式,本文试着对Ja ...

  9. HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)

    HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...

随机推荐

  1. HDU 4386 Quadrilateral(四边形的海伦公式的应用)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115760#problem/G 题目大意是给出四条边,问能否组成一个四边形,如果 ...

  2. windows工程总结

    1.win32控制台console程序 运行在MS-DOS环境中的程序.控制台应用程序通常没有可视化的界面,只是通过字符串来显示或者监控程序.控制台程序常常被应用在测试.监控等用途,用户往往只关心数据 ...

  3. protected-broadcast 规范使用系统应用组件自定义广播

    1. protected-broadcast 规范使用系统应用组件自定义广播 参考:https://blog.csdn.net/TaylorPotter/article/details/7019424 ...

  4. Facebook币Libra学习-3.小试牛刀第一笔交易

    我们提供了一个命令行界面(CLI)客户端来与区块链进行交互. 假设 本文档中的所有命令均假定: 您运行的是Linux(基于Red Hat或Debian)或macOS系统. 您可以稳定地连接到互联网. ...

  5. 编程语言中的字面量在Objective-C中的举例

    关于计算机编程语言中的字面量的介绍可参考:http://baike.baidu.com/view/1208327.htm?fr=aladdin. 下面就介绍Objective-C中的各种常用字面量: ...

  6. C++ STL partial_sort_copy

    #include <iostream>#include <deque>#include <algorithm>#include <vector> usi ...

  7. CentOS7使用yum安装mysql5.7

    提前说一下,网速不好不要用yum安装,等得时间太长. 第一步.获取yum源 [root@youxi1 ~]# rpm -ivh https://repo.mysql.com/yum/mysql-5.7 ...

  8. 不能在jsp页面<c:choose>对标签中使用<!---->进行注释

    jsp页面<c:choose>标签中使用<!---->进行注释,访问出现异常,如下: 标签范围:

  9. linux下maven环境的搭建

    1.maven的下载 2.maven的安装和环境变量配置 系统环境linux centos7.2 x64 1.maven的下载 下载地址:https://mirrors.tuna.tsinghua.e ...

  10. Android开发环境搭建(eclipse版)

    1.下载安装JDK 网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html