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 ...
随机推荐
- React的基本认识
1.1.1. 官网 1) 英文官网: https://reactjs.org/ 2) 中文官网: https://doc.react-china.org/ 1.1.2. 介绍描述 1) 用于构建用户 ...
- java 设计模式 之 装饰器模式
装饰器模式的作用 在不修改原先对象核心的功能的情况下,对功能进行增强. 增强对象的功能的途径 通过类继承的方式,对父对象进行增强操作,例如造车是父类,改装跑车,跑车加大灯,改装房车,房车加私人电影院. ...
- 在阿里云上挂在/data脚本
在阿里云上加好一块磁盘后,将他分区,挂在在/data,并且设置开机自动挂在/etc/fstab [root@ZHONG-LONG javascripts]# vim mount.sh #!/bin/b ...
- php中如何传递Session ID
一般通过在各个页面之间传递的唯一的 Session ID,并通过 Session ID 提取这个用户在服务器中保存的 Session 变量,来跟踪一个用户.常见的 Session ID 传送方法主要有 ...
- Python扫描器-爬虫基础
0x1.基础框架原理 1.1.爬虫基础 爬虫程序主要原理就是模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中 1.1.基础原理 1.发起HTTP请求 2 ...
- SpringBoot: 14.异常处理方式4(使用SimpleMappingExceptionResolver处理异常)(转)
修改异常处理方法3中的全局异常处理Controller即可 package bjsxt.exception; import org.springframework.context.annotation ...
- java 中 this 和 super 说明及在构造器中super()和this()相互调用执行顺序
this this 表示当前对象 使用上细分的话,this有 this. 和this()的使用情况 ,下面我们开始细撸 this . 使用场景一: 在成员方法中,this.变量名 指带当前对象的变量, ...
- 攻防世界WEB新手练习
0x01 view_source 0x02 get_post 这道题就是最基础的get和post请求的发送 flag:cyberpeace{b1e763710ff23f2acf16c2358d3132 ...
- 攻防世界CRYPTO新手练习
0x01 base64 直接base64 Decode 得到flag cyberpeace{Welcome_to_new_World!} 0x02 Caesar key为12 的恺撒密码,解密德fla ...
- numpy中np.random.seed()的详细用法
在进行机器学习和深度学习中,我们会经常用到np.random.seed(),利用随机数种子,使得每次生成的随机数相同. numpy.randn.randn(d0,d1,...,dn) randn函数根 ...