uRequire可以轻松地将使用runtimeInfo和selectivelly在运行时加载替换的相依(你可以随时选择有替代构建和replace deps with alternative/mocks在编译的时候,如果你不想写这样选择的代码)。
Runtime info适用于所有的模板,包括UMD和combined一样的,所以无论是如果执行上:与AMD装载机像requirejs或
的NodeJS
浏览器
浏览器与普通</script>
标签,
你可以选择每个模块的依赖性在每种情况下是指动态地,使用__isAMD
,__isNode
& __isWeb
运行时变量。
你需要的是:
- bower_components/
- eventemitter2/ ...
- lodash/ ...
- requirejs/ ...
- source/
- library/
- EventEmitter.js
- Observable.js:
其中Observable.js
是例如
define(["lodash", "EventEmitter"], function(_, EventEmitter) {
function Observable(options) { this.myOptions = options };
Observable.EventEmitter = EventEmitter;
Observable._ = _;
return Observable;
});
和EventEmitter.js
是:
define(function(){
var EventEmitter2;
if (__isNode) {
return require("events").EventEmitter;
} else {
if (__isAMD) {
return EventEmitter2 = require("eventemitter2");
} else if (__isWeb) {
return window.EventEmitter2;
}
}
});
**说明**:
具有以下
grunt-urequire配置(在CoffeeScript中)
然后:
module.exports = gruntFunction = (grunt) ->
grunt.initConfig gruntConfig =
urequire:
library:
path: "source/library"
dstPath: "build/UMD"
runtimeInfo: ['EventEmitter'] # dont need it in other files
template: 'UMDplain'
combined:
derive: 'library'
main: 'Observable'
dependencies: exports: root: {'Observable': 'Obs'}
dstPath: "build/almond/Observable.js"
template: 'combined'
grunt.loadNpmTasks "grunt-urequire"
你有两个版本:
A)library
:有独立的UMD文件,在那里你可以运行,例如从source\test\load_node.js
:
var Observable = require("../../build/UMD/Observable");
console.log(Observable.EventEmitter);
或来自浏览器(source/test/Loader_unoptimized_AMD.html
):
<!DOCTYPE html>
<html>
<head><title>test crossdev: RequireJs, UMD</title></head>
<body>Check console!</body>
<script src="../../bower_components/requirejs/require.js"></script>
<script>
require.config ({
baseUrl: '../../build/almond',
paths: {
lodash: "../../bower_components/lodash/dist/lodash.min",
eventemitter2: "../../bower_components/eventemitter2/lib/eventemitter2"
}
});
require(["Observable" ], function(Observable){
console.log(Observable);
console.log(Observable.EventEmitter);
});
</script>
</html>
和
B)combined
所有文件内联&具有上的NodeJS,网络/ AMD和Web /脚本作品自身的小型装载机(almond)。从source/test/Loader_almondJs_plainScript.html
运行:
<!DOCTYPE html>
<html>
<head><title>test crossdev: plain script, combined/almond</title></head>
<body>Check console!</body>
<script src="../../bower_components/lodash/dist/lodash.min.js"></script>
<script src="../../bower_components/eventemitter2/lib/eventemitter2.js"></script>
<script src="../../build/almond/Observable.js"></script>
<script>
console.log(window.Obs);
console.log(window.Obs.EventEmitter);
</script>
</html>
或使用RequireJs作为AMD装载机(source/test/Loader_almondJs_AMD.html
):
<!DOCTYPE html>
<html>
<head><title>test crossdev: RequireJs, combined/almond</title></head>
<body>Check console!</body>
<script src="../../bower_components/requirejs/require.js"></script>
<script>
require.config ({
baseUrl: '../../build/almond',
paths: {
lodash: "../../bower_components/lodash/dist/lodash.min",
eventemitter2: "../../bower_components/eventemitter2/lib/eventemitter2"
}
});
require(["Observable" ], function(Observable){
console.log(Observable);
console.log(Observable.EventEmitter);
});
</script>
</html>
您可以看到测试项目https://github.com/anodynos/nodejs-browser-cross-development
考虑使用Browserify。它具有与Node.js模块兼容的浏览器模块。 – Brad
这是一个很简短的答案...... :) 你如何处理不同的实现例如XMLHttpRequest在一方和“http”模块在另一方,例如? –
这些情况非常棘手,需要在代码中处理。虽然没有银弹。 Browserify可以让你在那里找到大部分路径(在某些模块中,所有的路都在那里)。 – Brad