javascript 构建模块化开发
在使用 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 构建模块化开发的更多相关文章
- JS模块化开发:使用SeaJs高效构建页面
一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...
- JavaScript学习总结(六)——前端模块化开发
早期的javascript版本没有块级作用域.没有类.没有包.也没有模块,这样会带来一些问题,如复用.依赖.冲突.代码组织混乱等,随着前端的膨胀,模块化显得非常迫切. 前端模块化规范如下: 一.前端模 ...
- 详解JavaScript模块化开发
什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了,jQuery,Ajax,Node.Js,MVC,MVVM等 ...
- (转)详解JavaScript模块化开发
https://segmentfault.com/a/1190000000733959 什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来j ...
- 轻轻谈一下seaJs——模块化开发的利器
"仅做一件事,做好一件事." 这个应该就是seaJs的精髓了. 我在自己的一些项目中使用过seaJs.对其算是了解一二.如今就班门弄斧.轻轻地谈一下. 首先上一段度娘的话: &qu ...
- seajs的模块化开发--实践笔记
2017-04-02 SeaJS是一个遵循CMD规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制.有效的解决复杂项目中命名冲突.依赖.性能等问题. SeaJS ...
- 深度扫盲JavaScript的模块化(AMD , CMD , CommonJs 和 ES6)
原文地址 https://blog.csdn.net/haochangdi123/article/details/80408874 一.commonJS 1.内存情况 对于基本数据类型,属于复制.即会 ...
- Javascript模块化开发,使用模块化脚本加载工具RequireJS,提高你代码的速度和质量。
随着前端JavaScript代码越来越重,如何组织JavaScript代码变得非常重要,好的组织方式,可以让别人和自己很好的理解代码,也便于维护和测试.模块化是一种非常好的代码组织方式,本文试着对Ja ...
- HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)
HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...
随机推荐
- Jenkins 自动化部署上线
转载于互联网 jenkins自动化部署项目,通过jenkins 部署来节省运维时间,不需要手动cp上线及版本发布 Jenkins 自动化部署上线 Jenkins Jenkins 自动化部署上线一.Je ...
- exactly the kind of division of tasks that Gulp.js is built on
The results are then passed to a reporter function that displays the results of the code analysis in ...
- Swiper轮播插件使用
前文 Swiper是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端,能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果. 归根到此,Swi ...
- javascript两个数组内容合并
需求: ,,]; ,,]; 最终结果: [,,,,,] 代码: Array.prototype.addAll= function(arr) { this.push.apply(this, arr); ...
- Oracle查询序列和函数方法封装
工具方法: @Autowired private JdbcTemplate businessTpmeJdbcTemplate; @SuppressWarnings("deprecation& ...
- python GC、分支、循环
内存管理 1.变量无须事先声明,也不需要指定类型 2.python编程中一般无须关心变量的存亡,一般也不用关心内存的管理 3.python使用引用计数记录所有对象的引用计数 当对象引用数变为0,他就可 ...
- 【leetcode】504. Base 7
problem 504. Base 7 solution: class Solution { public: string convertToBase7(int num) { ) "; st ...
- 【leetcode】500_Keyboard Row
problem 500. Keyboard Row 题意:判断给出的某个单词是否可以使用键盘上的某一行字母type得到: 注意大小写的转换: solution1: 使用set保存三行字符,查看每个字符 ...
- iOS- 推送消息
1 ios 如何判断是点击推送信息进入还是点击app图标进入程序? 设备接到apns发来的通知,应用处理通知有以下几种情况: 1. 应用还没有加载 这时如果点击通知的显示按钮,会调用didFinish ...
- opengl鼠标键盘控制相机漫游
键盘wsad控制相机位移,鼠标左键按下控制相机旋转 效果如下 代码如下 #include <stdio.h> #include <string.h> #include < ...