【问题标题】:How to import es6 module that has been defined in <script type="module"> tag inside html?如何导入已在 html 中的 <script type="module"> 标签中定义的 es6 模块?
【发布时间】:2018-06-07 12:14:13
【问题描述】:

我可以在我的 html 文件 me.html 中定义一个模块:

<script type="module" id="DEFAULT_MODULE">   
           import Atom from './atom.js';       
           console.log("definition of getAtom")
           export default function getAtom(){
            return new Atom('atom');
           }
           console.log("exported getAtom")
</script>

另见

=> 是否可以将该“匿名”模块导入同一个 html 文件中的另一个模块脚本?还是一些“隐藏代码”——也已由 me.html 文件加载的 JavaScript 文件?出口似乎有效;至少它不会抛出任何错误。

对于 getAtom 方法的导入我试过例如:

<script type="module">
    import getAtom from '.'; //this line does not work
    console.log("usage of getAtom")
    var atom = getAtom();             
</script>

我希望有一些类似的语法

 import getAtom;
 import getAtom from '.';
 import getAtom from window;
 import getAtom from './me.html';
 import getAtom from '.DEFAULT_MODULE';

但是,这些行都不起作用。

=>如果可能的话,引用“匿名”模块的正确语法是什么?

我使用 Chrome 版本 63.0.3239.108。

相关问题:

How to dynamically execute/eval JavaScript code that contains an ES6 module / requires some dependencies?

【问题讨论】:

  • 从 HTML 文件的代码隐藏导入?我不这么认为。这是丑陋的编码,我没有看到具有模块类型的脚本标签的任何用法。它只会让事情变得一团糟。
  • 请参阅相关问题以获取示例用法。如果你知道的话,我愿意接受不那么丑陋的替代品。

标签: javascript html es6-modules


【解决方案1】:

据我了解,无法导入“匿名”模块,因为“匿名”模块没有模块说明符或单独的 url(其import.meta.url 只是当前规范的 html url)。理论上它可以在未来扩展,但我找不到这种功能的好的用例。

【讨论】:

  • 在运行时添加&lt;script type="module"&gt;标签允许动态包含ES6模块。但是,他们的exports 无法访问。这使得很难应用动态包含的代码(结果)。另一种解决方案可能是未来的eval 方法,它支持import 语句。请参阅上面提到的相关问题,让我知道目前是否有更好的动态代码执行替代方案。
  • 用例将用于在浏览器中动态生成的代码。我正在开发一种 IDE/语言,它有自己的 AST,可以使用 @babel/generator 编译为 JavaScript,但在弄清楚如何将此代码的结果与应用程序的其余部分合并时遇到了麻烦。
  • 您可以尝试数据 url 或 createObjectURL 并将结果 url 分配给 src 属性。
猜你喜欢
  • 1970-01-01
  • 2018-07-18
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
  • 2015-10-20
  • 2014-02-06
相关资源
最近更新 更多