在任何一个大型应用中模块化是很常见的,与一些更传统的编程语言不同的是,JavaScript (ECMA-262版本)还不支持原生的模块化。

Javascript社区做了很多努力,在现有的运行环境中,实现"模块"的效果。通行的JavaScript模块规范主要有两种:CommonJS、AMD、UMD、CMD等

CommonJS

CommonJS规范是服务器端Javascript模块规范。

Node.js的模块系统,就是参照CommonJS规范实现的。NPM也遵循了commonJS定义的包规范,从而形成了一套完整的生态系统。

CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}。require()用来引入外部模块;exports对象用于导出当前模块的方法或变量,唯一的导出口;module对象就代表模块本身。

CommonJS规范wiki.commonjs.org/wiki...function MathClass() {

}

MathClass.PI = 3.14;

MathClass.E = 2.72;

MathClass.prototype.add = function(a, b) { return a+b;

}; module.exports = MathClass;var MathClass = require('./mathCommonJS.js');

Page( {

onLoad: function() { console.log( "PI: " +MathClass.PI ); var mathClass = new MathClass(); console.log( "3 + 4: " +mathClass.add(3, 4) );

}

});

AMD

AMD是"Asynchronous Module Definition"的缩写,意思是"异步模块定义",是前端模块规范。

RequireJS就是实现了AMD规范的呢。

AMD规范定义了一个自由变量或者说是全局变量 define 的函数。define( id?, dependencies?, factory );id 为字符串类型,表示了模块标识,为可选参数。若不存在则模块标识应该默认定义为在加载器中被请求脚本的标识。如果存在,那么模块标识必须为顶层的或者一个绝对的标识。

dependencies ,是一个当前模块依赖的,已被模块定义的模块标识的数组字面量。

factory,是一个需要进行实例化的函数或者一个对象。

AMD规范 github.com/amdjs/amdj...define('mathAMD', [], function( i ) { function MathClass() {

}

MathClass.PI = 3.14;

MathClass.E = 2.72;

MathClass.prototype.add = function( a, b ) { return a + b;

}; return MathClass;

});define( [ "mathAMD" ], function( require, exports, MathClass ) {

Page( {

onLoad: function() { console.log( "PI: " + MathClass.PI ); var mathClass = new MathClass(); console.log( "3 + 4: " + mathClass.add( 3, 4 ) );

}

});

});

UMD

CommonJS module以服务器端为第一的原则发展,选择同步加载模块。它的模块是无需包装的,但它仅支持对象类型(objects)模块。AMD以浏览器为第一(browser-first)的原则发展,选择异步加载模块。它的模块支持对象、函数、构造器、字符串、JSON等各种类型的模块,因此在浏览器中它非常灵活。这迫使人们想出另一种更通用格式 UMD(Universal Module Definition),希望提供一个前后端跨平台的解决方案。(function (root, factory) { if (typeof define === 'function' && define.amd) {

define(['jquery'], factory);

} else if (typeof exports === 'object') { module.exports = factory(require('jquery'));

} else {

root.returnExports = factory(root.jQuery);

}

}(this, function ($) { function myFunc(){}; return myFunc;

}));

UMD的实现很简单,先判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。再判断是否支持Node.js模块格式(exports是否存在),存在则使用Node.js模块格式。前两个都不存在,则将模块公开到全局(window或global)。( function( global, factory ) { if( typeof define === 'function' && define.amd ) {

define( factory );

} else if( typeof exports === 'object' ) { module.exports = factory();

} else {

root.returnExports = factory();

}

} ( this, function() { function MathClass() {

}

MathClass.PI = 3.14;

MathClass.E = 2.72;

MathClass.prototype.add = function( a, b ) { return a + b;

}; return MathClass;

}) );var MathClass = require( './mathUMD.js' );

Page( {

onLoad: function() { console.log( "PI: " + MathClass.PI ); var mathClass = new MathClass(); console.log( "3 + 4: " + mathClass.add( 3, 4 ) );

}

});

CMD

CMD 即Common Module Definition通用模块定义,CMD规范是国内发展出来的,就像AMD有个requireJS,CMD有个浏览器的实现SeaJS,SeaJS要解 决的问题和requireJS一样,只不过在模块定义方式和模块加载(可以说运行、解析)时机上有所不同。

Sea.js 推崇一个模块一个文件,遵循统一的写法define(id?, deps?, factory)

因为CMD推崇一个文件一个模块,所以经常就用文件名作为模块id,CMD推崇依赖就近,所以一般不在define的参数中写依赖,在factory中写。

factory是一个函数,有三个参数,function(require, exports, module)require 是一个方法,接受 模块标识 作为唯一参数,用来获取其他模块提供的接口

exports 是一个对象,用来向外提供模块接口

module 是一个对象,上面存储了与当前模块相关联的一些属性和方法

CMD模块规范 https://github.com/cmdjs/spec...define( "pages/module/mathCMD.js", function( require, exports, module ) { function MathClass() {

}

MathClass.PI = 3.14;

MathClass.E = 2.72;

MathClass.prototype.add = function( a, b ) { return a + b;

}; module.exports = MathClass;

})define( "pages/module/mathCMD.js", function( require, exports, module ) { function MathClass() {

}

MathClass.PI = 3.14;

MathClass.E = 2.72;

MathClass.prototype.add = function( a, b ) { return a + b;

}; module.exports = MathClass;

})

微信小程序模块化机制

微信小程序秉承了JavaScript模块化的机制,通过module.exports暴露对象,通过require来获取对象。

模块开发

以微信小程序QuickStart为例,微信小程序模块采用CommonJS规范

utils/util.jsfunction formatTime(date) { var year = date.getFullYear() var month = date.getMonth() + 1 var day = date.getDate() var hour = date.getHours() var minute = date.getMinutes() var second = date.getSeconds(); return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')

} function formatNumber(n) {

n = n.toString() return n[1] ? n : '0' + n

} module.exports = {

formatTime: formatTime

}

pages/log/log.jsvar util = require('../../utils/util.js')

Page({

data: {

logs: []

},

onLoad: function () { this.setData({

logs: (wx.getStorageSync('logs') || []).map(function (log) { return util.formatTime(new Date(log))

})

})

}

})

模块运行

微信小程序还是要以前端程序方式在微信浏览器中运行,由于CommonJS规范是服务器端模块规范,微信小程序运行时会自动转换为前端模块规范。

以微信小程序QuickStart调试时代码为例

utils/util.jsdefine("utils/util.js", function(require, module) { var window = { Math: Math }/*兼容babel*/ , location, document, navigator, self, localStorage, history, Caches; function formatTime(date) { var year = date.getFullYear() var month = date.getMonth() + 1 var day = date.getDate() var hour = date.getHours() var minute = date.getMinutes() var second = date.getSeconds(); return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')

} function formatNumber(n) {

n = n.toString() return n[1] ? n : '0' + n

} module.exports = {

formatTime: formatTime

}

})

pages/log/log.jsdefine("pages/logs/logs.js", function(require, module) { var window = { Math: Math }/*兼容babel*/ , location, document, navigator, self, localStorage, history, Caches; var util = require('../../utils/util.js')

Page({

data: {

logs: []

},

onLoad: function() { this.setData({

logs: (wx.getStorageSync('logs') || []).map(function(log) { return util.formatTime(new Date(log))

})

})

}

})

}); require("pages/logs/logs.js")

微信小程序运行的代码与CMD模块规范基本符合。

使用第三方模块

微信小程序运行环境exports、module没有定义,无法通过require导入模块,需要对第三方模块强制导出后才能正常导入。

微信小程序使用Immutable.js segmentfault.com/a/11...

微信小程序使用Underscore.js segmentfault.com/a/11...

ECMAScript 6模块系统

ECMAScript 6,模块被作为重要组成部分加入其中。

ES6的模块提供了2个新的语法,分别是export和import。

export 模块导出export let a = 1; export class A {}; export let b = () => {};

import 模块导入import {a} from './a'; console.log(a); import * as obj from './a'; console.log(obj.a);

微信小程序还没实现ECMAScript 6。

【相关推荐】

php 微信开发实战pdf,微信开发实战之模块化的实例详解相关推荐

  1. java pdf 页眉_itext生成PDF设置页眉页脚的实例详解

    itext生成PDF设置页眉页脚的实例详解 实例代码: /** * ITextTest * iText生成PDF加入列表,注释等内容,同时设置页眉和页脚及页码等. */ package com.lab ...

  2. java导出pdf页码设置_itext生成PDF设置页眉页脚的实例详解

    itext生成pdf设置页眉页脚的实例详解 实例代码: /** * itexttest * itext生成pdf加入列表,注释等内容,同时设置页眉和页脚及页码等. */ package com.lab ...

  3. 微信小程序开发登录界面mysql_微信小程序 欢迎界面开发的实例详解

    微信小程序 欢迎界面 市面上大多数的app都会有一个欢迎界面,下面将演示如何通过微信小程序实现一个欢迎界面. 下面将会按照以下的顺序介绍: 布局的实现 逻辑的实现 样式的实现 1.布局的实现 整个布局 ...

  4. php微信小程序物流进度推送,微信小程序 消息推送php服务器验证实例详解

    微信小程序 消息推送php服务器验证实例详解 设置页面("设置">>"开发设置"): 1.设置服务器域名 注意http和https协议的不同. 2. ...

  5. imagepreview使用案例_微信小程序wx.previewImage预览图片实例详解

    一.小知识 二.例子 1.wxml 2.wxss .container { box-sizing:border-box; padding:20px; } .previewimg{ float:left ...

  6. python公众号留言功能详情_Python实现的微信公众号群发图片与文本消息功能实例详解...

    本文实例讲述了Python实现的微信公众号群发图片与文本消息功能.分享给大家供大家参考,具体如下: 在微信公众号开发中,使用api都要附加access_token内容.因此,首先需要获取access_ ...

  7. solidworks api二次开发实例详解_Solidworks开发语言对比及分析

    很多初学Solidworks二次开发的同学,也许都会纠结使用何种语言进行二次开发.对于Solidworks二次开发的语言,官方有VBA,VB.NET,C#以及C++,四种语言. 用户通常会有如下疑问, ...

  8. java servlet init方法_JSP开发Servlet重写init()方法实例详解

    jsp开发servlet重写init()方法实例详解 写一个servlet时,有时需要我们重写该servlet的初始化方法,然后,究竟是重写init(servletconfig config),还是重 ...

  9. 微信小程序php后台支付,微信小程序 支付功能实现PHP实例详解

    微信小程序 支付功能实现PHP实例详解 前端代码: wx.request({ url: 'https://www.yourhost.com/weixin/WeiActivity/payJoinfee' ...

最新文章

  1. IDEA报错总结:修改Java编译版本--maven项目
  2. 查找 framework 文件中是否包含 WKWebView
  3. 财务用计算机可以一次摊销,购入的电脑可以一次性计提折旧吗
  4. 【Paper】2018_多机器人领航-跟随型编队控制
  5. JVM:gc什么时候开始?System.gc()能保证gc一定发生吗?
  6. 列索引对SharePoint大列表性能的影响
  7. 原理图元件有波浪线_电气原理图和接线图识图方法,电气接线图怎么画?
  8. 《The Last Night》美术分析
  9. 大二暑假周进度总结07
  10. 二分搜索 HDOJ 2289 Cup
  11. html高度没有滚动条,Div扩展了页面高度,但没有滚动条
  12. 爱立信:5G将加速物联网发展
  13. PHP PSR4自动加载代码赏析
  14. 汇总3种获取水系数据的途径
  15. VSTO开发Powerpoint插件
  16. Linux:计算机网络基础
  17. USB Server应用于前置机案例分析
  18. 110kV变电站电气一次系统设计
  19. 照片的尺寸和内存大小调整
  20. 消除input标签的自动填充 白色背景,及更改字体颜色

热门文章

  1. The alias ‘TaskType‘ is already mapped to the value ‘com.xxx.entity.Tasktype‘.
  2. win7下搭载ubuntu双系统,独立引导
  3. Python问题:UnboundLocalError: local variable 'xxx' referenced before assignment
  4. 网上打印文件怎么发给商家?怎么给商家发送打印资料
  5. Ingress基本故障排除方法
  6. 什么是HotSpot虚拟机
  7. Metasploit6.0系列教程 -- 渗透Joomla网站
  8. java 1 9随机数_Java-随机数详解
  9. 皮肤样本微生物的检测介绍
  10. LT8711UXE1,Type-C/DP1.2 转 HDMI2.0,内置HDCP,支持4k 60Hz向下兼容