为什么import语句中的fromClause需要字符串文字?

时间:2017-03-19 12:43:18

标签: javascript node.js ecmascript-6

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

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

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

根据这种经验,在我们当前的node.js应用程序(基于ES6)中,虽然我不确定我们是否会对代码进行模糊处理,但我并不想使用相对路径。因此,我在每个文件中创建了一个const ROOTDIR,并为其分配了项目的绝对路径。然后意识到 import 只需要静态文字,其中 fromClause 。通过强制为每个导入键入(复制/粘贴)完整路径或使用相对路径返回或使用 require 语句,这会使生活变得困难。

enter image description here

虽然我试图了解使用 import 样式的好处,但我需要一些帮助来理解以下3点。

  1. 除了类似java / .net的编码风格外,使用 import 有什么好处?

  2. 为什么 import 只接受字符串文字?它似乎是设计的,如果是的话,为什么?

  3. 如果我想基于某些条件导入模块,我将不得不去 require ,因为我无法使用 if / else switch 语句中的 import 。有什么解决方案/黑客吗?

  4. 感谢所有帮助。

2 个答案:

答案 0 :(得分:1)

首先,请记住任何环境目前都不支持std::string remaining_after_delete_repeatedly(std::string s, std::string t) { std::vector<int> prefix = make_prefix(t); s += "#"; std::vector<int> prev(s.length()); std::vector<int> jv(s.length()); for (int i = 0; i < s.length(); prev[i] = i - 1, ++i); for (int i = 0, j = 0; i < s.length(); ) { if (s[i] == t[j]) { jv[i] = j; ++i; ++j; } else if (j > 0) j = prefix[j - 1]; else jv[i++] = 0; if (j == (int)t.length()) { int u = i - 1; for (int k = 0; k < t.length(); ++k) u = prev[u]; prev[i] = u; j = u < 0 ? 0 : jv[u] + 1; } } std::string answer(1, s.back()); for (int i = prev[s.length() - 1]; i > -1; i = prev[i]) answer += s[i]; std::reverse(answer.begin(), answer.end()); return answer.substr(0, answer.length() - 1); } ,包括Node.js.因此,您可能会使用像Babel这样的转换器,它将采用CommonJS环境(例如Node)并使用import填充。

require不同,

import旨在进行静态分析。也就是说,您的代码可以在不运行的情况下进行分析,并且可以告诉您需要加载哪些模块。

这意味着:

  1. require声明已悬挂。无论它们在何处被声明,它们实际上都存在于文件的最顶层。
  2. 将它们放入块中是无效的。
  3. 因此将它们置于条件限制中无效。
  4. import语句之前的文件中不能存在任何内容,因此无法使用任何变量(包括常量),因为在运行import语句时它们不存在。
  5. 由于可以静态分析代码,因此将来可以简化捆绑代码的过程。可以确切地确定需要包含哪些代码,这意味着可以更轻松地编译代码以便分发。例如,如果浏览器请求具有import语句的JS文件,则服务器可以看到此文件并将它们打包在一起。这还有很长的路要走,但很可能是未来!

答案 1 :(得分:0)

format()import之间的主要区别在于,使用导入时,您有静态依赖项,当浏览器解析代码时,浏览器会解析这些依赖项,而使用require时,你有动态依赖关系,当Node.js 运行你的代码时解析。

静态导入的优点是JavaScript引擎可以更轻松地优化代码。例如,webpack使用它来从导入的模块中删除不需要创建较小的包(称为树抖动)的代码。

正如您所指出的,其缺点是您不能在“from”之后使用动态表达式,因为这只能在运行时解决。所以这确实是设计的。

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