前后端都有模块化机制, 但两个不兼容, 这件事情非常纠结, 耽误大量时间. SeaJS 和 RequireJS 采用的模块化方案, 答题上兼容了 CommonJS, 但是细节上, 有个 Wrapper, 比如模块在 Node 里这样写的
a = require "b"
exports.c = ->
c
var a;
a = require("b");
exports.c = function() {
return c;
};
需要写成
define (require, exports) ->
a = require "b"
exports.c = ->
c
define(function(require, exports) {
var a;
a = require("b");
return exports.c = function() {
return c;
};
});
define
是在代码加载完成以后异步调用的函数主体的…
想来想去没有明确的方案, 现在有个想法
main = (dep1, exports) ->
exports.api = ->
"demo"
if define?
define (require, exports) ->
dep1 = require "./dep1"
main dep1, exports
else if exports?
dep1 = require "./dep1"
main dep1, exports
(function() {
var dep1, main;
main = function(dep1, exports) {
return exports.api = function() {
return "demo";
};
};
if (typeof define !== "undefined" && define !== null) {
return define(function(require, exports) {
var dep1;
dep1 = require("./dep1");
return main(dep1, exports);
});
} else if (typeof exports !== "undefined" && exports !== null) {
dep1 = require("./dep1");
return main(dep1, exports);
}
})();
模块的定义和加载, 似乎是可以解决的, RequireJS 打包方面不知道会不会有问题… 给点建议?
9 回复
根据 define
, exports
等是否可用来判断执行环境没啥问题。
比如在 ant.js中,我大概是这么写的:
(function(Ant) {
var root = this;
if(typeof module === 'object' && module){
var doc = root.document || require('jsdom').jsdom();
module.exports = Ant(doc);//NodeJs
}else{
Ant = Ant(root.document);
if(typeof define === 'function'){
define(function(require, exports, module) {
return Ant;
});
}
root.Ant = Ant;
}
})(function(doc) {
//Your code here
})
兼容 nodeJs,amd,cmd。
@jiyinyiyong
各个模块规范的 require
, exports
, module
的用法基本一致。 AMD 和 CMD 的 define
也可以使用同一种 factory
函数, 所以不会有问题。