# SMD同步模块
> 今天小感冒就不写那么多了,就先贴代码
>
* 模块文件
~~~
// 同步加载模块学习
// 定义模块管理单体对象
var F = F || {}
F.define = function (str, fn) {
/**
* @param parts 路径解析
* @param old 祖先
* @param parent 父
* @param this 当前
* @param i 模块层级
* @param len 模块层级长度
* @type {string[]}
*/
var parts = str.split('.'),
old = parent = this,
i = len = 0;
if(parts[0] === "F") {
parts = parts.slice(1)
}
if(parts[0] === 'define' || parts[0] === "module") {
return;
}
// 遍历路由模块并定义每层模块
for (len = parts.length; i<len; i++) {
// 如果父模块中不存在当前模块
if(typeof parent[parts[i]] === 'undefined') {
// 声明当前模块 在这里parent 依旧等于old,this
parent[parts[i]] = {}
}
// 缓存下一层级的祖父模块
old = parent
// 缓存下一层级父模块 parent 等于 str里定义的模块
parent = parent[parts[i]]
}
// 如果给定模块方法则定义该模块方法
if (fn) {
// 此时i等于parts.length,故减一
old[parts[--i]] = fn ()
}
old['test'] = 'kingEND'
console.log("old=", old[parts[i]])
console.log("this=", this)
console.log("parent=", parent)
console.log("parts=", parts)
// 返回模块管理器单体对象
return this
}
F.module = function () {
var args = [].slice.call(arguments),
// 获取回调执行函数
fn = args.pop(),
parts = args[0] && args[0] instanceof Array ? args[0] : args,
// 依赖模块列表 回调函数参数
modules = [],
// 模块路由
modIDs = "",
// 依赖模块索引
i = 0,
// 依赖模块的长度
ilen = parts.length,
// 父模块,模块路由层级索引,模块路由层级长度
parent,j,jlen;
while (i < ilen) {
// 如果是模块路由
if (typeof parts[i] === 'string') {
// 设置当前模块父对象
parent = this
// 解析模块路由,并屏蔽掉模块父对象
modIDs = parts[i].replace(/^F\./,'').split('.')
console.log('modIDs=', modIDs)
// 遍历模块路由层级
for (j = 0 ,jlen = modIDs.length; j< jlen; j++) {
// 重置父模块
parent = parent[modIDs[j]] || false
}
console.log(parent)
// 将模块添加到依赖模块列表中
modules.push(parent)
//如果模块是对象
} else {
modules.push(parts[i])
}
// 取下一个模块
i++
}
fn.apply(null, modules)
}
~~~
* 测试文件
~~~
F.define('string', function () {
return {
trim: function (str) {
return str.replace(/^\s+|\s+$/g)
}
}
})
var result = F.string.trim("测试用例")
console.log("result=", result)
F.define('dom', function () {
var $ = function (id) {
$.dom = document.getElementById(id)
return $
}
$.html = function(html) {
if (html) {
this.dom.innerHTML = html
return this
} else {
console.log("$=", this.dom.innerHTML)
return this.dom.innerHTML
}
}
return $
})
F.dom('test').html()
F.define('dom.addclass.removeclass')
F.dom.addclass = function (type, fn) {
return function (className) {
if(!~this.dom.className.indexOf(className)) {
this.dom.className += '' + className
}
console.log(this.dom.className.indexOf(className))
}
}();
F.dom.removeclass = function () {
return function (className) {
if(!~this.dom.className.indexOf(className)) {
console.log("removeclass")
}
}
}
F.module(['dom', document, F], function (dom, doc) {
dom('test').html('new add!')
doc.body.style.background = "blue"
})
~~~
### 总结
* 先说定义模块
- 前端
- pc端
- 京东无延时菜单效果
- datapicker组件的编写
- cursor禁止默认样式
- 移动端
- web在真机调试
- 有关vue的上拉加载
- 下拉刷新
- vue获取dom节点
- worker技术
- h5页面唤醒手机拨号,发短信功能
- 弹出层唤醒挤压css背景图片
- 23模式
- 基础模式
- SMD同步模块
- canvas
- 点的均匀分布
- 线条绘画
- canvas常见的全局属性
- 判断点在某个区间内
- 保证动画效果的流畅性
- arc函数学习
- cookies
- 本地服务搭建
- Mint UI框架的学习
- 第一天
- Swiper组件的解析
- loadmore组件
- 二维码的生成
- 前端优化
- 浏览器缓存
- indexdb本地数据库的使用
- 浅谈前端优化
- css渐变属性
- 前端常用组件学习
- picker组件
- vue
- 模块下的state访问
- vue的进阶
- npm包的发布
- 淘宝移动端适配问题
- vue的生命周期的理解
- vue的路由学习
- vue自带的动画效果
- vue 项目里,img标签报错,添加默认图片
- axios 实现loading加载提示
- qs库
- vue的v-for指令无法使用在tr、td中
- vue打包之后,npm run dev 空白
- vue 单页面百度统计
- unix时间转化
- UI组件的实现
- picker
- upload组件
- js动画效果
- canvas甜甜圈的编写
- 瀑布流实现
- 适配问题
- 图片加载
- js基础知识
- js数组合并
- 响应布局总结
- 组件开发
- grid组件
- 专题页面常用布局页面
- scroll滚动问题
- 项目整理经验收集
- 画图工具应用实现记录
- 参考线实现
- JCode
- 多条件筛选不用ajax的原因分析
- node
- koa路由下的分块
- 连接数据库mysql
- 初步搭建数据库模型
- java
- spring框架的学习
- maven 搭建web项目
- 建站
- 关联github
- 杂文
- 后端常用成熟系统
- node实战练习
- 编写邮箱通知
- 微信小程序
- 模板之坑
- 模板坑之数据传入
- 小程序组件化之一
- 有关this的绑定
- 小程序组件化之二
- 小程序分包加载
- tab切换,页面状态不更新
- 小程序请求组件(草稿)
- php学习之路
- 文件上传
- 有关数据库时间类型的插入
- Ubuntu下的php开启扩展模块
- windows系统下的hosts文件位置
- 腾讯云的cos
- thinkPHP
- 模块设计
- 模型的使用
- ajax的请求异常总结
- apache服务器
- 虚拟主机的建立
- ssh的使用
- ftp服务器配置
- Lamp的搭建
- ftp从零开始配置
- https的配置
- git hooks实现简单的自动部署
- ubuntu系统登录远程ubuntu服务器
- ubuntu
- 新建用户需要使用sudo
- sftp的文件上传问题
- 配置apache部分问题总结
- git服务器的搭建
- githook的学习
- ubuntu 虚拟主机搭建
- ubunut的服务器的防火墙的关闭
- 宝塔部署laravel
- 关于宝塔phpmyadmin无法访问的问题
- 解决码云每次提交输入密码的问题
- mysql
- phpmyadmin的安装
- 远程登陆数据库
- git的使用
- 拉去分支的代码
- git remote指令
- 学习临时笔记
- ios兼容性问题
- 苹果获取屏幕宽度问题
- toDataURL无法导出图片
- 苹果触屏滚动,下拉刷新问题
- jquery动画
- jquery的animate无法使用transform
- jquery队列queue
- css重学之路
- 规范一
- css3的matrix属性
- 淘宝适配方案
- Yii框架学习
- gd库的支持安装
- larval框架学习
- 中间件
- 指令
- 自定义指令生成token
- 微信登录后端篇
- 宝塔apache配置ssl
- SVN
- PS
- 快捷键
- Redis
- Redis在Unbtun下的配置
- 微信公众号开发
- 测试号配置