如何在Javascript中检查脚本是否作为ES6模块运行(以便它可以“导出”)?

时间:2018-01-23 08:14:54

标签: javascript es6-modules

我想制作一个

的Javascript文件
  • export的内容(例如,一个类),如果它可以export(例如,它已加载<script type="module">
  • 以及其他方式,将其内容分配到全局变量中,例如windowglobal

例如,我们假设这样一个文件print.js

案例A

可以使用它:

<script type="module">
    import print_things from "./print.js";
    print_things("Javascript innovation");
</script>
<案例B

,或者

<script src="./print.js"></script>
<script>
    window.print("Hmmmmmmm.");
</script>

目前,使用export会使脚本在案例B Uncaught SyntaxError: Unexpected token export中抛出错误。因此,必须知道export是否在其运行的环境中可用,以便支持这两种用例。我该怎么做?

2 个答案:

答案 0 :(得分:1)

查看UMD(通用模块定义)。即,this example

(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'b'], function (exports, b) {
            factory((root.commonJsStrictGlobal = exports), b);
        });
    } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('b'));
    } else {
        // Browser globals
        factory((root.commonJsStrictGlobal = {}), root.b);
    }
}(typeof self !== 'undefined' ? self : this, function (exports, b) {
    // Use b in some fashion.

    // attach properties to the exports object to define
    // the exported module properties.
    exports.action = function () {};
}));

答案 1 :(得分:1)

理解1.2345E-46的浏览器应忽略具有type=module属性的脚本。这意味着您可以为支持模块的浏览器提供模块树,同时为其他浏览器提供支持。

nomodule