javascript - ES6 导入重复项?

标签 javascript module webpack ecmascript-6

我试图让我的代码(服务器端和客户端)尽可能模块化,这需要大量的导入和导出,但是我有一个悬而未决的问题。

我试着从这里搜索,阅读了热门博客文章,甚至看了一些 YT 视频,但仍然没有完全解释清楚。我很想避免现在犯这个错误,并避免以后重写我的逻辑。


文件1

import React from 'react';

// do something

文件2

import React from 'react';

// do something else

文件3

import File1 from './file1';
import File2 from './file2';

// do something with both

  • 它够聪明吗?我可以导入相同的吗 我想要多少个模块,它只导入一次?
  • 如果我也需要import ReactFile3 怎么办?它是否仍然足够聪明来处理这种情况?

我正在使用 Node、Babel 和 Webpack。

最佳答案

当您通过 Node(以及扩展名为 Webpack,因为它在模块解析方面有效地遵循相同的规则)导入模块时,文件中的代码将执行一次,然后缓存生成的导出。这意味着在您的两个文件中,React 将是对同一对象的引用。所以实际上你的假设是正确的 - Webpack 确实足够聪明,不会在你每次导入时都执行 React 的完整源代码文件。

您可以很容易地自行测试 - 将 console.log() 添加到在您的应用程序的多个位置导入的模块(确保它不在函数或任何其他可能会推迟执行)。您会看到日志只发生一次,而不是每次导入一次!

更新:另外值得注意的是 the spec for ES2015 modules有效地将此列为任何实现的要求:

This operation must be idempotent if it completes normally. Each time it is called with a specific referencingModule, specifier pair as arguments it must return the same Module Record instance.

关于javascript - ES6 导入重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37459565/

相关文章:

javascript - $q.reject 和处理 AngularJS 链式 promise 中的错误

typescript - 我应该如何从包中导出多组类/接口(interface)

javascript - 对于使用 JavaScript ES6 模块和类的应用程序,是否仍然需要模块加载器?

javascript - 如何在 javascript 字符串文字中使用 `onclick`

webpack - Font Awesome 字体文件未从 SW6 中的自定义主题加载

javascript - $lookup 返回空数组

javascript - Magento 2 如何应用 jquery 获取结帐页面中的输入文本值?

javascript - 将鼠标悬停在 div 上时,多个图像取决于鼠标位置

javascript - 我可以在保存之前使用 webpack Hook 来修改文件输出吗?

webpack - 在 .Net Core 3.0 中使用水疗服务?