JavaScript-使用ES*模块优化下载时间

JavaScript-使用ES*模块优化下载时间,javascript,ecmascript-6,Javascript,Ecmascript 6,我想知道在使用ES2015模块时如何包括模块,以及如何优化模块以获得最佳下载体验。这个问题比较了代码组织的两种策略 关于这个问题留下的第一条评论,这是指将两个场景与本机ES模块进行比较,但也欢迎回答与捆绑/缩小工具相关的问题 场景1-单个文件 foobar.js program.js 场景2-多个文件 foo.js bar.js program.js 在场景1中,Foo和Bar都在foobar.js中声明,而在场景2中,它们都在单独的文件中。program.js在任何一种情况下都只导入Foo。我

我想知道在使用ES2015模块时如何包括模块,以及如何优化模块以获得最佳下载体验。这个问题比较了代码组织的两种策略

关于这个问题留下的第一条评论,这是指将两个场景与本机ES模块进行比较,但也欢迎回答与捆绑/缩小工具相关的问题

场景1-单个文件 foobar.js

program.js

场景2-多个文件 foo.js

bar.js

program.js

在场景1中,
Foo
Bar
都在foobar.js中声明,而在场景2中,它们都在单独的文件中。program.js在任何一种情况下都只导入
Foo
。我想知道的是,当一个文件中有多个导出时,是否需要为整个文件提供服务以实现导入语句,如果是这种情况,是否最好将每个声明保存在自己的文件中以减少下载大小


另外,处理网上导入的最佳实践是什么?有哪些工具可以帮助简化此过程?

这实际上取决于捆绑包商。如果您的绑定器支持树抖动(like和does),那么两者将提供相同的输出

情景1: 看。您会发现,由于树摇晃,
已经在最后一个捆绑包中剥离。但您必须记住,它只适用于ES6模块,而不适用于CommonJS模块。因此,请确保您正在为此功能导入ES6版本。Webpack和Rollup处理这个问题的方式略有不同

Webpack:它实际上通过从生成的捆绑包中删除module.exports来生成
Bar
死代码。在它上运行uglify时,该部分代码将被删除。因此,在这里您需要uglifier来删除未使用的代码

Rollup:通过Rollup后,死代码将立即被删除。这就是为什么许多流行的库已经转向汇总以进行捆绑的原因

情景2: 您已经获得了优化的输出


因此,在这两种情况下,只要工具和设置正确,您可以获得相同的优化结果。

这实际上取决于捆绑机。如果您的绑定器支持树抖动(like和does),那么两者将提供相同的输出

情景1: 看。您会发现,由于树摇晃,
已经在最后一个捆绑包中剥离。但您必须记住,它只适用于ES6模块,而不适用于CommonJS模块。因此,请确保您正在为此功能导入ES6版本。Webpack和Rollup处理这个问题的方式略有不同

Webpack:它实际上通过从生成的捆绑包中删除module.exports来生成
Bar
死代码。在它上运行uglify时,该部分代码将被删除。因此,在这里您需要uglifier来删除未使用的代码

Rollup:通过Rollup后,死代码将立即被删除。这就是为什么许多流行的库已经转向汇总以进行捆绑的原因

情景2: 您已经获得了优化的输出


因此,在这两种情况下,只要您的工具和设置正确,您都可以得到相同的优化结果。

不清楚您是指捆绑工具中的本机ES模块还是它们的实现。@estus我在文章顶部添加了另一条语句来澄清这一点。这取决于“下载体验”指的是什么。对于高速,它通常是捆绑的(您可以完全控制Web包中的各个块)。对于低流量使用,它是本地的,有一堆文件(不包括本地模块没有太多支持的事实)-无法部分下载一个文件以提供一个导出并放弃另一个导出。@estus下载体验指的是高速。比如说,我有一个js文件,其中包含1MB的javascript,包含在100个导出类中,我只想在特定场景中使用其中一个。整个1MB(捆绑/缩小除外)是否必须下载,或者我正在导入的类是否以某种方式仅请求所需的代码?如果代码没有在其他任何地方使用,则可以在汇总或Webpack中通过树抖动将其丢弃。如果某些代码在特定位置使用,则捆绑的文件可以分为多个部分。1MB在缩小和压缩时要小得多。IRL一个大的JS文件通常胜过一堆小文件(HTTP/2服务器和浏览器可能会有例外)。不清楚您是指捆绑工具中的本机ES模块还是它们的实现。@estus我在文章顶部添加了另一个声明来澄清这一点。这取决于“下载体验”指的是什么。对于高速,它通常是捆绑的(您可以完全控制Web包中的各个块)。对于低流量使用,它是本地的,有一堆文件(不包括本地模块没有太多支持的事实)-无法部分下载一个文件以提供一个导出并放弃另一个导出。@estus下载体验指的是高速。比如说,我有一个js文件,其中包含1MB的javascript,包含在100个导出类中,我只想在特定场景中使用其中一个。整个1MB(捆绑/缩小除外)是否必须下载,或者我正在导入的类是否以某种方式仅请求所需的代码?如果代码没有在其他任何地方使用,则可以在汇总或Webpack中通过树抖动将其丢弃。如果某些代码在特定位置使用,则捆绑的文件可以分为多个部分。1MB在缩小和压缩时要小得多。IRL一个大的JS文件通常胜过一群小文件(HTTP/2服务器和浏览器可能有例外)。
export class Foo {
    constructor(message) {
        alert(message);
    }
}

export class Bar {
    constructor(message) {
        console.log(message);
    }
}
import { Foo } from "foobar.js";

class Program {
    constructor() {
        this.greeter = new Foo("hello world");
    }
}
export class Foo {
    constructor(message) {
        alert(message);
    }
}
export class Bar {
    constructor(message) {
        console.log(message);
    }
}
import { Foo } from "foo.js";

class Program {
    constructor() {
        this.greeter = new Foo("hello world");
    }
}