子路径在import语句的上下文中意味着什么?

时间:2018-03-21 21:53:16

标签: javascript npm import ecmascript-6

假设我有这样的陈述:

import * as bar from 'foo/bar';

我有几个问题:

  • /bar位是什么意思?
  • 这是否有一个特定的(google-able)术语?
  • 这是否能提高效率(减少模块膨胀)?
  • 如何在NPM上捆绑common-js模块(理想情况下使用Rollup)并支持此语法?

1 个答案:

答案 0 :(得分:1)

打破它:

首先为第一和第二个问题提供背景,让我们进一步分解该陈述的所有部分:

  

import * as quux from 'foo/bar';

注意:您的示例中的第一个bar实例已故意更改为quux以消除以下几点的歧义。

  1. 统称为 导入声明 ,或更具体地说; ECMA-262 Imports Syntax Specification中定义的 导入声明

  2. import部分称为 导入关键字

  3. * as quux部分称为 NameSpace导入

    • 星号*表示bar中所有导出的绑定都将导入到新创建的名为quux的命名空间对象中。结果是quux对象将保留bar所有导出的成员。
    • quux部分被称为 导入的绑定 ,如前所述,它被用作新创建的命名空间对象的名称
  4. from 'foo/bar'部分称为 From Clause

    • foo/bar部分是 String Literal ,被称为 模块说明符 ...它只是一个文件路径
  5. 您特定问题的答案:

    1.   

      /bar位是什么意思?

      它是 模块说明符 的一部分,它是 From Clause 的一部分。它只是对将从中导入导出成员的文件名的引用。在此示例中,其导出的成员将导入名为quux的新名称空间对象。

      关于什么是实际的“part”被调用; ECMA-262没有为它提供具体的参考/名称,但是,我将该部分称为文件名; (即要导入的模块的文件路径中的文件名)

      据我所知,/bar可能需要也可能不需要包含文件扩展名(即/bar.js)。同样, ECMA-262 Imports Syntax 中没有任何内容强制执行此操作。 ECMAScript仅定义模块的语法,而不是加载它们的特定机制。因此,有或没有.js后缀的要求可能因实施而异。例如:

      • 在Apple最新的基于WebKit构建的Safari浏览器中,在iOS上运行时,必须包含.js后缀。
      • Modules docs for Node v8.10.0中,他们的示例中包含导入文件的.js文件扩展名。 注意:由于ES6模块目前有Stability Index 2,因此可能会发生变化。
    2.   

      是否有针对此的特定(google-able)术语?

      非本身,因为ECMA没有具体命名。你可以尝试用谷歌搜索我之前提到的一些术语/术语。

    3.   

      这是否能提高效率(减少模块膨胀)?

      我不确定我完全明白“module bloat”的含义。但是,如果您的意思是它会导致应用程序代码中的模块更少?我认为不是,它更可能导致模块的使用增加。

      原生 ES6模块支持中获得效率提升。它本身的支持本质上可以带来速度/性能提升。 ES6模块的其他好处是:

      • ES6模块具有静态可分析性,允许通过名为 Tree Shaking 的进程消除死/未使用的代码。更多信息herehere。那么,如果你的意思是“模块臃肿”这个词 - 那么是的;执行 Tree Shaking 的工具将删除未使用/死代码。

        <强>买者;我不是100%肯定在 NameSpace Import 中使用通配符/星号(*)时,执行 Tree Shaking 的工具是否能够删除死代码。导入您将使用的特定成员,即 MAY ,即

        import { foo, bar, quux } from './foo/bar.js';
        
      • 这是ECMAScript的官方标准。

      • 您提供的示例包含 NameSpace Import ,因此还有另一个好处 - 它有助于避免命名空间冲突。

      • 提到了更多好处here

    4.   

      如何在NPM上捆绑common-js模块(理想情况下是Rollup)并支持这种语法?

      Rollup使用一个名为rollup-plugin-commonjs的插件,它将CommonJS模块转换为ES6,因此它们可以包含在Rollup包中。