如何以与Node.js和浏览器JavaScript同时兼容的方式跨文件导入JavaScript函数

问题描述 投票:1回答:1

在基于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.jsfile2.js MWE?

javascript node.js
1个回答
0
投票

为了使脚本能够作为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。

© www.soinside.com 2019 - 2024. All rights reserved.