如何在vanilla JavaScript中导入/导出类

RBT*_*RBT 9 html javascript ecmascript-6

我正在使用普通的javascript并试图利用作为ECMA-6版本的一部分的类和模块导入/导出的概念.

这是我的代码:

rectangle.js 档案 -

export default class  Rectangle{
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}
Run Code Online (Sandbox Code Playgroud)

myHifiRectangle.js 档案 -

import Rectangle from 'rectangle.js';

class MyHiFiRectangle extends Rectangle {
  constructor(height, width) {
      super(height,width);
      this.foo= "bar";  
 }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试在一个简单的HTML网页中使用上述两个*.js文件,test.html如下所示:

<!DOCTYPE html>
<html lang = "en">
   <head>
      <meta charset = "UTF-8">
      <title>Javascipt by Rasik Bihari Tiwari</title>
       <script src="Scripts/rectangle.js"></script>
       <script src="Scripts/myHiFiRectangle.js"></script>
      <script type="text/javascript">
    
   var v = new MyHiFiRectangle(2,4);
   console.debug(v.foo);
      </script>
   </head>
   <body >

   </body>

</html>
Run Code Online (Sandbox Code Playgroud)

现在,当我test.html在各种浏览器中浏览文件时,在Google Chrome上我得到以下错误:

未捕获的SyntaxError:意外的令牌导出

在Mozilla Firefox上我得到以下错误:

SyntaxError:export声明只能出现在模块的顶层

SyntaxError:import声明只能出现在模块的顶层

ReferenceError:未定义MyHiFiRectangle [了解详情]

我尝试重新排序HTML文件的head标签中引用的*.js文件,但它们没有区别.

PS我没有使用像Babel这样的任何转发器.我只是想在javascript中看到'class'和模块导出/导入构造(ECMA-6发布)的原生支持以及它是如何工作的.

cur*_*ter 5

我经历了这个,我有一个解决方案,将第三个js文件作为模块。rectangular.js将是相同的,并且myHifiRectangle.js文件只有一个修改。

import Rectangle from './rectangle.js';

export default class MyHiFiRectangle extends Rectangle {
      constructor(height, width) {
      super(height,width);
      this.foo= "bar";  
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,我们需要第三个文件,它将是一个模块文件,比方说script.js

import MyHiFiRectangle from './myHifiRectangle.js'

var v = new MyHiFiRectangle(2,4);
console.log(v.foo);
Run Code Online (Sandbox Code Playgroud)

现在,应该将第三个文件script.js设为一个模块。更多关于模块的信息。我在modelJS文件夹下有所有三个文件。

<script type="module" src="/modelJS/script.js"></script>
Run Code Online (Sandbox Code Playgroud)

现在,当您运行时,您应该在控制台中看到“ bar”。


RBT*_*RBT 5

在从curiou.netter 在此线程中的答案中得到提示后,我还添加了一个答案。

我将在原始代码文件中以精确的顺​​序指出错误。顺便说一句,我能够在不涉及额外script.js文件的情况下解决该问题:

  1. 当引用JS模块时,脚本类型应该是模块。我指的是myHiFiRectancle.js就像使用src标签的常规 JS 文件一样:

    src="Scripts/myHiFiRectangle.js"
    
    Run Code Online (Sandbox Code Playgroud)

    我还导入了MyHiFiRectangle模块。以下是修复此错误后head标记在test.html文件中的外观:

    <head>
      <meta charset = "UTF-8">
      <title>Javascipt by Rasik Bihari Tiwari</title>
      <script type="module">
         import MyHiFiRectangle from './scripts/myHiFirectangle.js';
         var v = new MyHiFiRectangle(2,4);
         console.debug(v.foo);
      </script>
    </head>
    
    Run Code Online (Sandbox Code Playgroud)
  2. myHiFiRectangle.js文件中缺少导出默认语句。当每个类必须从不同的地方使用时,必须将其导出为模块。纠正后的myHiFiRectangle.js文件如下所示:

    import Rectangle from './rectangle.js';
    export default class MyHiFiRectangle extends Rectangle {
      constructor(height, width) {
      super(height,width);
      this.foo= "bar";  
     }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我的脚本文件在导入模块时出现了另一个错误。

    不正确的方法:

    import Rectangle from 'rectangle.js';
    import MyHiFiRectangle from '/scripts/myHiFirectangle.js';
    
    Run Code Online (Sandbox Code Playgroud)

    它会导致以下错误,这是不言自明的:

    未捕获的类型错误:无法解析模块说明符“rectangle.js”。相对引用必须以“/”、“./”或“../”开头。

    正确方法:

    import Rectangle from './rectangle.js';
    import MyHiFiRectangle from './scripts/myHiFirectangle.js';
    
    Run Code Online (Sandbox Code Playgroud)