【发布时间】:2020-01-01 19:09:00
【问题描述】:
我想我现在基本了解(至少在理论上)ES2015 模块是如何工作的。
我不明白(这远非微不足道)是如何启用模块脚本来通知我的主脚本。
通常,在我的 HTML 文档的底部,我有如下内容:
<script src="/global-script-is-a-classic-script.js"></script>
就是这样。没有defer,没有async,也没有type="module"。
我可能希望编写一些可选模块来声明函数、计算变量和对象,然后将所有声明和计算的值提供给global-scripts.js:
<script src="/module-script-1.mjs" type="module"></script>
<script src="/module-script-2.mjs" type="module"></script>
<script src="/module-script-3.mjs" type="module"></script>
当然,这些模块脚本中的每一个都将包含一个exports 语句。
但是...然后我如何将import 这些模块脚本计算到我的global-script.js 中?
我不能使用import - 因为它只适用于模块脚本 - 而且(除非我弄错了)使用global-scripts.js 似乎是个坏主意除了经典脚本。
那么,我现在需要两个全局脚本吗?
<script src="/global-script-is-a-classic-script.js"></script>
<script src="/module-mothership-is-a-module-script.js" type="module"></script>
或者是否有我们都应该使用的替代标准架构?
【问题讨论】:
-
如果你有一个脚本类型的模块,没有什么全局的,所有的代码都封装在模块中。
-
您似乎并没有真正理解模块架构带来的设计理念的变化。你不会让事情全球化。一个模块导入它需要的其他模块,并从导入中获取其功能,而不是从某些全局函数集。在模块化架构中,不会有全局脚本。这就是为什么您的想法不太适合模块化架构的原因。
-
exports是一种使导入模块的任何人都可以公开访问某些入口点或数据的方法,同时保持模块本地的所有其他内容。必须导入模块才能访问这些入口点。 -
@jfriend00 - 非常感谢。这可能是我需要的最后一块拼图。那么
exports仅适用于子模块(和兄弟模块),那么呢?独立的、自包含的顶级模块不需要exports,因为任何功能都发生在模块中——数据永远不需要去其他任何地方。 (是吗?) -
即使是顶级模块也可以有
exports。它们不会用于项目中作为顶级模块的任何内容,但它可能会在其他项目中使用,在该项目中它不是顶级模块并由其他模块导入。模块架构让您无需做大量额外工作即可考虑代码重用和代码共享。您编写项目的正常方式应该会自动创建一堆可重用的代码。
标签: javascript ecmascript-6 es6-modules