【问题标题】:Why can't I import a JavaScript module in an html file?为什么我不能在 html 文件中导入 JavaScript 模块?
【发布时间】:2021-05-07 14:42:33
【问题描述】:

我已经完全模块化了两个类 Person 和 Teacher ,如下所示。但是当我试图调用 Teacher 类并在 Index.html 中使用它的方法时,它会在 Chrome 浏览器的控制台窗口中生成一个错误:“Uncaught SyntaxError: Cannot use import statement outside a module”强>。我正在使用 Visual Studio Professional 2017 并使用 Chrome 浏览器打开 Index.html。我没有使用节点。即使使用 Firefox 打开 Index.html,它也会显示相同的错误,但描述略有不同:“SyntaxError: import declarations may only appear at top level of a module”。我的代码如下。

Person.js

export class Person {
    constructor(name) {
        this.name = name;
    }

    printName() {
        console.log(`My name is ${this.name}.`);
    }
}

Teacher.js

import { Person } from "./Person";

export class Teacher extends Person {
    constructor(name, degree) {
        super(name);
        this.degree = degree;
    }

    printQualification() {
        console.log(`My qualification is ${this.degree}.`);
    }
}

索引.js

import { Teacher } from "./Teacher";
const teacher = new Teacher('MyName', 'MyQualification');
teacher.printName();
teacher.printQualification();

最后是 Index.html

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>Object-oriented Programming</title>
</head>
<body>
    <h1>Object-oriented Programming</h1>
    <script src="Index.js"></script>
</body>
</html>

作为替代方案,我尝试使用以下行将 Index.js 明确定义为 Index.html 中的模块:

<script type="module" src="Index.js"></script>

但它会产生更大的错误,显示以下两条错误消息:

“CORS 策略已阻止从源“null”访问“file:///D:/Pendings/Object-oriented%20Programming_Mosh-Hamedani/Index.js”处的脚本:跨源请求是仅支持协议方案:http、data、chrome、chrome-extension、chrome-untrusted、https。"

“加载资源失败:net::ERR_FAILED”

为什么会这样?我偶然发现它是如此糟糕。仅仅因为这个单一的因素,我无法推进这个项目。那么我该如何解决呢?我是 JavaScript 新手,不知道方向。请帮忙。

【问题讨论】:

  • 通过浏览器本身导入/导出javascript文件有点复杂。您可以在此处查看答案,并提供详细的分步说明:stackoverflow.com/a/62533794/10907180
  • 您需要一台服务器。您不能从简单文件中执行此操作,因为文件没有有效的域名。像 React 这样的框架为你提供了一个运行在 3000 端口上的服务器用于开发。您可以使用类似的东西或在您的机器上安装服务器(例如 Apache 或 Nginx)
  • slebetman:感谢您的回复。我开始了解如何通过 Web 服务器运行文件,为此,我安装了 Node 并运行 live-server。但还有其他问题浮出水面。请参考下面的答案下面的cmets。我们的讨论向前推进了一点。您能否对下面提到的问题问题 1)、2) 和 3) 有所了解?

标签: javascript class visual-studio-2017 javascript-objects


【解决方案1】:

由于这个问题在某种程度上已经在另一个问题link 中得到了回答,所以我将总结并更改一些内容。

  1. 安装 Node.js link
  2. 运行npm install -g live-server
  3. 更改 ff。在您的代码中:
  • 更改Teacher.js 中的导入行以包含文件类型。 import { Person } from "./Person.js";
  • 更改Index.js 中的导入行以包含文件类型。 import { Teacher } from "./Teacher.js";
  1. 运行live-server --port=1234 --entry-file=Index.html(确保在与文件相同的文件夹中运行它。

注意事项:

  • 我们将导入更改为包含文件类型,因为到目前为止,在没有一些工具的帮助下,不支持导入内容的歧义。 (更多详情here
  • 我们使用 HTTP 服务器来修复 CORS 策略问题,因为浏览器由于权限问题而无法在本地导入内容。

【讨论】:

  • MikoYats:感谢分享您的分步说明链接。它帮助我获得了基本的了解。这就是我所做的:1)在 Teacher.js- import { Person } from "./Person.js"; 2) 在 Index.js- import { Teacher } from "./Teacher.js";但是,不能将 Index.js 重命名为 Index.mjs,因为这样做会危及 JavaScript 文件并将其视为简单文本文件,并且其中的代码不会被视为代码而是简单文本。 3) 在 Index.html- 4) 在命令提示符- live-server --port=1234 --entry-file=Index.html
  • 现在一切正常。但是,我有几个问题。 1)在命令提示符下尝试使用“live-server Index.html”打开 Index.html 时,虽然页面正在打开,但控制台中显示错误消息:'加载模块脚本失败:服务器以非响应-JavaScript MIME 类型的“text/html”。根据 HTML 规范对模块脚本强制执行严格的 MIME 类型检查。为什么会这样?为什么我不能使用默认端口 8080?
  • 2) 为什么我不能按照您的建议将 Index.js 重命名为 Index.mjs?这样做时,为什么 Visual Studio 不能将其识别为 JavaScript 模块文件并弄乱所有内部代码? 3) 通过命令提示符启动实时服务器会话后,如何在不关闭命令提示符窗口的情况下终止它?看来,一旦实时服务器启动,您就无法在命令提示符下输入任何命令。那么我该怎么做呢?请澄清我的问题。
  • 1.) 您收到此错误是因为未将 Index.js 重命名为 Index.mjs。如果要导入其他 javascript 文件,则使用“.mjs”。不使用此扩展程序会导致此错误。
  • 2.) 您使用的是什么 Visual Studio?如果是 Visual Studio Code,我认为它支持开箱即用。或者尝试安装支持该文件的扩展。如果是 THE Visual Studio,这里有一个问题的链接:developercommunity.visualstudio.com/content/problem/1277175/…
猜你喜欢
  • 2023-04-08
  • 2018-05-19
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2020-09-03
  • 2021-10-20
  • 1970-01-01
相关资源
最近更新 更多