2020 JavaScript 模块介绍和使用

发布于 2023-04-29 23:05:09 字数 4243 浏览 60 评论 0

在这篇文章中,我们将介绍标准的 JavaScript 模块,目前是如何在前端应用程序中使用的,以及未来我们可能会如何使用它们。JavaScript 模块有时被称为 ESM,它代表 ECMAScript 模块。

什么是 JavaScript 模块?

JavaScript 模块 是构造 JavaScript 代码的一种方法。模块中的代码与其他模块中的代码是隔离的,并且不在全局范围内。

<script>
  function hello() {
    console.log("hello Bob");
  }
</script>
<script>
  function hello() {
    console.log("hello Fred");
  }
</script>
<script>
  hello(); // outputs hello Fred
</script>

上面的代码定义了两个函数,没有使用模块,在全局作用域会产生冲突。JavaScript 模块解决的另一个问题是不必担心 HTML 页面上脚本元素的顺序:

<script>
  hello(); // - Uncaught ReferenceError: hello is not defined
</script>
<script>
  function hello() {
    console.log("hello");
  }
</script>

在上面的示例中,定义 hello 函数的脚本元素需要放在调用 hello 函数的脚本元素之前。 如果有很多这样的 Javascript 文件,就很难管理了。

现在 JavaScript 模块通常是如何使用的?

JavaScript 模块语法是在 ES6 中引入的,通常在我们今天构建的应用程序中使用,如下所示:

import React from 'react';
...
export const HomePage = () => ...

上面的示例导入 React 模块并导出 HomePage 组件。不过,这段代码并没有使用 JavaScript 模块。取而代之的是,Webpack 将其转换为非原生模块,而采用了 IIFE(立即调用函数表达式)来做 。值得注意的是,Webpack 确实有一个实验性的 outputModule 特性,允许它以原生模块格式发布。希望 Webpack 5 中包含这个功能!

使用原生的 JavaScript 模块

要声明一个引用 JavaScript 模块代码的脚本元素,需要将类型属性设置为module:

<script type="module">
  import { hello } from "/src/a.js";
  hello();
</script>

这是 src 文件夹中 a.js 中的 JavaScript

// /src/a.js
import { hellob } from "/src/b.js";
import { helloc } from "/src/c.js";

export function hello() {
  hellob();
  helloc();
}

因此,在 a.js 中的 hello 函数,调用了在 b.js 中调用 hellob,在 c.js 中调用 helloc。这是来自 b.jsc.jsJavaScript

// /src/b.js
export function hellob() {
  console.log("hello b");
}
// /src/c.js
export function helloc() {
  console.log("hello c");
}

请注意,我们需要提供要导入的文件的完整相对路径,并且还需要包含文件扩展名。我们可能更习惯于一个简单的导入说明符,如下所示:

import { hello } from "a";

稍后我们将再次介绍原生的导入说明符。还请注意,我们不必在 **HTML **文件中声明所有模块。浏览器在运行时会去解析它们。需要注意的是,不能从普通脚本元素使用 JavaScript 模块。例如,如果我们尝试不使用 type 属性,脚本元素将不会被执行:

<script>
  // - 不能在模块外部使用import语句
  import { hello } from "/src/a.js";
  hello();
</script>

JavaScript 模块编写的代码在默认情况下以 严格模式 执行。所以没有必要在代码顶部使用 use strict:

<script type="module">
  let name = "Fred";
  let name = "Bob"; // - Identifier 'name' has already been declared
</script>

JavaScript 模块错误

让我们以前面的类似示例为例,其中有 JavaScript 模块 a,b,c。模块 a 依赖于模块 b 和 c。模块 bc没有依赖关系。假设 c.js 中包含运行时错误:

export function helloc() {
  consol.log("hello c"); // - Uncaught ReferenceError: consol is not defined
}

HTML 文件调用代码的方法如下:

<script type="module">
  import { hello } from "/src/a.js";
  hello();
</script>

a.js文件中:

import { hellob } from "/src/b.js";
import { helloc } from "/src/c.js";

export function hello() {
  hellob();
  helloc(); // 
              

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

情绪少女

暂无简介

文章
评论
29 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文