Javascript 在导入语句的上下文中,子路径意味着什么?

Javascript 在导入语句的上下文中,子路径意味着什么?,javascript,npm,import,ecmascript-6,Javascript,Npm,Import,Ecmascript 6,假设我有这样一句话: import * as bar from 'foo/bar'; 我有几个问题: /bar位是什么意思 有没有一个专门的(谷歌的)术语来形容这个 这是否能提高效率(减少模块膨胀) 如何在NPM上绑定一个公共js模块(最好是使用Rollup)并支持这种语法 将其分解: 首先,为了给你的第一个和第二个问题提供背景,让我们更进一步,把陈述的所有部分都分解一下: 从'foo/bar'导入*为quux 注意:您的示例中的第一个bar实例已被故意更改为qux,以消除以下几点的歧义 它

假设我有这样一句话:

import * as bar from 'foo/bar';
我有几个问题:

  • /bar
    位是什么意思
  • 有没有一个专门的(谷歌的)术语来形容这个
  • 这是否能提高效率(减少模块膨胀)
  • 如何在NPM上绑定一个公共js模块(最好是使用Rollup)并支持这种语法
将其分解: 首先,为了给你的第一个和第二个问题提供背景,让我们更进一步,把陈述的所有部分都分解一下:

从'foo/bar'导入*为quux

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

  • 它统称为导入语句,或者更具体地说是导入语句;如中所定义的导入声明

  • 导入部分被称为导入关键字

  • *as qux
    部分称为名称空间导入

    • 星号
      *
      表示
      栏中所有导出的绑定都将导入到新创建的名为
      qux
      的命名空间对象中。结果是
      qux
      对象将保存
      bar
      中导出的所有成员
    • 其中的
      qux
      部分称为导入的绑定,如前所述,它被用作新创建的命名空间对象的名称
  • 来自“foo/bar”的
    部分称为来自子句

    • foo/bar
      部分是字符串文本,被称为模块说明符。。。它只是一个文件路径

  • 回答您的具体问题:
  • /bar
    位是什么意思

    它是模块说明符的一部分,模块说明符是From子句的一部分。它只是对其导出成员将从中导入的文件名的引用。在本例中,其导出的成员将被导入名为
    qux
    的新命名空间对象中

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

    据我所知,
    /bar
    可能需要也可能不需要包含文件扩展名(即
    /bar.js
    )。同样,ECMA-262导入语法中没有强制执行这一点的内容。ECMAScript只定义模块的语法,而不定义加载模块的特定机制。因此,每个实现对带或不带
    .js
    后缀的要求可能会有所不同。例如:

    • 苹果最新的Safari浏览器基于运行在iOS上的WebKit,必须包含
      .js
      后缀
    • 在节点v8.10.0中,它们的示例中包含导入文件的
      .js
      文件扩展名。注意:由于ES6模块目前有一个新的版本,这可能会改变
  • 有没有一个专门的(谷歌的)术语

    本身并没有,因为ECMA并没有具体地命名它。你可以用谷歌搜索我前面提到的一些术语

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

    我不确定我是否完全理解你所说的“模块膨胀”是什么意思。然而,如果您的意思是,它会导致应用程序代码中的模块减少吗?我认为不是,这更有可能导致模块的使用增加

    本机ES6模块支持将提高效率。本机支持本质上可以提高速度/性能。ES6模块的其他好处包括:

    • ES6模块可静态分析,允许通过名为树抖动的过程消除死代码/未使用的代码。更多信息和信息。所以,如果这就是你所说的“模块膨胀”的意思——那么是的;未使用/失效代码将通过执行树抖动的工具删除

      警告;在命名空间导入中使用通配符/星号(
      *
      )时,我不能100%确定执行树震动的工具是否能够删除死代码。可能需要导入您将使用的特定成员,即

      从'/foo/bar.js'导入{foo,bar,qux};
      
    • 这是官方的ECMAScript标准

    • 您给出的示例包括名称空间导入,因此还有另一个好处—它将有助于避免名称空间冲突

    • 还提到了更多的好处

  • 如何在NPM上绑定一个公共js模块(最好是使用Rollup)并支持这种语法

    使用一个名为的插件,该插件将CommonJS模块转换为ES6,因此它们可以包含在汇总包中


  • 谢谢你的全面回答。我在这里特别询问了
    import*
    ,感谢你指出了这个链接——尽管从那篇文章的答案来看,似乎有些“摇树者”在使用名称空间导入时能够检测并删除死代码,但这并不是决定性的。知道这一点很有用!关于NPM的澄清:如果我在NPM模块
    foo
    中发送了一个额外的文件
    bar.js
    ,那么导入'foo/bar.js'会获取该文件吗