在基于vanilla浏览器的JavaScript中,我可以这样做:
<html>
<head>
</head>
<body>
<script type="text/javascript" src="file1.js"></script>
<script type="text/javascript" src="file2.js"></script>
</body>
</html>
然后:
// file1.js
function abc(foo) {
console.log("abc received:", foo);
}
和:
// file2.js
abc(36);
...事情表现得像预期的那样。 (即,“abc收到36”将打印到控制台。)
如何在node.js中的file1.js
中包含file2.js
中的函数,以便保留上面的功能,同时保持网页的原样?具体来说,我想保持上面显示的html,同时能够运行
node file2.js
在命令行,并在终端获得abc received 36
。
我发现this问题具有非常相似的动机,看似更高级的用户。但是这个问题的答案中的主要联系已经死了,我不明白所陈述的答案是如何运作的,或者它应该做什么。也许有人可以为我提供量身定制的file1.js
,file2.js
MWE?
为了使脚本能够作为Node.js模块和浏览器vanilla(非模块化)脚本运行,它们应该被定义为UMD modules。
UMD基本上是一个样板工厂功能,可检测模块化环境,并在需要时回退到全局变量。
例如。对于CommonJS和全局(没有AMD),定义将是:
file1.js
(function (root, factory) {
if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
// Node
module.exports = factory();
// Global
} else {
root.file1 = factory();
}
}(this, function () {
// module body
function abc(foo) {
console.log("abc received:", foo);
}
return { abc: abc };
}));
file2.js
(function (root, factory) {
if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
// Node
module.exports = factory(require('./file1'));
// Global
} else {
root.file2 = factory(root.file1);
}
}(this, function (file1) {
// module body
file1.abc(36);
}));
省略此样板是捆绑工具应该解决的任务,特别是专门用于将CommonJS模块捆绑到浏览器脚本的Browserify。