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 ...
随机推荐
- 响应式css样式
<div class="a"> 123 </div> @media(orientation:portrait) and (max-width:600px){ ...
- FYI是什么意思?
FYI是For Your Information的缩写,英语解释为:提供给您的信息,供您参考,是当前在外企中流行的英文缩写,为工作用语,常用于工作的电子邮件中. 文章来源:刘俊涛的博客 欢迎关 ...
- [go]template使用
//index.html {{if gt .Age 18}} <p>hello, old man, {{.Name}}</p> {{else}} <p>hello, ...
- SQL-W3School-高级:SQL JOIN
ylbtech-SQL-W3School-高级:SQL JOIN 1.返回顶部 1. SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完 ...
- Web Service 实例基于Socket创建Web服务
ServerSocket服务器端代码如下: public static void main(String[] args) throws IOException { // 1:建立服务器端的tcp so ...
- Python - social-auth-app-django 模块 - 商城项目 第三方方式登录 - 微博
开发准备 开通微博开发者权限 点击这里 进入 微博开放平台 开通后权限后创建应用 创建网页应用, 此处不需要进行审核即可使用测试环境 开发环境信息 此处一些信息是很重要的东西, 比如 App_key ...
- 知识点整理-mysql怎么查看优化器优化后的sql
背景 1.新建两张表 CREATE TABLE t1 (m1 )); CREATE TABLE t2 (m2 )); 2.插入些数据 INSERT INTO t1 VALUES(, , , 'c'); ...
- 用JavaScript来实现单例模式
首先,了解一下什么是单例模式,这里我直接把菜鸟教程中的定义给copy过来: 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...
- Linux上安装Julia-1.1
Julia 在Linux上的安装 浙江大学Julia镜像: 浙江大学Julia镜像 下载1.1版本: wget https://mirrors.zju.edu.cn/julia/releases/v1 ...
- 读rfc HTTP 协议
这是IETF ( 国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF))制定的协议之一. 互联网工程任务组,成立于1985年底,是全球互联网最 ...