【问题标题】:Can I build a production JavaScript web application without a bundler?我可以在没有捆绑器的情况下构建生产 JavaScript Web 应用程序吗?
【发布时间】:2020-12-07 04:21:21
【问题描述】:

我最近钻研了学习 JavaScript 模块化编程的兔子洞,包括一些 JS 模块系统、捆绑器和 ES2015 模块的历史。我现在了解捆绑程序帮助/减轻的一些痛苦,例如:

  • 网络延迟(更有效地缓存单个捆绑包,HTTP/1.0 连接),
  • 应用模块大小的性能限制(缩小、摇树),
  • ES2015 不支持某些功能(裸导入),
  • 以及与旧模块系统的向后兼容性(ES2015 模块语法的转换)。

但是我想知道是否有可能在 2020 年创建一个不使用像 webpackParcel 之类的捆绑器并使用ES2015 模块?需要注意的是,仍然可以使用像 Babel 这样的源到源编译器,只要它保留 ES2015 模块语法。我不是说我想这样做,而是为了争论,有什么缺点?

【问题讨论】:

  • 您是指在浏览器中运行的 Javascript 还是在 node.js 中在服务器上运行的 Javascript 或两者兼而有之?任何服务器端代码都不需要捆绑器。
  • 客户端代码在现代浏览器中运行时不必捆绑,但如果您要将代码设计成大量的小模块(为了开发效率和重用) ,那么如果不使用可以减少需要加载的单独文件数量的捆绑器,加载效率将非常低。除此之外,我不确定您还想在这里问什么。
  • @jfriend00 是的,感谢您的澄清,我的意思是在浏览器中运行的 JavaScript。我只是在阅读this article 并将<script type="module">import _ from 'https://unpkg.com/lodash-es'</script> 添加到我的index.html 以查看网络请求瀑布。所以我的理解是,由于 JS 是一种通过 HTTP 交付的 JIT 编译语言,捆绑器可以被视为“JS SDK”的一部分吗?至少在 HTTP 可以更有效地交付 JS 模块之前?
  • 如果您设计客户端 JS 文件以实现最佳模块化开发并且因此不设计客户端 JS 文件以实现高效交付,那么捆绑器将是可取的。 “JS SDK 的一部分”是术语和观点的问题,而不是事实,所以我不会真正评论这个断言。当然可以从一开始就设计客户端 JS 文件以实现高效的客户端交付,而不使用捆绑器(就像我们过去所做的那样),但是您将无法同时设计文件的布局以进行模块化开发.捆绑器可让您实现这两个目标。
  • @jfriend00 “捆绑器可以让您同时实现这两个目标” - 谢谢,这是有道理的。

标签: javascript webpack ecmascript-6 module parceljs


【解决方案1】:

客户端代码在现代浏览器中运行时不必捆绑,但如果您要将代码设计成大量的小模块(为了开发效率和重用),那么它将是如果您不使用可以减少需要加载的单独文件数量的捆绑程序,则加载效率非常低。

如果您设计客户端 JS 文件以实现最佳模块化开发,那么捆绑器将是可取的,因此不要将客户端 JS 文件设计为高效交付,因为捆绑器可以将内容捆绑在一起以在构建过程中高效交付。

“JS SDK 的一部分”是术语和观点的问题,而不是事实,所以我不会真正评论这个断言。

当然可以从一开始就设计客户端 JS 文件以实现高效的客户端交付,而不使用捆绑器(就像我们以前那样),但您将无法同时设计文件的布局用于模块化开发。捆绑器可让您实现这两个目标,这可能就是它们如此受欢迎的原因。

但是我想知道是否有可能在 2020 年创建一个不使用 webpack 或 Parcel 之类的捆绑器并使用 ES2015 模块的生产 JS Web 应用程序?

是的,如果您在支持importexport 的浏览器中运行,则可以不使用捆绑程序。

我并不是说我想这样做,而是为了争论,有什么缺点?

如上所述,您要么放弃高效的客户端加载,要么放弃理想的模块化设计,因为两者的设计参数存在冲突。

【讨论】:

    猜你喜欢
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多