如何改造现有文件为 CMD 模块

经过一段考察,我们终于要在项目中引入模块机制和 Sea.js 了,那么如何将现有的文件改造成 CMD 模块就成了重要的问题。下面针对一些典型场景来说明包装的方式。

首先还是请大家详细了解下 CMD 模块定义规范,只要洞悉事物的定义和本质,一切问题可迎刃而解。

改造主流模块

这里指的是 jQuery、Moment、Backbone、underscore 等业界主流模块,这些模块一般都有对 AMD 和 CommonJS 的支持代码,例如 jQuery 源文件的最后几行:

if ( typeof module === "object" && module && typeof module.exports === "object" ) {
    module.exports = jQuery;
} else {
    window.jQuery = window.$ = jQuery;

    if ( typeof define === "function" && define.amd ) {
        define( "jquery", [], function () { return jQuery; } );
    }
}

还有 Backbone 里:

var Backbone;
if (typeof exports !== ‘undefined‘) {
  Backbone = exports;
} else {
  Backbone = root.Backbone = {};
}

对于有这些兼容代码的,只需要去掉 define.amd 的支持,或是直接包装上 define 就可以了。

define(function(require, exports, module) {
  // code here ...
});

如果没有模块化的兼容代码,有时候需要手动引入依赖,以及暴露对应的接口。

define(function(require, exports, module) {
  var $ = require(‘$‘);
  // code here ...
  module.exports = Placeholders;
});

可以参考 cmdjs/gallery 里的 Gruntfile 对这些主流模块的代码替换方式。

现有的 JS 文件

对于一些现有的普通 JS 文件,相对简单的多,参考 CMD 的书写规范,把那些暴露到全局命名空间的接口用 CMD 的方式进行改造就可以了。

比如现有文件 util.js 。

window.util = window.util || {};
util.addClass = function() {
  window.css();
};
util.queryString = function() {};

改为:

define(function(require, exports, module) {
  // 引入依赖
  var css = require(‘css‘);

  util.addClass = function() {
    css();
  };
  util.queryString = function() {};

  // 暴露对应接口
  module.exports = util;
});

这里不啰嗦,就是基本的 CMD 书写规范。实际的改造过程中,情况可以比上面的例子要复杂一些,具体情况具体解决就行。

改造 jQuery 插件

这也是一个经常遇到的问题,我们推荐以下的包装方式:

// jquery-plugin-abc
define(function(require, exports, module) {
  var $ = require(‘$‘);
  // 插件的代码
  $.fn.abc = function() {};
});

这样的改造方式实际上是强化了原有的 $ 对象(而不是重新包装出一个新的 $),在实际调用时,可以用下面的方式:

seajs.use([‘$‘, ‘jquery-plugin-abc‘], function($) {
  // $ 有了 jquery-plugin-abc 所提供的插件功能
  $.abc();
});

更多 jQuery 插件的包装,可以参考 cmdjs/jquery 里的做法。

工具

除了手动的方式修改代码外,我们推荐使用 Grunt 来进行统一的改造,官方也通过 Grunt 改造了很多主流模块和 jQuery 插件,具体的操作手册见 引入 CMD 模块指南 。你可以在 cmdjs/gallery 和 cmdjs/jquery 中找到具体的 Gruntfile ,从而借鉴到您的项目中去。所有打包好的模块可以在 spmjs.org 中找到。

小结

上面提供的是原有代码包装为 CMD 书写规范 的方法,在具体上线前,可能还需要打包为具名模块(包含 ID 的模块)。关于构建方面的进一步知识可以参考 构建工具 。

这里提到的包装方式都比较典型和简单,具体的实践可能千差万别。您在项目中有什么探索、实践和问题,欢迎来这里分享和提问。

内容来源: https://github.com/seajs/seajs/issues/971

时间: 2024-10-26 03:41:44

如何改造现有文件为 CMD 模块的相关文章

CMD 模块定义规范

在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规则. 在 CMD 规范中,一个模块就是一个文件.代码的书写格式如下: define(factory); define Function define 是一个全局函数,用来定义模块. define define(factory) define 接受 factory 参数,factory 可以是一个函数,也可以是一个对象或字

CMD模块定义规范

CMD(Common Module Definition) 通用模块定义.在 CMD 规范中,一个模块就是一个文件. 代码的书写格式如下: define(factory); define 接受 factory 参数,factory 可以是一个函数,也可以是一个对象或字符串. factory 为对象.字符串时,表示模块的接口就是该对象.字符串. factory 为函数时,表示是模块的构造方法.执行该构造方法,可以得到模块向外提供的接口.factory 方法在执行时,默认会传入三个参数:requir

JS - CommonJS、ES2015、AMD、CMD模块规范对比与介绍(附样例)

一.CommonJS 1,CommonJS 基本介绍 (1)CommonJS 是一种思想,它是为 JS 的表现来制定规范.由于 JS 没有模块系统.标准库较少.缺乏包管理工具,因此 CommonJS 应运而生. (2)CommonJS 的目标是希望 JS 可以在任何地方运行,不只是浏览器中.只要我们的 JavaScript 是根据 CommonJS API 编写的,那么就可以在与 CommonJS 兼容的系统上运行. (3)根据 CommonJS API 编写的 JavaScript 可以做下面

Python使用cmd模块构造命令行界面

最近做测试工具,实在懒得搞GUI,然后意识到python自带一个模块叫cmd,用了用发现简直是救星.默认cmd模块中的Cmd类会使用rawinput来处理提示符显示和输入信息获取的工作,但是特定情况下会有个问题: 当交互线程等待用户输入指令的时候,如果希望另外一些后台线程可以打印信息到前台显示的话…… 打印当然是打印出来了,但只要开始输入新的指令,这些打印信息就都被清除掉了,只剩下提示符和新的输入.如果想实时看什么东西的话…… 反复尝试和阅读cmd模块源码以后发现,Cmd类在实例化的时候,默认会

vim编程 插入 保存不退出 保存退出 退出不保存 另存为其他文件名 保存覆盖现有文件

---恢复内容开始--- 在xshell里写代码,如果需要编辑代码,可以输入  vim+ xxx.py  ,进入vim编辑界面 这里的xxx.py表示  python的存储文件,后缀名是.py. 1.插入字符 输入 i 可键入或者shift + i 2.保存,但不退出 vim :w 3.保存并退出 vim :wq 4.退出 vim,但不保存更改 :q! 5.用其他文件名保存 :w filename 6.在现有文件中保存并覆盖原文件 :w! filename 7.vim中的视图模式,把要注释的内容

Javascript中使用WScript.Shell对象执行.bat文件和cmd命令

Javascript中使用WScript.Shell对象执行.bat文件和cmd命令 http://www.cnblogs.com/ZHF/p/3328439.html WScript.Shell(Windows Script Host Runtime Library)是一个对象,对应的文件是C:/WINDOWS/system32/wshom.ocx,Wscript.shell是服务器系统会用到的一种组件.shell 就是“壳”的意思,这个对象可以执行操作系统外壳常用的操作,比如运行程序.读写注

python cmd模块练习

1 # encoding=utf-8 2 import cmd 3 import sys 4 5 6 # cmd模块练习 7 8 class Client(cmd.Cmd): 9 10 ''' 11 1)cmdloop():类似与Tkinter的mainloop,运行Cmd解析器: 12 2)onecmd(str):读取输入,并进行处理,通常不需要重载该函数,而是使用更加具体的do_command来执行特定的命名: 13 3)emptyline():当输入空行时调用该方法: 14 4)defau

因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间

导致你的问题的,应该有2种可能性: 1.存放你的primary文件组的磁盘,已经满了: use master--你的数据库名称 go --看看你的primary组里的文件 select ds.name, df.physical_name, --主文件组的物理文件的路径 --打开我的电脑,查看文件所在盘,是否磁盘已满 df.is_percent_growth, --是否自动增长 df.growth --增长多少 from sys.data_spaces ds inner join sys.data

无法为数据库 XXX 中的对象XXX 分配空间,因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间。

无法为数据库 XXX 中的对象XXX 分配空间,因为 'PRIMARY' 文件组已满.请删除不需要的文件.删除文件组中的对象.将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间. 原因是装了mssql express 2005 版本,该版本最大的限制是4G 百度说明: 1.数据库的大小限制:SQL Server 2005 Express 和SQL Server 2008 Express 数据库的大小限制最大为 4GB,最新版本的SQL Server 2008 R2 E