【问题标题】:Babel and Browserify / Webpack confusionBabel 和 Browserify / Webpack 混淆
【发布时间】:2017-02-16 14:32:31
【问题描述】:

快速提问。我对 ES2015(ES6) 有点困惑。

假设我使用 Babel 将 ES6 Javascript 编译为适用于当前浏览器的 ES5。

import/export 函数已经在 ES6 中通过使用 Babel 可用。那么,如果我只是简单地使用它们来捆绑我的模块,我为什么需要像 BrowserifyWebpack 这样的东西,而 ES6 可以为我做呢?

无论我走到哪里,我都会看到人们将 Babel 与 Browserify 或 Webpack 结合使用。虽然我知道像 Webpack 这样的东西可以用得更多,但我想知道是否也可以使用 ES6 语法打包文件。

我在这里可能完全错了,我可能迷失在 2016 年的 Javascript 丛林中,所以我希望有人可以为我澄清这一点。

编辑

我是否可以假设原生 ES6 导入/导出功能根本不捆绑文件?从我目前所读的内容来看,我认为您仍然需要包含所有单独的 Javascript 文件,但是您只需使用本机导入功能将模块导入到彼此命名空间中?

【问题讨论】:

    标签: javascript ecmascript-6


    【解决方案1】:

    Pre-ES6 没有原生模块系统,因此有多个系统是用用户态代码构建的(例如 CommonJS / Node 模块和 AMD)。这些就是 Babel 将 ES6 模块语法转换为的内容(是的,你说得对,ES6 模块语法无论如何都没有原生捆绑故事)。浏览器不了解这些用户态 API。 Node通过在注入require()等的函数中包装一个“模块”来实现其模块系统。在浏览器中require()只是一个引用错误。 Browserify(或其他捆绑器)使其在浏览器中工作,并将整个依赖关系图捆绑到单个脚本中。因此,如果代码适用于浏览器,您可能会想要捆绑它。如果是 Node,则可能不需要。

    导入/导出函数

    不是函数,而是声明。

    如果我只是简单地使用这些来捆绑我的模块,那么 ES6 什么时候可以为我做呢?

    我想知道是否也可以使用 ES6 语法捆绑文件。

    我是否可以假设原生 ES6 导入/导出功能根本不捆绑文件?

    是的。没有原生的方式来捆绑 ES6 模块。您可以将 ES6 模块语法转换为 Node 模块之类的东西并捆绑它们。

    从我目前阅读的内容来看,我认为您仍然需要包含所有单独的 Javascript 文件,但您只需使用本机导入功能将模块导入到彼此命名空间中?

    重要的是要认识到,虽然语法是标准化的,但很多行为却不是。有一个 Loader 规范正在开发中,用于指定模块的实际定位和加载方式。

    另见https://stackoverflow.com/a/33044085/1034448

    【讨论】:

      【解决方案2】:

      是的,使用 babel 将 ES6 导入转换为 ES5 可以。

      但是,使用 webpack 的一个优点是可以创建一个静态文件以在您的生产环境中提供服务。

      【讨论】:

      • 那么原生的 ES6 导入导出功能是如何工作的呢?据我了解,它的作用类似于捆绑器,它将模块导入到 Javascript 文件中,允许我访问导出的值。随着另一个答案被删除,我现在完全糊涂了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多