为什么fromClause在import语句期望string文字?

在我们之前的node.js应用程序(基于ES5)中,我们努力在require语句中使用相对path。

例如: var conf = require('../../global/config');

相对path的问题在代码混淆中冒出来了。 我们不得不花费相当多的时间来处理这个问题。

有了这样的经验,在我们当前的node.js应用程序(基于ES6),虽然我不知道我们是否会混淆代码或不我不想使用相对path。 因此,我在每个文件中创build了一个const ROOTDIR,并为其指定了项目的绝对path。 然后意识到导入期望只有静态文字从它的。 通过强制键入(复制/粘贴)每个导入的完整path或使用相对path返回,或使用require语句,这会使生活变得困难。

在这里输入图像说明

虽然我想了解使用导入风格的好处,但在理解以下3点方面需要一些帮助。

  1. 除了类似的java / .net编码风格之外,还有什么优点呢?

  2. 为什么导入只接受string文字? 这似乎是devise,如果是这样,为什么?

  3. 如果我想根据某些条件导入一个模块,那么我将不得不去执行require,因为我不能在if / elseswitch语句中使用import 。 有没有解决scheme/破解?

感谢所有的帮助。

首先,请记住,任何环境都不支持import ,包括Node.js. 所以你可能会使用一个像Babel这样的转译器,它将承担一个CommonJS环境(比如Node),并使用require来填充。

import ,而不是require被devise为静态分析。 也就是说,您的代码可以在不运行的情况进行分析并且可以指出需要加载的模块。

这意味着:

  1. import申报已悬挂。 无论它们在哪里宣布,它们都实际存在于文件的最顶端。
  2. 因此把它们放在块中是无效的。
  3. 因此将它们置于条件中是无效的。
  4. import语句之前,文件中没有任何东西可以存在,所以不可能使用任何variables(包括常量),因为在import语句运行时它们不会存在。

由于代码可以进行静态分析,这将在未来缓解捆绑代码的过程。 可以确定需要包含哪些代码,这将意味着您的代码可以更容易地编译为分发。 例如,如果浏览器请求具有import语句的JS文件,则服务器可以看到并将它们打包在一起。 这是一个很长的路要走,但它很可能是未来!

importrequire之间的主要区别在于,导入时,静态依赖关系由浏览器在parsing代码时parsing ,而在require中则有dynamic依赖关系,当Node.js 运行代码时会parsing这些依赖关系。

静态导入的优点是JavaScript代码更易于优化。 例如webpack使用它来从导入的模块中删除代码,这些模块不需要创build一个较小的包(称为树抖动)。

正如你所指出的那样,这个缺点是你不能在“from”之后使用dynamicexpression式,因为这只能在运行时解决。 所以这确实是由devise。

周围没有“黑客”,如果你必须有一个在运行时解决的dynamic依赖,你需要使用“require”。