目的是在项目框架中安装外部组件时,组件的规范能够统一。
由于早期开发未整体文档,细节已记不太清,先把代码地址贴上来:https://github.com/tianmiyingzi/feather2-command-install
需要了解的知识点:AMD规范,CMD规范,Comonjs规范,UMD规范等。
以下是调研知识点笔记:
Javascript模块化编程
问:为什么要模块化?
答:提高代码重复利用率。
问:怎么样模块化?
答:模块化的经历过程:函数简单的放在一起→对象写法→立即执行函数写法→放大模式→宽放大模式(Loose augmentation)→输入全局变量
1."污染"了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系
2. 暴露所有模块成员,内部状态可以被外部改写
3. "宽放大模式"就是"立即执行函数"的参数可以是空对象
关键字:
"立即执行函数"(Immediately-InvokedFunction Expression,IIFE
CommonJS规范
CommonJS主要是服务器端模块的规范,Node.js采用了这个规范。
每一个模块都是一个单独的作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性。
概念(起源):
官方JavaScript标准定义的API是为了构建基于浏览器的应用程序。然而,并没有定于一个用于更广泛的应用程序的标准库。
CommonJS API定义很多普通应用程序(主要指非浏览器的应用)使用的API,从而填补了这个空白。它的终极目标是提供一个类似Python,Ruby和Java标准库。这样的话,开发者可以使用CommonJS API编写应用程序,然后这些应用可以运行在不同的JavaScript解释器和不同的主机环境中。
在兼容CommonJS的系统中,你可以实用JavaScript程序开发:
服务器端JavaScript应用程序
命令行工具
图形界面应用程序
混合应用程序(如,Titanium或Adobe AIR)
内容:
1.在一个模块中,存在一个自由的变量”require”,它是一个函数。
这个”require”函数接收一个模块标识符。
“require”返回外部模块所输出的API。
如果出现依赖闭环(dependency cycle),那么外部模块在被它的传递依赖(transitive dependencies)所require的时候可能并没有执行完成;在这种情况下,”require”返回的对象必须至少包含此外部模块在调用require函数(会进入当前模块执行环境)之前就已经准备完毕的输出。(译者:如果难理解,看下面的例子。)
如果请求的模块不能返回,那么”require”必须抛出一个错误。
2. 在一个模块中,会存在一个名为”exports”的自由变量,它是一个对象,模块可以在执行的时候把自身的API加入到其中。
3. 模块必须使用”exports”对象来做为输出的唯一表示。
AMD规范
框架是RequireJS
// filename: foo.js
define(['jquery', 'underscore'], function($, _) {
// methods
function a(){}; // private because it's not returned (seebelow)
function b(){}; // public because it's returned
function c(){}; // public because it's returned
// exposed public methods