【问题标题】:Javascript import/export dependenciesJavascript 导入/导出依赖项
【发布时间】:2021-03-21 19:34:01
【问题描述】:

这是问题的简化代码。

库.js

export var a = ...
export var b = ...
export var c = ... result of call to leaflet API

main1.js

<script src='leaflet.js'></script>
<script type="module"></script>
import {a,b,c} from "../library.js"
.. use a,b,c successfully
...
</script>

main2.js

<script type="module">
import {a,b} from "../library.js"
... loading fails because L (from leaflet.js) not defined
...
</script>

main1.js 正确执行。导入的变量 a、b 和 c 具有预期值。

main2.js 不会运行。我不需要或导入 c,所以我不包含传单 API。然而,加载仍然试图解决 c、can't 和失败。

为什么在没有特别要求的情况下检查 c?

什么是纯 JavaScript 解决方法/解决方案? (我尝试在 main2.js 中从 leaflet.js 导入 L 但没有成功)

研究表明 NodeJS 或 CommonJS 环境提供了解决方案,但我想要一个纯模块/导入/导出解决方案。

【问题讨论】:

  • 所以这里的问题是您如何导入/加载 Leaflet 代码。

标签: javascript import module leaflet export


【解决方案1】:

当你导入某些东西时会发生这种情况 -

  1. 从 './library.js' 导入 {a, b}
  2. 在当前目录中找到“library.js”
  3. 执行“library.js”中的所有代码
  4. 仅当您执行第 3 步时,编译器才会知道从“library.js”返回和公开的内容
  5. 虽然有一个 tree-shaking 的概念,它会删除无用的导出以减小包大小,这适用于静态导入。
  6. 为自己验证在“library.js”中添加一些“控制台日志”,您可以在导入“library.js”时看到这些日志被执行
  7. 因此,当 'library.js' 执行时,它还需要对 var c 进行评估和赋值,因此正在执行传单 API

我能想到的解决方案 -

  1. 设 var c, 是调用传单 API 的函数,而不是函数调用。
  2. 将 a、b 放在一个文件中,将 c 放在另一个文件中。

参考-

  1. https://developers.google.com/web/fundamentals/performance/optimizing-javascript/tree-shaking
  2. https://exploringjs.com/es6/ch_modules.html#_benefit-dead-code-elimination-during-bundling
  3. https://javascript.info/import-export

【讨论】:

  • Tree Shaking 确实适用于静态导入,但与 OP 的情况无关的一点是,它是作为构建步骤的一部分执行的(类似于开发编译),而不是在脚本加载为type="module".
  • 库尔斯明白了。我同意你的观点,我认为在 HTML 中使用
  • 感谢您的宝贵回复。我不知道 3. 这是我问题的根源。我考虑了您的解决方案 2。但我专注于维护单个库/模块。我尝试了解决方案 1。最后我测试了传单脚本是否已加载 {var EXTENT = (typeof window.L != 'undefined') ?真假;}。然后,对于受影响的函数和变量,运行一个自执行匿名函数,如果 EXTENT 为假,则返回 null,如果为真,则返回(传单)结果。感谢您的提示。问题解决了,编码员很开心。
  • @Crow 请确保接受对您有帮助的答案。它还向其他人表明您的问题已解决。
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
相关资源
最近更新 更多